From 4f802a86ba0cf79ed571ec3b25ca3f445d4627d9 Mon Sep 17 00:00:00 2001 From: Anton Krotov Date: Sun, 6 Oct 2019 17:55:12 +0000 Subject: [PATCH] oberon07: update (v1.13) git-svn-id: svn://kolibrios.org@7696 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/oberon07/Compiler.kex | Bin 254941 -> 64135 bytes programs/develop/oberon07/Docs/About1251.txt | 46 +- programs/develop/oberon07/Docs/About866.txt | 46 +- programs/develop/oberon07/Docs/KOSLib1251.txt | 776 +++++++++--------- programs/develop/oberon07/Docs/KOSLib866.txt | 776 +++++++++--------- .../develop/oberon07/Lib/KolibriOS/API.ob07 | 8 +- .../develop/oberon07/Lib/KolibriOS/Args.ob07 | 4 +- .../oberon07/Lib/KolibriOS/ColorDlg.ob07 | 4 +- .../oberon07/Lib/KolibriOS/Console.ob07 | 2 +- .../oberon07/Lib/KolibriOS/ConsoleLib.ob07 | 4 +- .../oberon07/Lib/KolibriOS/DateTime.ob07 | 4 +- .../develop/oberon07/Lib/KolibriOS/Debug.ob07 | 4 +- .../develop/oberon07/Lib/KolibriOS/File.ob07 | 4 +- .../develop/oberon07/Lib/KolibriOS/HOST.ob07 | 8 +- .../develop/oberon07/Lib/KolibriOS/In.ob07 | 2 +- .../oberon07/Lib/KolibriOS/KOSAPI.ob07 | 6 +- .../develop/oberon07/Lib/KolibriOS/Math.ob07 | 4 +- .../oberon07/Lib/KolibriOS/NetDevices.ob07 | 4 +- .../oberon07/Lib/KolibriOS/OpenDlg.ob07 | 4 +- .../develop/oberon07/Lib/KolibriOS/Out.ob07 | 4 +- .../develop/oberon07/Lib/KolibriOS/RTL.ob07 | 300 ++++--- .../oberon07/Lib/KolibriOS/RasterWorks.ob07 | 4 +- .../develop/oberon07/Lib/KolibriOS/Read.ob07 | 10 +- .../KolibriOS/UnixTime.ob07} | 8 +- .../oberon07/Lib/KolibriOS/Vector.ob07 | 4 +- .../develop/oberon07/Lib/KolibriOS/Write.ob07 | 10 +- .../oberon07/Lib/KolibriOS/kfonts.ob07 | 4 +- .../oberon07/Lib/KolibriOS/libimg.ob07 | 4 +- .../develop/oberon07/Lib/Linux32/API.ob07 | 16 +- .../develop/oberon07/Lib/Linux32/HOST.ob07 | 20 +- .../develop/oberon07/Lib/Linux32/LINAPI.ob07 | 22 +- .../develop/oberon07/Lib/Linux32/RTL.ob07 | 300 ++++--- .../develop/oberon07/Lib/Windows32/API.ob07 | 12 +- .../develop/oberon07/Lib/Windows32/HOST.ob07 | 14 +- .../develop/oberon07/Lib/Windows32/RTL.ob07 | 300 ++++--- .../develop/oberon07/Samples/Dialogs.ob07 | 2 +- programs/develop/oberon07/Samples/HW.ob07 | 2 +- programs/develop/oberon07/Samples/HW_con.ob07 | 14 +- programs/develop/oberon07/Source/AMD64.ob07 | 89 +- programs/develop/oberon07/Source/ARITH.ob07 | 46 +- .../develop/oberon07/Source/AVLTREES.ob07 | 6 +- programs/develop/oberon07/Source/BIN.ob07 | 6 +- .../develop/oberon07/Source/CHUNKLISTS.ob07 | 6 +- .../develop/oberon07/Source/COLLECTIONS.ob07 | 6 +- programs/develop/oberon07/Source/CONSOLE.ob07 | 6 +- .../develop/oberon07/Source/CONSTANTS.ob07 | 8 +- .../develop/oberon07/Source/Compiler.ob07 | 74 +- programs/develop/oberon07/Source/ELF.ob07 | 4 +- programs/develop/oberon07/Source/ERRORS.ob07 | 8 +- programs/develop/oberon07/Source/FILES.ob07 | 8 +- programs/develop/oberon07/Source/IL.ob07 | 97 +-- programs/develop/oberon07/Source/KOS.ob07 | 6 +- programs/develop/oberon07/Source/LISTS.ob07 | 6 +- programs/develop/oberon07/Source/MSCOFF.ob07 | 6 +- programs/develop/oberon07/Source/MSP430.ob07 | 30 +- .../develop/oberon07/Source/MSP430RTL.ob07 | 4 +- programs/develop/oberon07/Source/PARS.ob07 | 13 +- programs/develop/oberon07/Source/PATHS.ob07 | 6 +- programs/develop/oberon07/Source/PE32.ob07 | 22 +- programs/develop/oberon07/Source/PROG.ob07 | 68 +- programs/develop/oberon07/Source/REG.ob07 | 10 +- programs/develop/oberon07/Source/SCAN.ob07 | 165 ++-- .../develop/oberon07/Source/STATEMENTS.ob07 | 99 +-- programs/develop/oberon07/Source/STRINGS.ob07 | 6 +- programs/develop/oberon07/Source/TEXTDRV.ob07 | 28 +- programs/develop/oberon07/Source/UTILS.ob07 | 69 +- programs/develop/oberon07/Source/WRITER.ob07 | 6 +- programs/develop/oberon07/Source/X86.ob07 | 117 ++- 68 files changed, 1872 insertions(+), 1909 deletions(-) rename programs/develop/oberon07/{Source/UNIXTIME.ob07 => Lib/KolibriOS/UnixTime.ob07} (88%) diff --git a/programs/develop/oberon07/Compiler.kex b/programs/develop/oberon07/Compiler.kex index 4eaf1f48f95abd8f87881b4e768846c51a22af73..2720d5973e1bc9c78d7517272a898b05b474fa57 100644 GIT binary patch literal 64135 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 diff --git a/programs/develop/oberon07/Docs/About1251.txt b/programs/develop/oberon07/Docs/About1251.txt index 33172eaa37..3fe358fe05 100644 --- a/programs/develop/oberon07/Docs/About1251.txt +++ b/programs/develop/oberon07/Docs/About1251.txt @@ -9,8 +9,7 @@ UTF-8 - PE32, ELF MENUET01/MSCOFF. : 1) - 2) - 3) + 2) "console" - Windows console "gui" - Windows GUI "dll" - Windows DLL @@ -18,11 +17,14 @@ UTF-8 "obj" - KolibriOS DLL "elfexe" - Linux ELF-EXEC "elfso" - Linux ELF-SO - 4) - - -stk ( 2 ) - -base
- -ver ( obj) + 3) - + -out ; , + , + ( ) + -stk ( 2 , + 1 32 ) -nochk <"ptibcwra"> (. ) + -ver ( obj) -nochk : "p" - @@ -42,13 +44,13 @@ UTF-8 : - Compiler.exe "C:\example.ob07" "C:\example.exe" console -stk 1 - Compiler.exe "C:\example.ob07" "C:\example.dll" dll - Compiler.exe "C:\example.ob07" "C:\example.exe" gui -stk 4 - Compiler.exe "C:\example.ob07" "C:\example.exe" console -nochk pti - Compiler.kex "/tmp0/1/example.ob07" "/tmp0/1/example.kex" kos -stk 2 - Compiler.kex "/tmp0/1/example.ob07" "/tmp0/1/example.obj" obj -ver 2.7 - Compiler.exe "C:\example.ob07" "C:\example" elfexe + Compiler.exe "C:\example.ob07" console -out "C:\example.exe" -stk 1 + Compiler.exe "C:\example.ob07" dll -out "C:\example.dll" + Compiler.exe "C:\example.ob07" gui -out "C:\example.exe" -stk 4 + Compiler.exe "C:\example.ob07" console -out "C:\example.exe" -nochk pti + Compiler.kex "/tmp0/1/example.ob07" kos -out "/tmp0/1/example.kex" -stk 4 + Compiler.kex "/tmp0/1/example.ob07" obj -out "/tmp0/1/example.obj" -ver 2.7 + Compiler.exe "C:\example.ob07" elfexe -out "C:\example" -stk 1 -nochk a , 0, 1. KolibriOS, . @@ -166,24 +168,6 @@ UTF-8 : SYSTEM.CODE(08BH, 045H, 008H) (* mov eax, dword [ebp + 08h] *) - SYSTEM CARD16 (2 ). CARD16 - , . - CARD16 -> INTEGER INTEGER -> CARD16 -: - - PROCEDURE Card16ToInt (w: SYSTEM.CARD16): INTEGER; - VAR i: INTEGER; - BEGIN - SYSTEM.PUT(SYSTEM.ADR(i), w) - RETURN i - END Card16ToInt; - - PROCEDURE IntToCard16 (i: INTEGER): SYSTEM.CARD16; - VAR w: SYSTEM.CARD16; - BEGIN - SYSTEM.GET(SYSTEM.ADR(i), w) - RETURN w - END IntToCard16; SYSTEM . diff --git a/programs/develop/oberon07/Docs/About866.txt b/programs/develop/oberon07/Docs/About866.txt index b0147dc787..55dc8f9e0b 100644 --- a/programs/develop/oberon07/Docs/About866.txt +++ b/programs/develop/oberon07/Docs/About866.txt @@ -9,8 +9,7 @@ UTF-8 室 - ᯮ塞 䠩 ଠ PE32, ELF MENUET01/MSCOFF. ࠬ: 1) - 2) १饣 䠩 - 3) ⨯ ਫ ଠ + 2) ⨯ ਫ "console" - Windows console "gui" - Windows GUI "dll" - Windows DLL @@ -18,11 +17,14 @@ UTF-8 "obj" - KolibriOS DLL "elfexe" - Linux ELF-EXEC "elfso" - Linux ELF-SO - 4) 易⥫ ࠬ- - -stk ࠧ ( 㬮砭 2 ) - -base
㧪 ᯮ塞 䠩 - -ver ணࠬ (⮫쪮 obj) + 3) 易⥫ ࠬ- + -out १饣 䠩; 㬮砭, + ᮢ , 㣨 ७ + (ᮮ⢥ ⨯ ᯮ塞 䠩) + -stk ࠧ ( 㬮砭 2 , + ⨬ 1 32 ) -nochk <"ptibcwra"> ⪫ ஢ન 믮 (. ) + -ver ணࠬ (⮫쪮 obj) ࠬ -nochk ப ᨬ: "p" - 㪠⥫ @@ -42,13 +44,13 @@ UTF-8 ਬ: - Compiler.exe "C:\example.ob07" "C:\example.exe" console -stk 1 - Compiler.exe "C:\example.ob07" "C:\example.dll" dll - Compiler.exe "C:\example.ob07" "C:\example.exe" gui -stk 4 - Compiler.exe "C:\example.ob07" "C:\example.exe" console -nochk pti - Compiler.kex "/tmp0/1/example.ob07" "/tmp0/1/example.kex" kos -stk 2 - Compiler.kex "/tmp0/1/example.ob07" "/tmp0/1/example.obj" obj -ver 2.7 - Compiler.exe "C:\example.ob07" "C:\example" elfexe + Compiler.exe "C:\example.ob07" console -out "C:\example.exe" -stk 1 + Compiler.exe "C:\example.ob07" dll -out "C:\example.dll" + Compiler.exe "C:\example.ob07" gui -out "C:\example.exe" -stk 4 + Compiler.exe "C:\example.ob07" console -out "C:\example.exe" -nochk pti + Compiler.kex "/tmp0/1/example.ob07" kos -out "/tmp0/1/example.kex" -stk 4 + Compiler.kex "/tmp0/1/example.ob07" obj -out "/tmp0/1/example.obj" -ver 2.7 + Compiler.exe "C:\example.ob07" elfexe -out "C:\example" -stk 1 -nochk a 砥 ᯥ譮 樨, । 襭 0, 1. ࠡ KolibriOS, 襭 ।. @@ -166,24 +168,6 @@ UTF-8 ਬ: SYSTEM.CODE(08BH, 045H, 008H) (* mov eax, dword [ebp + 08h] *) - 㫥 SYSTEM । ⨯ CARD16 (2 ). ⨯ CARD16 -᪠  樨, ᪫祭 ᢠ. -८ࠧ CARD16 -> INTEGER INTEGER -> CARD16 ॠ -⠪: - - PROCEDURE Card16ToInt (w: SYSTEM.CARD16): INTEGER; - VAR i: INTEGER; - BEGIN - SYSTEM.PUT(SYSTEM.ADR(i), w) - RETURN i - END Card16ToInt; - - PROCEDURE IntToCard16 (i: INTEGER): SYSTEM.CARD16; - VAR w: SYSTEM.CARD16; - BEGIN - SYSTEM.GET(SYSTEM.ADR(i), w) - RETURN w - END IntToCard16; 㭪樨 ᥢ SYSTEM ᯮ짮 ⠭ ࠦ. diff --git a/programs/develop/oberon07/Docs/KOSLib1251.txt b/programs/develop/oberon07/Docs/KOSLib1251.txt index ea757d300c..985b4d0ccb 100644 --- a/programs/develop/oberon07/Docs/KOSLib1251.txt +++ b/programs/develop/oberon07/Docs/KOSLib1251.txt @@ -1,94 +1,94 @@ ============================================================================== - (KolibriOS) + (KolibriOS) ------------------------------------------------------------------------------ MODULE Out - - PROCEDURE Open - + PROCEDURE Open + - PROCEDURE Int(x, width: INTEGER) - x; - width - , + PROCEDURE Int(x, width: INTEGER) + x; + width - , - PROCEDURE Real(x: REAL; width: INTEGER) - x ; - width - , + PROCEDURE Real(x: REAL; width: INTEGER) + x ; + width - , - PROCEDURE Char(x: CHAR) - x + PROCEDURE Char(x: CHAR) + x - PROCEDURE FixReal(x: REAL; width, p: INTEGER) - x ; - width - , ; - p - + PROCEDURE FixReal(x: REAL; width, p: INTEGER) + x ; + width - , ; + p - - PROCEDURE Ln - + PROCEDURE Ln + - PROCEDURE String(s: ARRAY OF CHAR) - s + PROCEDURE String(s: ARRAY OF CHAR) + s ------------------------------------------------------------------------------ MODULE In - - VAR Done: BOOLEAN - TRUE - , FALSE + VAR Done: BOOLEAN + TRUE + , FALSE - PROCEDURE Open - , - Done TRUE + PROCEDURE Open + , + Done TRUE - PROCEDURE Int(VAR x: INTEGER) - INTEGER + PROCEDURE Int(VAR x: INTEGER) + INTEGER - PROCEDURE Char(VAR x: CHAR) - + PROCEDURE Char(VAR x: CHAR) + - PROCEDURE Real(VAR x: REAL) - REAL + PROCEDURE Real(VAR x: REAL) + REAL - PROCEDURE String(VAR s: ARRAY OF CHAR) - + PROCEDURE String(VAR s: ARRAY OF CHAR) + - PROCEDURE Ln - ENTER + PROCEDURE Ln + ENTER ------------------------------------------------------------------------------ MODULE Console - - CONST + CONST - + - Black = 0 Blue = 1 Green = 2 - Cyan = 3 Red = 4 Magenta = 5 - Brown = 6 LightGray = 7 DarkGray = 8 - LightBlue = 9 LightGreen = 10 LightCyan = 11 - LightRed = 12 LightMagenta = 13 Yellow = 14 - White = 15 + Black = 0 Blue = 1 Green = 2 + Cyan = 3 Red = 4 Magenta = 5 + Brown = 6 LightGray = 7 DarkGray = 8 + LightBlue = 9 LightGreen = 10 LightCyan = 11 + LightRed = 12 LightMagenta = 13 Yellow = 14 + White = 15 - PROCEDURE Cls - + PROCEDURE Cls + - PROCEDURE SetColor(FColor, BColor: INTEGER) - : FColor - , - BColor - , - - + PROCEDURE SetColor(FColor, BColor: INTEGER) + : FColor - , + BColor - , - + - PROCEDURE SetCursor(x, y: INTEGER) - (x, y) + PROCEDURE SetCursor(x, y: INTEGER) + (x, y) - PROCEDURE GetCursor(VAR x, y: INTEGER) - + PROCEDURE GetCursor(VAR x, y: INTEGER) + - PROCEDURE GetCursorX(): INTEGER - x- + PROCEDURE GetCursorX(): INTEGER + x- - PROCEDURE GetCursorY(): INTEGER - y- + PROCEDURE GetCursorY(): INTEGER + y- ------------------------------------------------------------------------------ MODULE ConsoleLib - console.obj @@ -96,469 +96,469 @@ MODULE ConsoleLib - ------------------------------------------------------------------------------ MODULE Math - - CONST + CONST - pi = 3.141592653589793E+00 - e = 2.718281828459045E+00 + pi = 3.141592653589793E+00 + e = 2.718281828459045E+00 - PROCEDURE IsNan(x: REAL): BOOLEAN - TRUE, x - + PROCEDURE IsNan(x: REAL): BOOLEAN + TRUE, x - - PROCEDURE IsInf(x: REAL): BOOLEAN - TRUE, x - + PROCEDURE IsInf(x: REAL): BOOLEAN + TRUE, x - - PROCEDURE sqrt(x: REAL): REAL - x + PROCEDURE sqrt(x: REAL): REAL + x - PROCEDURE exp(x: REAL): REAL - x + PROCEDURE exp(x: REAL): REAL + x - PROCEDURE ln(x: REAL): REAL - x + PROCEDURE ln(x: REAL): REAL + x - PROCEDURE sin(x: REAL): REAL - x + PROCEDURE sin(x: REAL): REAL + x - PROCEDURE cos(x: REAL): REAL - x + PROCEDURE cos(x: REAL): REAL + x - PROCEDURE tan(x: REAL): REAL - x + PROCEDURE tan(x: REAL): REAL + x - PROCEDURE arcsin(x: REAL): REAL - x + PROCEDURE arcsin(x: REAL): REAL + x - PROCEDURE arccos(x: REAL): REAL - x + PROCEDURE arccos(x: REAL): REAL + x - PROCEDURE arctan(x: REAL): REAL - x + PROCEDURE arctan(x: REAL): REAL + x - PROCEDURE arctan2(y, x: REAL): REAL - y/x + PROCEDURE arctan2(y, x: REAL): REAL + y/x - PROCEDURE power(base, exponent: REAL): REAL - base exponent + PROCEDURE power(base, exponent: REAL): REAL + base exponent - PROCEDURE log(base, x: REAL): REAL - x base + PROCEDURE log(base, x: REAL): REAL + x base - PROCEDURE sinh(x: REAL): REAL - x + PROCEDURE sinh(x: REAL): REAL + x - PROCEDURE cosh(x: REAL): REAL - x + PROCEDURE cosh(x: REAL): REAL + x - PROCEDURE tanh(x: REAL): REAL - x + PROCEDURE tanh(x: REAL): REAL + x - PROCEDURE arsinh(x: REAL): REAL - x + PROCEDURE arsinh(x: REAL): REAL + x - PROCEDURE arcosh(x: REAL): REAL - x + PROCEDURE arcosh(x: REAL): REAL + x - PROCEDURE artanh(x: REAL): REAL - x + PROCEDURE artanh(x: REAL): REAL + x - PROCEDURE round(x: REAL): REAL - x + PROCEDURE round(x: REAL): REAL + x - PROCEDURE frac(x: REAL): REAL; - x + PROCEDURE frac(x: REAL): REAL; + x - PROCEDURE floor(x: REAL): REAL - ( REAL), - x: floor(1.2) = 1.0 + PROCEDURE floor(x: REAL): REAL + ( REAL), + x: floor(1.2) = 1.0 - PROCEDURE ceil(x: REAL): REAL - ( REAL), - x: ceil(1.2) = 2.0 + PROCEDURE ceil(x: REAL): REAL + ( REAL), + x: ceil(1.2) = 2.0 - PROCEDURE sgn(x: REAL): INTEGER - x > 0 1 - x < 0 -1 - x = 0 0 + PROCEDURE sgn(x: REAL): INTEGER + x > 0 1 + x < 0 -1 + x = 0 0 - PROCEDURE fact(n: INTEGER): REAL - n + PROCEDURE fact(n: INTEGER): REAL + n ------------------------------------------------------------------------------ MODULE Debug - - Out + Out - PROCEDURE Open - + PROCEDURE Open + ------------------------------------------------------------------------------ MODULE File - - TYPE + TYPE - FNAME = ARRAY 520 OF CHAR + FNAME = ARRAY 520 OF CHAR - FS = POINTER TO rFS + FS = POINTER TO rFS - rFS = RECORD (* *) - subfunc, pos, hpos, bytes, buffer: INTEGER; - name: FNAME - END + rFS = RECORD (* *) + subfunc, pos, hpos, bytes, buffer: INTEGER; + name: FNAME + END - FD = POINTER TO rFD + FD = POINTER TO rFD - rFD = RECORD (* *) - attr: INTEGER; - ntyp: CHAR; - reserved: ARRAY 3 OF CHAR; - time_create, date_create, - time_access, date_access, - time_modif, date_modif, - size, hsize: INTEGER; - name: FNAME - END + rFD = RECORD (* *) + attr: INTEGER; + ntyp: CHAR; + reserved: ARRAY 3 OF CHAR; + time_create, date_create, + time_access, date_access, + time_modif, date_modif, + size, hsize: INTEGER; + name: FNAME + END - CONST + CONST - SEEK_BEG = 0 - SEEK_CUR = 1 - SEEK_END = 2 + SEEK_BEG = 0 + SEEK_CUR = 1 + SEEK_END = 2 - PROCEDURE Load(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER; - FName, - size , - 0 (). , - (kunpack). + PROCEDURE Load(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER; + FName, + size , + 0 (). , + (kunpack). - PROCEDURE GetFileInfo(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN - - FName Info. - FALSE. + PROCEDURE GetFileInfo(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN + + FName Info. + FALSE. - PROCEDURE Exists(FName: ARRAY OF CHAR): BOOLEAN - TRUE, FName + PROCEDURE Exists(FName: ARRAY OF CHAR): BOOLEAN + TRUE, FName - PROCEDURE Close(VAR F: FS) - , - F F NIL + PROCEDURE Close(VAR F: FS) + , + F F NIL - PROCEDURE Open(FName: ARRAY OF CHAR): FS - - FName, NIL + PROCEDURE Open(FName: ARRAY OF CHAR): FS + + FName, NIL - PROCEDURE Delete(FName: ARRAY OF CHAR): BOOLEAN - FName, FALSE + PROCEDURE Delete(FName: ARRAY OF CHAR): BOOLEAN + FName, FALSE - PROCEDURE Seek(F: FS; Offset, Origin: INTEGER): INTEGER - - F Offset, - Origin = (SEEK_BEG - , - SEEK_CUR - , SEEK_END - ), - , : - Seek(F, 0, SEEK_END) - - ; -1 + PROCEDURE Seek(F: FS; Offset, Origin: INTEGER): INTEGER + - F Offset, + Origin = (SEEK_BEG - , + SEEK_CUR - , SEEK_END - ), + , : + Seek(F, 0, SEEK_END) + + ; -1 - PROCEDURE Read(F: FS; Buffer, Count: INTEGER): INTEGER - . F - - , Buffer - - , Count - , - ; , - / - F. + PROCEDURE Read(F: FS; Buffer, Count: INTEGER): INTEGER + . F - + , Buffer - + , Count - , + ; , + / + F. - PROCEDURE Write(F: FS; Buffer, Count: INTEGER): INTEGER - . F - - , Buffer - - , Count - , - ; , - / - F. + PROCEDURE Write(F: FS; Buffer, Count: INTEGER): INTEGER + . F - + , Buffer - + , Count - , + ; , + / + F. - PROCEDURE Create(FName: ARRAY OF CHAR): FS - FName ( ), - , - NIL + PROCEDURE Create(FName: ARRAY OF CHAR): FS + FName ( ), + , + NIL - PROCEDURE CreateDir(DirName: ARRAY OF CHAR): BOOLEAN - DirName, - , FALSE + PROCEDURE CreateDir(DirName: ARRAY OF CHAR): BOOLEAN + DirName, + , FALSE - PROCEDURE DeleteDir(DirName: ARRAY OF CHAR): BOOLEAN - DirName, - FALSE + PROCEDURE DeleteDir(DirName: ARRAY OF CHAR): BOOLEAN + DirName, + FALSE - PROCEDURE DirExists(DirName: ARRAY OF CHAR): BOOLEAN - TRUE, DirName + PROCEDURE DirExists(DirName: ARRAY OF CHAR): BOOLEAN + TRUE, DirName ------------------------------------------------------------------------------ MODULE Read - F - TRUE - / - F + TRUE + / + F - PROCEDURE Char(F: File.FS; VAR x: CHAR): BOOLEAN + PROCEDURE Char(F: File.FS; VAR x: CHAR): BOOLEAN - PROCEDURE Int(F: File.FS; VAR x: INTEGER): BOOLEAN + PROCEDURE Int(F: File.FS; VAR x: INTEGER): BOOLEAN - PROCEDURE Real(F: File.FS; VAR x: REAL): BOOLEAN + PROCEDURE Real(F: File.FS; VAR x: REAL): BOOLEAN - PROCEDURE Boolean(F: File.FS; VAR x: BOOLEAN): BOOLEAN + PROCEDURE Boolean(F: File.FS; VAR x: BOOLEAN): BOOLEAN - PROCEDURE Set(F: File.FS; VAR x: SET): BOOLEAN + PROCEDURE Set(F: File.FS; VAR x: SET): BOOLEAN - PROCEDURE Card16(F: File.FS; VAR x: SYSTEM.CARD16): BOOLEAN + PROCEDURE WChar(F: File.FS; VAR x: WCHAR): BOOLEAN ------------------------------------------------------------------------------ MODULE Write - F - TRUE - / - F + TRUE + / + F - PROCEDURE Char(F: File.FS; x: CHAR): BOOLEAN + PROCEDURE Char(F: File.FS; x: CHAR): BOOLEAN - PROCEDURE Int(F: File.FS; x: INTEGER): BOOLEAN + PROCEDURE Int(F: File.FS; x: INTEGER): BOOLEAN - PROCEDURE Real(F: File.FS; x: REAL): BOOLEAN + PROCEDURE Real(F: File.FS; x: REAL): BOOLEAN - PROCEDURE Boolean(F: File.FS; x: BOOLEAN): BOOLEAN + PROCEDURE Boolean(F: File.FS; x: BOOLEAN): BOOLEAN - PROCEDURE Set(F: File.FS; x: SET): BOOLEAN + PROCEDURE Set(F: File.FS; x: SET): BOOLEAN - PROCEDURE Card16(F: File.FS; x: SYSTEM.CARD16): BOOLEAN + PROCEDURE WChar(F: File.FS; x: WCHAR): BOOLEAN ------------------------------------------------------------------------------ MODULE DateTime - , - CONST ERR = -7.0E5 + CONST ERR = -7.0E5 - PROCEDURE Now(VAR Year, Month, Day, Hour, Min, Sec: INTEGER) - - + PROCEDURE Now(VAR Year, Month, Day, Hour, Min, Sec: INTEGER) + + - PROCEDURE Encode(Year, Month, Day, Hour, Min, Sec: INTEGER): REAL - , - Year, Month, Day, Hour, Min, Sec; - ERR = -7.0E5 + PROCEDURE Encode(Year, Month, Day, Hour, Min, Sec: INTEGER): REAL + , + Year, Month, Day, Hour, Min, Sec; + ERR = -7.0E5 - PROCEDURE Decode(Date: REAL; VAR Year, Month, Day, - Hour, Min, Sec: INTEGER): BOOLEAN - - Year, Month, Day, Hour, Min, Sec Date; - FALSE + PROCEDURE Decode(Date: REAL; VAR Year, Month, Day, + Hour, Min, Sec: INTEGER): BOOLEAN + + Year, Month, Day, Hour, Min, Sec Date; + FALSE ------------------------------------------------------------------------------ MODULE Args - - VAR argc: INTEGER - , - + VAR argc: INTEGER + , + - PROCEDURE GetArg(n: INTEGER; VAR s: ARRAY OF CHAR) - s n- , - 0 argc - 1, - -- + PROCEDURE GetArg(n: INTEGER; VAR s: ARRAY OF CHAR) + s n- , + 0 argc - 1, + -- ------------------------------------------------------------------------------ MODULE KOSAPI - PROCEDURE sysfunc1(arg1: INTEGER): INTEGER - PROCEDURE sysfunc2(arg1, arg2: INTEGER): INTEGER - ... - PROCEDURE sysfunc7(arg1, arg2, ..., arg7: INTEGER): INTEGER - API KolibriOS. - arg1 .. arg7 - eax, ebx, ecx, edx, esi, edi, ebp; - eax . + PROCEDURE sysfunc1(arg1: INTEGER): INTEGER + PROCEDURE sysfunc2(arg1, arg2: INTEGER): INTEGER + ... + PROCEDURE sysfunc7(arg1, arg2, ..., arg7: INTEGER): INTEGER + API KolibriOS. + arg1 .. arg7 + eax, ebx, ecx, edx, esi, edi, ebp; + eax . - PROCEDURE sysfunc22(arg1, arg2: INTEGER; VAR res2: INTEGER): INTEGER - API KolibriOS. - arg1 - eax, arg2 - ebx, - res2 - ebx ; - eax . + PROCEDURE sysfunc22(arg1, arg2: INTEGER; VAR res2: INTEGER): INTEGER + API KolibriOS. + arg1 - eax, arg2 - ebx, + res2 - ebx ; + eax . - PROCEDURE malloc(size: INTEGER): INTEGER - . - size - , - + PROCEDURE malloc(size: INTEGER): INTEGER + . + size - , + - PROCEDURE free(ptr: INTEGER): INTEGER - ptr, - 0 + PROCEDURE free(ptr: INTEGER): INTEGER + ptr, + 0 - PROCEDURE realloc(ptr, size: INTEGER): INTEGER - , - ptr - , - size - , - , - 0 + PROCEDURE realloc(ptr, size: INTEGER): INTEGER + , + ptr - , + size - , + , + 0 - PROCEDURE GetCommandLine(): INTEGER - + PROCEDURE GetCommandLine(): INTEGER + - PROCEDURE GetName(): INTEGER - + PROCEDURE GetName(): INTEGER + - PROCEDURE LoadLib(name: ARRAY OF CHAR): INTEGER - DLL name. - . 0. + PROCEDURE LoadLib(name: ARRAY OF CHAR): INTEGER + DLL name. + . 0. - PROCEDURE GetProcAdr(name: ARRAY OF CHAR; lib: INTEGER): INTEGER - name - - lib - DLL - . 0. + PROCEDURE GetProcAdr(name: ARRAY OF CHAR; lib: INTEGER): INTEGER + name - + lib - DLL + . 0. ------------------------------------------------------------------------------ MODULE ColorDlg - "Color Dialog" - TYPE + TYPE - Dialog = POINTER TO RECORD (* *) - status: INTEGER (* : - 0 - Cancel - 1 - OK - 2 - *) + Dialog = POINTER TO RECORD (* *) + status: INTEGER (* : + 0 - Cancel + 1 - OK + 2 - *) - color: INTEGER (* *) - END + color: INTEGER (* *) + END - PROCEDURE Create(draw_window: DRAW_WINDOW): Dialog - - draw_window - - (TYPE DRAW_WINDOW = PROCEDURE); - + PROCEDURE Create(draw_window: DRAW_WINDOW): Dialog + + draw_window - + (TYPE DRAW_WINDOW = PROCEDURE); + - PROCEDURE Show(cd: Dialog) - - cd - , - Create + PROCEDURE Show(cd: Dialog) + + cd - , + Create - PROCEDURE Destroy(VAR cd: Dialog) - - cd - + PROCEDURE Destroy(VAR cd: Dialog) + + cd - ------------------------------------------------------------------------------ MODULE OpenDlg - "Open Dialog" - TYPE + TYPE - Dialog = POINTER TO RECORD (* *) - status: INTEGER (* : - 0 - Cancel - 1 - OK - 2 - *) + Dialog = POINTER TO RECORD (* *) + status: INTEGER (* : + 0 - Cancel + 1 - OK + 2 - *) - FileName: ARRAY 4096 OF CHAR (* *) - FilePath: ARRAY 4096 OF CHAR (* - *) - END + FileName: ARRAY 4096 OF CHAR (* *) + FilePath: ARRAY 4096 OF CHAR (* + *) + END - PROCEDURE Create(draw_window: DRAW_WINDOW; type: INTEGER; def_path, - filter: ARRAY OF CHAR): Dialog - - draw_window - - (TYPE DRAW_WINDOW = PROCEDURE) - type - - 0 - - 1 - - 2 - - def_path - , def_path - - filter - , - , - "|", : "ASM|TXT|INI" - + PROCEDURE Create(draw_window: DRAW_WINDOW; type: INTEGER; def_path, + filter: ARRAY OF CHAR): Dialog + + draw_window - + (TYPE DRAW_WINDOW = PROCEDURE) + type - + 0 - + 1 - + 2 - + def_path - , def_path + + filter - , + , + "|", : "ASM|TXT|INI" + - PROCEDURE Show(od: Dialog; Width, Height: INTEGER) - - od - , - Create - Width Height - + PROCEDURE Show(od: Dialog; Width, Height: INTEGER) + + od - , + Create + Width Height - - PROCEDURE Destroy(VAR od: Dialog) - - od - + PROCEDURE Destroy(VAR od: Dialog) + + od - ------------------------------------------------------------------------------ MODULE kfonts - kf- - CONST + CONST - bold = 1 - italic = 2 - underline = 4 - strike_through = 8 - smoothing = 16 - bpp32 = 32 + bold = 1 + italic = 2 + underline = 4 + strike_through = 8 + smoothing = 16 + bpp32 = 32 - TYPE + TYPE - TFont = POINTER TO TFont_desc (* *) + TFont = POINTER TO TFont_desc (* *) - PROCEDURE LoadFont(file_name: ARRAY OF CHAR): TFont - - file_name kf- - -: /NIL () + PROCEDURE LoadFont(file_name: ARRAY OF CHAR): TFont + + file_name kf- + -: /NIL () - PROCEDURE SetSize(Font: TFont; font_size: INTEGER): BOOLEAN - - Font - font_size - -: TRUE/FALSE () + PROCEDURE SetSize(Font: TFont; font_size: INTEGER): BOOLEAN + + Font + font_size + -: TRUE/FALSE () - PROCEDURE Enabled(Font: TFont; font_size: INTEGER): BOOLEAN - , , - Font - font_size - -: TRUE/FALSE ( ) + PROCEDURE Enabled(Font: TFont; font_size: INTEGER): BOOLEAN + , , + Font + font_size + -: TRUE/FALSE ( ) - PROCEDURE Destroy(VAR Font: TFont) - , - Font - Font NIL + PROCEDURE Destroy(VAR Font: TFont) + , + Font + Font NIL - PROCEDURE TextHeight(Font: TFont): INTEGER - - Font - -: + PROCEDURE TextHeight(Font: TFont): INTEGER + + Font + -: - PROCEDURE TextWidth(Font: TFont; - str, length, params: INTEGER): INTEGER - - Font - str Win-1251 - length -1, - - params - . - -: + PROCEDURE TextWidth(Font: TFont; + str, length, params: INTEGER): INTEGER + + Font + str Win-1251 + length -1, + + params - . + -: - PROCEDURE TextOut(Font: TFont; - canvas, x, y, str, length, color, params: INTEGER) - - , .65 - .7 ( 24-) - Font - canvas - : - Xsize dd - Ysize dd - picture rb Xsize * Ysize * 4 (32 ) - Xsize * Ysize * 3 (24 ) - x, y - - str Win-1251 - length -1, - - color 0x00RRGGBB - params -: - 1 - 2 - 4 - 8 - 16 - 32 32- - + PROCEDURE TextOut(Font: TFont; + canvas, x, y, str, length, color, params: INTEGER) + + , .65 + .7 ( 24-) + Font + canvas + : + Xsize dd + Ysize dd + picture rb Xsize * Ysize * 4 (32 ) + Xsize * Ysize * 3 (24 ) + x, y + + str Win-1251 + length -1, + + color 0x00RRGGBB + params -: + 1 + 2 + 4 + 8 + 16 + 32 32- + ------------------------------------------------------------------------------ MODULE RasterWorks - Rasterworks.obj ------------------------------------------------------------------------------ diff --git a/programs/develop/oberon07/Docs/KOSLib866.txt b/programs/develop/oberon07/Docs/KOSLib866.txt index a163da19ee..7b501634ae 100644 --- a/programs/develop/oberon07/Docs/KOSLib866.txt +++ b/programs/develop/oberon07/Docs/KOSLib866.txt @@ -1,94 +1,94 @@ ============================================================================== - ⥪ (KolibriOS) + ⥪ (KolibriOS) ------------------------------------------------------------------------------ MODULE Out - ᮫ 뢮 - PROCEDURE Open - ଠ쭮 뢠 ᮫ 뢮 + PROCEDURE Open + ଠ쭮 뢠 ᮫ 뢮 - PROCEDURE Int(x, width: INTEGER) - 뢮 楫 ᫠ x; - width - ⢮ , ᯮ㥬 뢮 + PROCEDURE Int(x, width: INTEGER) + 뢮 楫 ᫠ x; + width - ⢮ , ᯮ㥬 뢮 - PROCEDURE Real(x: REAL; width: INTEGER) - 뢮 ⢥ ᫠ x 饬 ଠ; - width - ⢮ , ᯮ㥬 뢮 + PROCEDURE Real(x: REAL; width: INTEGER) + 뢮 ⢥ ᫠ x 饬 ଠ; + width - ⢮ , ᯮ㥬 뢮 - PROCEDURE Char(x: CHAR) - 뢮 ᨬ x + PROCEDURE Char(x: CHAR) + 뢮 ᨬ x - PROCEDURE FixReal(x: REAL; width, p: INTEGER) - 뢮 ⢥ ᫠ x 䨪஢ ଠ; - width - ⢮ , ᯮ㥬 뢮; - p - ⢮ ᫥ 筮 窨 + PROCEDURE FixReal(x: REAL; width, p: INTEGER) + 뢮 ⢥ ᫠ x 䨪஢ ଠ; + width - ⢮ , ᯮ㥬 뢮; + p - ⢮ ᫥ 筮 窨 - PROCEDURE Ln - 室 ᫥ ப + PROCEDURE Ln + 室 ᫥ ப - PROCEDURE String(s: ARRAY OF CHAR) - 뢮 ப s + PROCEDURE String(s: ARRAY OF CHAR) + 뢮 ப s ------------------------------------------------------------------------------ MODULE In - ᮫ - VAR Done: BOOLEAN - ਭ 祭 TRUE 砥 ᯥ譮 믮 - 樨 , FALSE + VAR Done: BOOLEAN + ਭ 祭 TRUE 砥 ᯥ譮 믮 + 樨 , FALSE - PROCEDURE Open - ଠ쭮 뢠 ᮫ , - ⠪ ᢠ ६ Done 祭 TRUE + PROCEDURE Open + ଠ쭮 뢠 ᮫ , + ⠪ ᢠ ६ Done 祭 TRUE - PROCEDURE Int(VAR x: INTEGER) - ᫠ ⨯ INTEGER + PROCEDURE Int(VAR x: INTEGER) + ᫠ ⨯ INTEGER - PROCEDURE Char(VAR x: CHAR) - ᨬ + PROCEDURE Char(VAR x: CHAR) + ᨬ - PROCEDURE Real(VAR x: REAL) - ᫠ ⨯ REAL + PROCEDURE Real(VAR x: REAL) + ᫠ ⨯ REAL - PROCEDURE String(VAR s: ARRAY OF CHAR) - ப + PROCEDURE String(VAR s: ARRAY OF CHAR) + ப - PROCEDURE Ln - ENTER + PROCEDURE Ln + ENTER ------------------------------------------------------------------------------ MODULE Console - ⥫ 楤 ᮫쭮 뢮 - CONST + CONST - 騥 ⠭ । 梥 ᮫쭮 뢮 + 騥 ⠭ । 梥 ᮫쭮 뢮 - Black = 0 Blue = 1 Green = 2 - Cyan = 3 Red = 4 Magenta = 5 - Brown = 6 LightGray = 7 DarkGray = 8 - LightBlue = 9 LightGreen = 10 LightCyan = 11 - LightRed = 12 LightMagenta = 13 Yellow = 14 - White = 15 + Black = 0 Blue = 1 Green = 2 + Cyan = 3 Red = 4 Magenta = 5 + Brown = 6 LightGray = 7 DarkGray = 8 + LightBlue = 9 LightGreen = 10 LightCyan = 11 + LightRed = 12 LightMagenta = 13 Yellow = 14 + White = 15 - PROCEDURE Cls - ⪠ ᮫ + PROCEDURE Cls + ⪠ ᮫ - PROCEDURE SetColor(FColor, BColor: INTEGER) - ⠭ 梥 ᮫쭮 뢮: FColor - 梥 ⥪, - BColor - 梥 䮭, 祭 - 襯᫥ - ⠭ + PROCEDURE SetColor(FColor, BColor: INTEGER) + ⠭ 梥 ᮫쭮 뢮: FColor - 梥 ⥪, + BColor - 梥 䮭, 祭 - 襯᫥ + ⠭ - PROCEDURE SetCursor(x, y: INTEGER) - ⠭ ᮫ (x, y) + PROCEDURE SetCursor(x, y: INTEGER) + ⠭ ᮫ (x, y) - PROCEDURE GetCursor(VAR x, y: INTEGER) - 뢠 ࠬ ⥪騥 न ᮫ + PROCEDURE GetCursor(VAR x, y: INTEGER) + 뢠 ࠬ ⥪騥 न ᮫ - PROCEDURE GetCursorX(): INTEGER - 頥 ⥪ x-न ᮫ + PROCEDURE GetCursorX(): INTEGER + 頥 ⥪ x-न ᮫ - PROCEDURE GetCursorY(): INTEGER - 頥 ⥪ y-न ᮫ + PROCEDURE GetCursorY(): INTEGER + 頥 ⥪ y-न ᮫ ------------------------------------------------------------------------------ MODULE ConsoleLib - ⪠ ⥪ console.obj @@ -96,469 +96,469 @@ MODULE ConsoleLib - ------------------------------------------------------------------------------ MODULE Math - ⥬᪨ 㭪樨 - CONST + CONST - pi = 3.141592653589793E+00 - e = 2.718281828459045E+00 + pi = 3.141592653589793E+00 + e = 2.718281828459045E+00 - PROCEDURE IsNan(x: REAL): BOOLEAN - 頥 TRUE, ᫨ x - ᫮ + PROCEDURE IsNan(x: REAL): BOOLEAN + 頥 TRUE, ᫨ x - ᫮ - PROCEDURE IsInf(x: REAL): BOOLEAN - 頥 TRUE, ᫨ x - ᪮筮 + PROCEDURE IsInf(x: REAL): BOOLEAN + 頥 TRUE, ᫨ x - ᪮筮 - PROCEDURE sqrt(x: REAL): REAL - ७ x + PROCEDURE sqrt(x: REAL): REAL + ७ x - PROCEDURE exp(x: REAL): REAL - ᯮ x + PROCEDURE exp(x: REAL): REAL + ᯮ x - PROCEDURE ln(x: REAL): REAL - ࠫ x + PROCEDURE ln(x: REAL): REAL + ࠫ x - PROCEDURE sin(x: REAL): REAL - ᨭ x + PROCEDURE sin(x: REAL): REAL + ᨭ x - PROCEDURE cos(x: REAL): REAL - ᨭ x + PROCEDURE cos(x: REAL): REAL + ᨭ x - PROCEDURE tan(x: REAL): REAL - ⠭ x + PROCEDURE tan(x: REAL): REAL + ⠭ x - PROCEDURE arcsin(x: REAL): REAL - ᨭ x + PROCEDURE arcsin(x: REAL): REAL + ᨭ x - PROCEDURE arccos(x: REAL): REAL - પᨭ x + PROCEDURE arccos(x: REAL): REAL + પᨭ x - PROCEDURE arctan(x: REAL): REAL - ⠭ x + PROCEDURE arctan(x: REAL): REAL + ⠭ x - PROCEDURE arctan2(y, x: REAL): REAL - ⠭ y/x + PROCEDURE arctan2(y, x: REAL): REAL + ⠭ y/x - PROCEDURE power(base, exponent: REAL): REAL - ᫠ base ⥯ exponent + PROCEDURE power(base, exponent: REAL): REAL + ᫠ base ⥯ exponent - PROCEDURE log(base, x: REAL): REAL - x ᭮ base + PROCEDURE log(base, x: REAL): REAL + x ᭮ base - PROCEDURE sinh(x: REAL): REAL - ࡮᪨ ᨭ x + PROCEDURE sinh(x: REAL): REAL + ࡮᪨ ᨭ x - PROCEDURE cosh(x: REAL): REAL - ࡮᪨ ᨭ x + PROCEDURE cosh(x: REAL): REAL + ࡮᪨ ᨭ x - PROCEDURE tanh(x: REAL): REAL - ࡮᪨ ⠭ x + PROCEDURE tanh(x: REAL): REAL + ࡮᪨ ⠭ x - PROCEDURE arsinh(x: REAL): REAL - ࡮᪨ ᨭ x + PROCEDURE arsinh(x: REAL): REAL + ࡮᪨ ᨭ x - PROCEDURE arcosh(x: REAL): REAL - ࡮᪨ ᨭ x + PROCEDURE arcosh(x: REAL): REAL + ࡮᪨ ᨭ x - PROCEDURE artanh(x: REAL): REAL - ࡮᪨ ⠭ x + PROCEDURE artanh(x: REAL): REAL + ࡮᪨ ⠭ x - PROCEDURE round(x: REAL): REAL - 㣫 x 襣 楫 + PROCEDURE round(x: REAL): REAL + 㣫 x 襣 楫 - PROCEDURE frac(x: REAL): REAL; - ஡ ᫠ x + PROCEDURE frac(x: REAL): REAL; + ஡ ᫠ x - PROCEDURE floor(x: REAL): REAL - 襥 楫 ᫮ (।⠢ REAL), - x: floor(1.2) = 1.0 + PROCEDURE floor(x: REAL): REAL + 襥 楫 ᫮ (।⠢ REAL), + x: floor(1.2) = 1.0 - PROCEDURE ceil(x: REAL): REAL - 襥 楫 ᫮ (।⠢ REAL), - x: ceil(1.2) = 2.0 + PROCEDURE ceil(x: REAL): REAL + 襥 楫 ᫮ (।⠢ REAL), + x: ceil(1.2) = 2.0 - PROCEDURE sgn(x: REAL): INTEGER - ᫨ x > 0 頥 1 - ᫨ x < 0 頥 -1 - ᫨ x = 0 頥 0 + PROCEDURE sgn(x: REAL): INTEGER + ᫨ x > 0 頥 1 + ᫨ x < 0 頥 -1 + ᫨ x = 0 頥 0 - PROCEDURE fact(n: INTEGER): REAL - 䠪ਠ n + PROCEDURE fact(n: INTEGER): REAL + 䠪ਠ n ------------------------------------------------------------------------------ MODULE Debug - 뢮 ⫠ - 䥩 Out + 䥩 Out - PROCEDURE Open - 뢠 ⫠ + PROCEDURE Open + 뢠 ⫠ ------------------------------------------------------------------------------ MODULE File - ࠡ 䠩 ⥬ - TYPE + TYPE - FNAME = ARRAY 520 OF CHAR + FNAME = ARRAY 520 OF CHAR - FS = POINTER TO rFS + FS = POINTER TO rFS - rFS = RECORD (* ଠ樮 䠩 *) - subfunc, pos, hpos, bytes, buffer: INTEGER; - name: FNAME - END + rFS = RECORD (* ଠ樮 䠩 *) + subfunc, pos, hpos, bytes, buffer: INTEGER; + name: FNAME + END - FD = POINTER TO rFD + FD = POINTER TO rFD - rFD = RECORD (* 室 ⠫ *) - attr: INTEGER; - ntyp: CHAR; - reserved: ARRAY 3 OF CHAR; - time_create, date_create, - time_access, date_access, - time_modif, date_modif, - size, hsize: INTEGER; - name: FNAME - END + rFD = RECORD (* 室 ⠫ *) + attr: INTEGER; + ntyp: CHAR; + reserved: ARRAY 3 OF CHAR; + time_create, date_create, + time_access, date_access, + time_modif, date_modif, + size, hsize: INTEGER; + name: FNAME + END - CONST + CONST - SEEK_BEG = 0 - SEEK_CUR = 1 - SEEK_END = 2 + SEEK_BEG = 0 + SEEK_CUR = 1 + SEEK_END = 2 - PROCEDURE Load(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER; - 㦠 䠩 FName, 뢠 ࠬ - size ࠧ 䠩, 頥 㦥 䠩 - 0 (訡). 室, ᯠ뢠 - 䠩 (kunpack). + PROCEDURE Load(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER; + 㦠 䠩 FName, 뢠 ࠬ + size ࠧ 䠩, 頥 㦥 䠩 + 0 (訡). 室, ᯠ뢠 + 䠩 (kunpack). - PROCEDURE GetFileInfo(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN - 뢠 室 ⠫ 䠩 - FName ࠬ Info. - 訡 頥 FALSE. + PROCEDURE GetFileInfo(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN + 뢠 室 ⠫ 䠩 + FName ࠬ Info. + 訡 頥 FALSE. - PROCEDURE Exists(FName: ARRAY OF CHAR): BOOLEAN - 頥 TRUE, ᫨ 䠩 FName + PROCEDURE Exists(FName: ARRAY OF CHAR): BOOLEAN + 頥 TRUE, ᫨ 䠩 FName - PROCEDURE Close(VAR F: FS) - ᢮ , 뤥 ଠ樮 - 䠩 F ᢠ F 祭 NIL + PROCEDURE Close(VAR F: FS) + ᢮ , 뤥 ଠ樮 + 䠩 F ᢠ F 祭 NIL - PROCEDURE Open(FName: ARRAY OF CHAR): FS - 頥 㪠⥫ ଠ樮 䠩 - FName, 訡 頥 NIL + PROCEDURE Open(FName: ARRAY OF CHAR): FS + 頥 㪠⥫ ଠ樮 䠩 + FName, 訡 頥 NIL - PROCEDURE Delete(FName: ARRAY OF CHAR): BOOLEAN - 㤠 䠩 FName, 訡 頥 FALSE + PROCEDURE Delete(FName: ARRAY OF CHAR): BOOLEAN + 㤠 䠩 FName, 訡 頥 FALSE - PROCEDURE Seek(F: FS; Offset, Origin: INTEGER): INTEGER - ⠭ ⥭- 䠩 F Offset, - ⭮⥫쭮 Origin = (SEEK_BEG - 砫 䠩, - SEEK_CUR - ⥪ , SEEK_END - 䠩), - 頥 ⭮⥫쭮 砫 䠩, ਬ: - Seek(F, 0, SEEK_END) - ⠭ 䠩 頥 - 䠩; 訡 頥 -1 + PROCEDURE Seek(F: FS; Offset, Origin: INTEGER): INTEGER + ⠭ ⥭- 䠩 F Offset, + ⭮⥫쭮 Origin = (SEEK_BEG - 砫 䠩, + SEEK_CUR - ⥪ , SEEK_END - 䠩), + 頥 ⭮⥫쭮 砫 䠩, ਬ: + Seek(F, 0, SEEK_END) + ⠭ 䠩 頥 + 䠩; 訡 頥 -1 - PROCEDURE Read(F: FS; Buffer, Count: INTEGER): INTEGER - ⠥ 䠩 . F - 㪠⥫ - ଠ樮 䠩, Buffer - - , Count - ⢮ , ஥ ॡ - 䠩; 頥 ⢮ , ஥ 뫮 ⠭ - ᮮ⢥騬 ࠧ ⥭/ - ଠ樮 F. + PROCEDURE Read(F: FS; Buffer, Count: INTEGER): INTEGER + ⠥ 䠩 . F - 㪠⥫ + ଠ樮 䠩, Buffer - + , Count - ⢮ , ஥ ॡ + 䠩; 頥 ⢮ , ஥ 뫮 ⠭ + ᮮ⢥騬 ࠧ ⥭/ + ଠ樮 F. - PROCEDURE Write(F: FS; Buffer, Count: INTEGER): INTEGER - 뢠 䠩. F - 㪠⥫ - ଠ樮 䠩, Buffer - - , Count - ⢮ , ஥ ॡ - 䠩; 頥 ⢮ , ஥ 뫮 ᠭ - ᮮ⢥騬 ࠧ ⥭/ - ଠ樮 F. + PROCEDURE Write(F: FS; Buffer, Count: INTEGER): INTEGER + 뢠 䠩. F - 㪠⥫ + ଠ樮 䠩, Buffer - + , Count - ⢮ , ஥ ॡ + 䠩; 頥 ⢮ , ஥ 뫮 ᠭ + ᮮ⢥騬 ࠧ ⥭/ + ଠ樮 F. - PROCEDURE Create(FName: ARRAY OF CHAR): FS - ᮧ 䠩 FName ( ), 頥 - 㪠⥫ ଠ樮 䠩, - 訡 頥 NIL + PROCEDURE Create(FName: ARRAY OF CHAR): FS + ᮧ 䠩 FName ( ), 頥 + 㪠⥫ ଠ樮 䠩, + 訡 頥 NIL - PROCEDURE CreateDir(DirName: ARRAY OF CHAR): BOOLEAN - ᮧ DirName, ஬ - ⢮, 訡 頥 FALSE + PROCEDURE CreateDir(DirName: ARRAY OF CHAR): BOOLEAN + ᮧ DirName, ஬ + ⢮, 訡 頥 FALSE - PROCEDURE DeleteDir(DirName: ARRAY OF CHAR): BOOLEAN - 㤠 DirName, - 訡 頥 FALSE + PROCEDURE DeleteDir(DirName: ARRAY OF CHAR): BOOLEAN + 㤠 DirName, + 訡 頥 FALSE - PROCEDURE DirExists(DirName: ARRAY OF CHAR): BOOLEAN - 頥 TRUE, ᫨ DirName + PROCEDURE DirExists(DirName: ARRAY OF CHAR): BOOLEAN + 頥 TRUE, ᫨ DirName ------------------------------------------------------------------------------ MODULE Read - ⥭ ᭮ ⨯ 䠩 F - 楤 TRUE 砥 ᯥ譮 樨 ⥭ - ᮮ⢥騬 ࠧ ⥭/ - ଠ樮 F + 楤 TRUE 砥 ᯥ譮 樨 ⥭ + ᮮ⢥騬 ࠧ ⥭/ + ଠ樮 F - PROCEDURE Char(F: File.FS; VAR x: CHAR): BOOLEAN + PROCEDURE Char(F: File.FS; VAR x: CHAR): BOOLEAN - PROCEDURE Int(F: File.FS; VAR x: INTEGER): BOOLEAN + PROCEDURE Int(F: File.FS; VAR x: INTEGER): BOOLEAN - PROCEDURE Real(F: File.FS; VAR x: REAL): BOOLEAN + PROCEDURE Real(F: File.FS; VAR x: REAL): BOOLEAN - PROCEDURE Boolean(F: File.FS; VAR x: BOOLEAN): BOOLEAN + PROCEDURE Boolean(F: File.FS; VAR x: BOOLEAN): BOOLEAN - PROCEDURE Set(F: File.FS; VAR x: SET): BOOLEAN + PROCEDURE Set(F: File.FS; VAR x: SET): BOOLEAN - PROCEDURE Card16(F: File.FS; VAR x: SYSTEM.CARD16): BOOLEAN + PROCEDURE WChar(F: File.FS; VAR x: WCHAR): BOOLEAN ------------------------------------------------------------------------------ MODULE Write - ᭮ ⨯ 䠩 F - 楤 TRUE 砥 ᯥ譮 樨 - ᮮ⢥騬 ࠧ ⥭/ - ଠ樮 F + 楤 TRUE 砥 ᯥ譮 樨 + ᮮ⢥騬 ࠧ ⥭/ + ଠ樮 F - PROCEDURE Char(F: File.FS; x: CHAR): BOOLEAN + PROCEDURE Char(F: File.FS; x: CHAR): BOOLEAN - PROCEDURE Int(F: File.FS; x: INTEGER): BOOLEAN + PROCEDURE Int(F: File.FS; x: INTEGER): BOOLEAN - PROCEDURE Real(F: File.FS; x: REAL): BOOLEAN + PROCEDURE Real(F: File.FS; x: REAL): BOOLEAN - PROCEDURE Boolean(F: File.FS; x: BOOLEAN): BOOLEAN + PROCEDURE Boolean(F: File.FS; x: BOOLEAN): BOOLEAN - PROCEDURE Set(F: File.FS; x: SET): BOOLEAN + PROCEDURE Set(F: File.FS; x: SET): BOOLEAN - PROCEDURE Card16(F: File.FS; x: SYSTEM.CARD16): BOOLEAN + PROCEDURE WChar(F: File.FS; x: WCHAR): BOOLEAN ------------------------------------------------------------------------------ MODULE DateTime - , ६ - CONST ERR = -7.0E5 + CONST ERR = -7.0E5 - PROCEDURE Now(VAR Year, Month, Day, Hour, Min, Sec: INTEGER) - 뢠 ࠬ ⥪饩 ⥬ - ६ + PROCEDURE Now(VAR Year, Month, Day, Hour, Min, Sec: INTEGER) + 뢠 ࠬ ⥪饩 ⥬ + ६ - PROCEDURE Encode(Year, Month, Day, Hour, Min, Sec: INTEGER): REAL - 頥 , 祭 ⮢ - Year, Month, Day, Hour, Min, Sec; - 訡 頥 ⠭ ERR = -7.0E5 + PROCEDURE Encode(Year, Month, Day, Hour, Min, Sec: INTEGER): REAL + 頥 , 祭 ⮢ + Year, Month, Day, Hour, Min, Sec; + 訡 頥 ⠭ ERR = -7.0E5 - PROCEDURE Decode(Date: REAL; VAR Year, Month, Day, - Hour, Min, Sec: INTEGER): BOOLEAN - - Year, Month, Day, Hour, Min, Sec Date; - 訡 頥 FALSE + PROCEDURE Decode(Date: REAL; VAR Year, Month, Day, + Hour, Min, Sec: INTEGER): BOOLEAN + + Year, Month, Day, Hour, Min, Sec Date; + 訡 頥 FALSE ------------------------------------------------------------------------------ MODULE Args - ࠬ ணࠬ - VAR argc: INTEGER - ⢮ ࠬ஢ ணࠬ, - ᯮ塞 䠩 + VAR argc: INTEGER + ⢮ ࠬ஢ ணࠬ, + ᯮ塞 䠩 - PROCEDURE GetArg(n: INTEGER; VAR s: ARRAY OF CHAR) - 뢠 ப s n- ࠬ ணࠬ, - 㬥 ࠬ஢ 0 argc - 1, - 㫥 ࠬ -- ᯮ塞 䠩 + PROCEDURE GetArg(n: INTEGER; VAR s: ARRAY OF CHAR) + 뢠 ப s n- ࠬ ணࠬ, + 㬥 ࠬ஢ 0 argc - 1, + 㫥 ࠬ -- ᯮ塞 䠩 ------------------------------------------------------------------------------ MODULE KOSAPI - PROCEDURE sysfunc1(arg1: INTEGER): INTEGER - PROCEDURE sysfunc2(arg1, arg2: INTEGER): INTEGER - ... - PROCEDURE sysfunc7(arg1, arg2, ..., arg7: INTEGER): INTEGER - ⪨ 㭪権 API KolibriOS. - arg1 .. arg7 ᮮ⢥ ॣࠬ - eax, ebx, ecx, edx, esi, edi, ebp; - 祭 ॣ eax ᫥ ⥬ 맮. + PROCEDURE sysfunc1(arg1: INTEGER): INTEGER + PROCEDURE sysfunc2(arg1, arg2: INTEGER): INTEGER + ... + PROCEDURE sysfunc7(arg1, arg2, ..., arg7: INTEGER): INTEGER + ⪨ 㭪権 API KolibriOS. + arg1 .. arg7 ᮮ⢥ ॣࠬ + eax, ebx, ecx, edx, esi, edi, ebp; + 祭 ॣ eax ᫥ ⥬ 맮. - PROCEDURE sysfunc22(arg1, arg2: INTEGER; VAR res2: INTEGER): INTEGER - ⪠ 㭪権 API KolibriOS. - arg1 - ॣ eax, arg2 - ॣ ebx, - res2 - 祭 ॣ ebx ᫥ ⥬ 맮; - 頥 祭 ॣ eax ᫥ ⥬ 맮. + PROCEDURE sysfunc22(arg1, arg2: INTEGER; VAR res2: INTEGER): INTEGER + ⪠ 㭪権 API KolibriOS. + arg1 - ॣ eax, arg2 - ॣ ebx, + res2 - 祭 ॣ ebx ᫥ ⥬ 맮; + 頥 祭 ॣ eax ᫥ ⥬ 맮. - PROCEDURE malloc(size: INTEGER): INTEGER - 뤥 . - size - ࠧ , - 頥 뤥 + PROCEDURE malloc(size: INTEGER): INTEGER + 뤥 . + size - ࠧ , + 頥 뤥 - PROCEDURE free(ptr: INTEGER): INTEGER - ᢮ ࠭ 뤥 ᮬ ptr, - 頥 0 + PROCEDURE free(ptr: INTEGER): INTEGER + ᢮ ࠭ 뤥 ᮬ ptr, + 頥 0 - PROCEDURE realloc(ptr, size: INTEGER): INTEGER - । , - ptr - ࠭ 뤥 , - size - ࠧ, - 頥 㪠⥫ । , - 0 訡 + PROCEDURE realloc(ptr, size: INTEGER): INTEGER + । , + ptr - ࠭ 뤥 , + size - ࠧ, + 頥 㪠⥫ । , + 0 訡 - PROCEDURE GetCommandLine(): INTEGER - 頥 ப ࠬ஢ + PROCEDURE GetCommandLine(): INTEGER + 頥 ப ࠬ஢ - PROCEDURE GetName(): INTEGER - 頥 ப ணࠬ + PROCEDURE GetName(): INTEGER + 頥 ப ணࠬ - PROCEDURE LoadLib(name: ARRAY OF CHAR): INTEGER - 㦠 DLL name. 頥 ⠡ - ᯮ. 訡 頥 0. + PROCEDURE LoadLib(name: ARRAY OF CHAR): INTEGER + 㦠 DLL name. 頥 ⠡ + ᯮ. 訡 頥 0. - PROCEDURE GetProcAdr(name: ARRAY OF CHAR; lib: INTEGER): INTEGER - name - 楤 - lib - ⠡ ᯮ DLL - 頥 楤. 訡 頥 0. + PROCEDURE GetProcAdr(name: ARRAY OF CHAR; lib: INTEGER): INTEGER + name - 楤 + lib - ⠡ ᯮ DLL + 頥 楤. 訡 頥 0. ------------------------------------------------------------------------------ MODULE ColorDlg - ࠡ "Color Dialog" - TYPE + TYPE - Dialog = POINTER TO RECORD (* *) - status: INTEGER (* ﭨ : - 0 - 짮⥫ Cancel - 1 - 짮⥫ OK - 2 - *) + Dialog = POINTER TO RECORD (* *) + status: INTEGER (* ﭨ : + 0 - 짮⥫ Cancel + 1 - 짮⥫ OK + 2 - *) - color: INTEGER (* ࠭ 梥 *) - END + color: INTEGER (* ࠭ 梥 *) + END - PROCEDURE Create(draw_window: DRAW_WINDOW): Dialog - ᮧ - draw_window - 楤 ᮢ ᭮ - (TYPE DRAW_WINDOW = PROCEDURE); - 楤 頥 㪠⥫ + PROCEDURE Create(draw_window: DRAW_WINDOW): Dialog + ᮧ + draw_window - 楤 ᮢ ᭮ + (TYPE DRAW_WINDOW = PROCEDURE); + 楤 頥 㪠⥫ - PROCEDURE Show(cd: Dialog) - - cd - 㪠⥫ , ᮧ ࠭ - 楤ன Create + PROCEDURE Show(cd: Dialog) + + cd - 㪠⥫ , ᮧ ࠭ + 楤ன Create - PROCEDURE Destroy(VAR cd: Dialog) - 㭨⮦ - cd - 㪠⥫ + PROCEDURE Destroy(VAR cd: Dialog) + 㭨⮦ + cd - 㪠⥫ ------------------------------------------------------------------------------ MODULE OpenDlg - ࠡ "Open Dialog" - TYPE + TYPE - Dialog = POINTER TO RECORD (* *) - status: INTEGER (* ﭨ : - 0 - 짮⥫ Cancel - 1 - 짮⥫ OK - 2 - *) + Dialog = POINTER TO RECORD (* *) + status: INTEGER (* ﭨ : + 0 - 짮⥫ Cancel + 1 - 짮⥫ OK + 2 - *) - FileName: ARRAY 4096 OF CHAR (* ࠭ 䠩 *) - FilePath: ARRAY 4096 OF CHAR (* ࠭ - 䠩 *) - END + FileName: ARRAY 4096 OF CHAR (* ࠭ 䠩 *) + FilePath: ARRAY 4096 OF CHAR (* ࠭ + 䠩 *) + END - PROCEDURE Create(draw_window: DRAW_WINDOW; type: INTEGER; def_path, - filter: ARRAY OF CHAR): Dialog - ᮧ - draw_window - 楤 ᮢ ᭮ - (TYPE DRAW_WINDOW = PROCEDURE) - type - ⨯ - 0 - - 1 - ࠭ - 2 - - def_path - 㬮砭, def_path 㤥 - ࢮ ᪥ - filter - ப ᠭ ᫥ ७ 䠩, - , ७ - ࠧ ᨬ "|", ਬ: "ASM|TXT|INI" - 楤 頥 㪠⥫ + PROCEDURE Create(draw_window: DRAW_WINDOW; type: INTEGER; def_path, + filter: ARRAY OF CHAR): Dialog + ᮧ + draw_window - 楤 ᮢ ᭮ + (TYPE DRAW_WINDOW = PROCEDURE) + type - ⨯ + 0 - + 1 - ࠭ + 2 - + def_path - 㬮砭, def_path 㤥 + ࢮ ᪥ + filter - ப ᠭ ᫥ ७ 䠩, + , ७ + ࠧ ᨬ "|", ਬ: "ASM|TXT|INI" + 楤 頥 㪠⥫ - PROCEDURE Show(od: Dialog; Width, Height: INTEGER) - - od - 㪠⥫ , ᮧ ࠭ - 楤ன Create - Width Height - ਭ + PROCEDURE Show(od: Dialog; Width, Height: INTEGER) + + od - 㪠⥫ , ᮧ ࠭ + 楤ன Create + Width Height - ਭ - PROCEDURE Destroy(VAR od: Dialog) - 㭨⮦ - od - 㪠⥫ + PROCEDURE Destroy(VAR od: Dialog) + 㭨⮦ + od - 㪠⥫ ------------------------------------------------------------------------------ MODULE kfonts - ࠡ kf-⠬ - CONST + CONST - bold = 1 - italic = 2 - underline = 4 - strike_through = 8 - smoothing = 16 - bpp32 = 32 + bold = 1 + italic = 2 + underline = 4 + strike_through = 8 + smoothing = 16 + bpp32 = 32 - TYPE + TYPE - TFont = POINTER TO TFont_desc (* 㪠⥫ *) + TFont = POINTER TO TFont_desc (* 㪠⥫ *) - PROCEDURE LoadFont(file_name: ARRAY OF CHAR): TFont - 㧨 䠩 - file_name kf-䠩 - १-: 㪠⥫ /NIL (訡) + PROCEDURE LoadFont(file_name: ARRAY OF CHAR): TFont + 㧨 䠩 + file_name kf-䠩 + १-: 㪠⥫ /NIL (訡) - PROCEDURE SetSize(Font: TFont; font_size: INTEGER): BOOLEAN - ⠭ ࠧ - Font 㪠⥫ - font_size ࠧ - १-: TRUE/FALSE (訡) + PROCEDURE SetSize(Font: TFont; font_size: INTEGER): BOOLEAN + ⠭ ࠧ + Font 㪠⥫ + font_size ࠧ + १-: TRUE/FALSE (訡) - PROCEDURE Enabled(Font: TFont; font_size: INTEGER): BOOLEAN - ஢, , ࠧ - Font 㪠⥫ - font_size ࠧ - १-: TRUE/FALSE ( ) + PROCEDURE Enabled(Font: TFont; font_size: INTEGER): BOOLEAN + ஢, , ࠧ + Font 㪠⥫ + font_size ࠧ + १-: TRUE/FALSE ( ) - PROCEDURE Destroy(VAR Font: TFont) - 㧨 , ᢮ - Font 㪠⥫ - ᢠ ६ Font 祭 NIL + PROCEDURE Destroy(VAR Font: TFont) + 㧨 , ᢮ + Font 㪠⥫ + ᢠ ६ Font 祭 NIL - PROCEDURE TextHeight(Font: TFont): INTEGER - ப ⥪ - Font 㪠⥫ - १-: ப ⥪ ᥫ + PROCEDURE TextHeight(Font: TFont): INTEGER + ப ⥪ + Font 㪠⥫ + १-: ப ⥪ ᥫ - PROCEDURE TextWidth(Font: TFont; - str, length, params: INTEGER): INTEGER - ਭ ப ⥪ - Font 㪠⥫ - str ப ⥪ ஢ Win-1251 - length ⢮ ᨬ ப -1, ᫨ ப - 蠥 㫥 - params ࠬ-䫠 . - १-: ਭ ப ⥪ ᥫ + PROCEDURE TextWidth(Font: TFont; + str, length, params: INTEGER): INTEGER + ਭ ப ⥪ + Font 㪠⥫ + str ப ⥪ ஢ Win-1251 + length ⢮ ᨬ ப -1, ᫨ ப + 蠥 㫥 + params ࠬ-䫠 . + १-: ਭ ப ⥪ ᥫ - PROCEDURE TextOut(Font: TFont; - canvas, x, y, str, length, color, params: INTEGER) - 뢥 ⥪ - 뢮 , ᯮ짮 .65 - .7 (᫨ 24-) - Font 㪠⥫ - canvas ᪮ - : - Xsize dd - Ysize dd - picture rb Xsize * Ysize * 4 (32 ) - Xsize * Ysize * 3 (24 ) - x, y न ⥪ ⭮⥫쭮 孥 - 㣫 - str ப ⥪ ஢ Win-1251 - length ⢮ ᨬ ப -1, ᫨ ப - 蠥 㫥 - color 梥 ⥪ 0x00RRGGBB - params ࠬ-䫠: - 1 - 2 ᨢ - 4 ભ - 8 ભ - 16 ਬ ᣫ - 32 뢮 32- - ᯮ짮 䫠 ⠭ + PROCEDURE TextOut(Font: TFont; + canvas, x, y, str, length, color, params: INTEGER) + 뢥 ⥪ + 뢮 , ᯮ짮 .65 + .7 (᫨ 24-) + Font 㪠⥫ + canvas ᪮ + : + Xsize dd + Ysize dd + picture rb Xsize * Ysize * 4 (32 ) + Xsize * Ysize * 3 (24 ) + x, y न ⥪ ⭮⥫쭮 孥 + 㣫 + str ப ⥪ ஢ Win-1251 + length ⢮ ᨬ ப -1, ᫨ ப + 蠥 㫥 + color 梥 ⥪ 0x00RRGGBB + params ࠬ-䫠: + 1 + 2 ᨢ + 4 ભ + 8 ભ + 16 ਬ ᣫ + 32 뢮 32- + ᯮ짮 䫠 ⠭ ------------------------------------------------------------------------------ MODULE RasterWorks - ⪠ ⥪ Rasterworks.obj ------------------------------------------------------------------------------ diff --git a/programs/develop/oberon07/Lib/KolibriOS/API.ob07 b/programs/develop/oberon07/Lib/KolibriOS/API.ob07 index 1c4d680f79..1786326c47 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/API.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/API.ob07 @@ -1,4 +1,4 @@ -(* +(* BSD 2-Clause License Copyright (c) 2018, Anton Krotov @@ -18,6 +18,8 @@ CONST _new = 1; _dispose = 2; + SizeOfHeader = 36; + TYPE @@ -294,7 +296,7 @@ PROCEDURE init* (_import, code: INTEGER); BEGIN multi := FALSE; eol[0] := 0DX; eol[1] := 0AX; eol[2] := 0X; - base := code - 36; + base := code - SizeOfHeader; K.sysfunc2(68, 11); InitializeCriticalSection(CriticalSection); K._init; @@ -316,4 +318,4 @@ PROCEDURE GetTickCount* (): INTEGER; END GetTickCount; -END API. \ No newline at end of file +END API. diff --git a/programs/develop/oberon07/Lib/KolibriOS/Args.ob07 b/programs/develop/oberon07/Lib/KolibriOS/Args.ob07 index 889059d0a4..20856c87af 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/Args.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/Args.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -97,4 +97,4 @@ END GetArg; BEGIN ParamParse -END Args. \ No newline at end of file +END Args. diff --git a/programs/develop/oberon07/Lib/KolibriOS/ColorDlg.ob07 b/programs/develop/oberon07/Lib/KolibriOS/ColorDlg.ob07 index e993d375cb..5cf255ce9c 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/ColorDlg.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/ColorDlg.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -102,4 +102,4 @@ END Load; BEGIN Load -END ColorDlg. \ No newline at end of file +END ColorDlg. diff --git a/programs/develop/oberon07/Lib/KolibriOS/Console.ob07 b/programs/develop/oberon07/Lib/KolibriOS/Console.ob07 index 7d80c4fb01..ee5c5d1f94 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/Console.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/Console.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify diff --git a/programs/develop/oberon07/Lib/KolibriOS/ConsoleLib.ob07 b/programs/develop/oberon07/Lib/KolibriOS/ConsoleLib.ob07 index 74346a692c..74ee3f3d43 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/ConsoleLib.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/ConsoleLib.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -100,4 +100,4 @@ END main; BEGIN main -END ConsoleLib. \ No newline at end of file +END ConsoleLib. diff --git a/programs/develop/oberon07/Lib/KolibriOS/DateTime.ob07 b/programs/develop/oberon07/Lib/KolibriOS/DateTime.ob07 index 12291065f6..e44bde1510 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/DateTime.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/DateTime.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -138,4 +138,4 @@ BEGIN Msec := 0 END Now; -END DateTime. \ No newline at end of file +END DateTime. diff --git a/programs/develop/oberon07/Lib/KolibriOS/Debug.ob07 b/programs/develop/oberon07/Lib/KolibriOS/Debug.ob07 index daaf40ece1..b341b83fc0 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/Debug.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/Debug.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -289,4 +289,4 @@ BEGIN res := KOSAPI.sysfunc2(70, sys.ADR(info)) END Open; -END Debug. \ No newline at end of file +END Debug. diff --git a/programs/develop/oberon07/Lib/KolibriOS/File.ob07 b/programs/develop/oberon07/Lib/KolibriOS/File.ob07 index d25a8d6938..ff61c5863c 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/File.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/File.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -313,4 +313,4 @@ BEGIN END DeleteDir; -END File. \ No newline at end of file +END File. diff --git a/programs/develop/oberon07/Lib/KolibriOS/HOST.ob07 b/programs/develop/oberon07/Lib/KolibriOS/HOST.ob07 index 3a43347bc0..10a9def866 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/HOST.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/HOST.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -205,7 +205,7 @@ BEGIN END Create; -PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER; +PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER; VAR n: INTEGER; fs: FS; @@ -468,4 +468,4 @@ BEGIN con_init(-1, -1, -1, -1, SYSTEM.SADR("Oberon-07 for KolibriOS")) END; ParamParse -END HOST. \ No newline at end of file +END HOST. diff --git a/programs/develop/oberon07/Lib/KolibriOS/In.ob07 b/programs/develop/oberon07/Lib/KolibriOS/In.ob07 index 50af0cb957..6401c6dc18 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/In.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/In.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify diff --git a/programs/develop/oberon07/Lib/KolibriOS/KOSAPI.ob07 b/programs/develop/oberon07/Lib/KolibriOS/KOSAPI.ob07 index 4cf92fc861..de4a9d9b99 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/KOSAPI.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/KOSAPI.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -427,4 +427,4 @@ BEGIN END _init; -END KOSAPI. \ No newline at end of file +END KOSAPI. diff --git a/programs/develop/oberon07/Lib/KolibriOS/Math.ob07 b/programs/develop/oberon07/Lib/KolibriOS/Math.ob07 index b1fe62acc0..b49668351d 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/Math.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/Math.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2013, 2014, 2018, 2019 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -381,4 +381,4 @@ BEGIN END fact; -END Math. \ No newline at end of file +END Math. diff --git a/programs/develop/oberon07/Lib/KolibriOS/NetDevices.ob07 b/programs/develop/oberon07/Lib/KolibriOS/NetDevices.ob07 index c0ed629f9c..93d0dbc7b8 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/NetDevices.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/NetDevices.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2017 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -104,4 +104,4 @@ PROCEDURE LinkStatus* (num: INTEGER): INTEGER; END LinkStatus; -END NetDevices. \ No newline at end of file +END NetDevices. diff --git a/programs/develop/oberon07/Lib/KolibriOS/OpenDlg.ob07 b/programs/develop/oberon07/Lib/KolibriOS/OpenDlg.ob07 index 9bffd20f21..6240eb2b26 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/OpenDlg.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/OpenDlg.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -150,4 +150,4 @@ END Load; BEGIN Load -END OpenDlg. \ No newline at end of file +END OpenDlg. diff --git a/programs/develop/oberon07/Lib/KolibriOS/Out.ob07 b/programs/develop/oberon07/Lib/KolibriOS/Out.ob07 index 02cc14e017..04de78c75e 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/Out.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/Out.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -264,4 +264,4 @@ END FixReal; PROCEDURE Open*; END Open; -END Out. \ No newline at end of file +END Out. diff --git a/programs/develop/oberon07/Lib/KolibriOS/RTL.ob07 b/programs/develop/oberon07/Lib/KolibriOS/RTL.ob07 index 0a33a3269c..3aa6c454e1 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/RTL.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/RTL.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -16,13 +16,13 @@ CONST maxint* = 7FFFFFFFH; minint* = 80000000H; - DLL_PROCESS_ATTACH = 1; - DLL_THREAD_ATTACH = 2; - DLL_THREAD_DETACH = 3; - DLL_PROCESS_DETACH = 0; + DLL_PROCESS_ATTACH = 1; + DLL_THREAD_ATTACH = 2; + DLL_THREAD_DETACH = 3; + DLL_PROCESS_DETACH = 0; - SIZE_OF_DWORD = 4; - MAX_SET = 31; + WORD = bit_depth DIV 8; + MAX_SET = bit_depth - 1; TYPE @@ -35,6 +35,7 @@ VAR name: INTEGER; types: INTEGER; + bits: ARRAY MAX_SET + 1 OF INTEGER; dll: RECORD process_detach, @@ -45,35 +46,9 @@ VAR fini: PROC; -PROCEDURE [stdcall] _move* (bytes, source, dest: INTEGER); +PROCEDURE [stdcall] _move* (bytes, dest, source: INTEGER); BEGIN SYSTEM.CODE( - - 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) - 085H, 0C0H, (* test eax, eax *) - 07EH, 019H, (* jle L *) - 0FCH, (* cld *) - 057H, (* push edi *) - 056H, (* push esi *) - 08BH, 075H, 00CH, (* mov esi, dword [ebp + 12] *) - 08BH, 07DH, 010H, (* mov edi, dword [ebp + 16] *) - 089H, 0C1H, (* mov ecx, eax *) - 0C1H, 0E9H, 002H, (* shr ecx, 2 *) - 0F3H, 0A5H, (* rep movsd *) - 089H, 0C1H, (* mov ecx, eax *) - 083H, 0E1H, 003H, (* and ecx, 3 *) - 0F3H, 0A4H, (* rep movsb *) - 05EH, (* pop esi *) - 05FH (* pop edi *) - (* L: *) - ) -END _move; - - -PROCEDURE [stdcall] _move2* (bytes, dest, source: INTEGER); -BEGIN - SYSTEM.CODE( - 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) 085H, 0C0H, (* test eax, eax *) 07EH, 019H, (* jle L *) @@ -92,7 +67,7 @@ BEGIN 05FH (* pop edi *) (* L: *) ) -END _move2; +END _move; PROCEDURE [stdcall] _arrcpy* (base_size, len_dst, dst, len_src, src: INTEGER): BOOLEAN; @@ -103,7 +78,7 @@ BEGIN IF len_src > len_dst THEN res := FALSE ELSE - _move(len_src * base_size, src, dst); + _move(len_src * base_size, dst, src); res := TRUE END @@ -113,7 +88,7 @@ END _arrcpy; PROCEDURE [stdcall] _strcpy* (chr_size, len_src, src, len_dst, dst: INTEGER); BEGIN - _move(MIN(len_dst, len_src) * chr_size, src, dst) + _move(MIN(len_dst, len_src) * chr_size, dst, src) END _strcpy; @@ -144,7 +119,7 @@ BEGIN IF a < 0 THEN a := 0 END; - a := LSR(ASR(ROR(1, 1), b - a), MAX_SET - b) + a := LSR(ASR(minint, b - a), MAX_SET - b) ELSE a := 0 END @@ -153,69 +128,42 @@ BEGIN END _set; -PROCEDURE [stdcall] _set2* (a, b: INTEGER): INTEGER; - RETURN _set(b, a) -END _set2; +PROCEDURE [stdcall] _set1* (a: INTEGER): INTEGER; +BEGIN + IF ASR(a, 5) = 0 THEN + SYSTEM.GET(SYSTEM.ADR(bits[0]) + a * WORD, a) + ELSE + a := 0 + END + RETURN a +END _set1; -PROCEDURE [stdcall] divmod (a, b: INTEGER; VAR mod: INTEGER): INTEGER; +PROCEDURE [stdcall] _divmod* (y, x: INTEGER); (* (x div y) -> eax; (x mod y) -> edx *) BEGIN SYSTEM.CODE( - - 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) - 08BH, 04DH, 00CH, (* mov ecx, dword [ebp + 12] *) + 053H, (* push ebx *) + 08BH, 045H, 00CH, (* mov eax, dword [ebp + 12] *) (* eax <- x *) 031H, 0D2H, (* xor edx, edx *) 085H, 0C0H, (* test eax, eax *) - 07DH, 002H, (* jge L1 *) + 074H, 018H, (* je L2 *) + 07FH, 002H, (* jg L1 *) 0F7H, 0D2H, (* not edx *) (* L1: *) + 089H, 0C3H, (* mov ebx, eax *) + 08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *) (* ecx <- y *) 0F7H, 0F9H, (* idiv ecx *) - 08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *) - 089H, 011H, (* mov dword [ecx], edx *) - 0C9H, (* leave *) - 0C2H, 00CH, 000H (* ret 12 *) + 085H, 0D2H, (* test edx, edx *) + 074H, 009H, (* je L2 *) + 031H, 0CBH, (* xor ebx, ecx *) + 085H, 0DBH, (* test ebx, ebx *) + 07DH, 003H, (* jge L2 *) + 048H, (* dec eax *) + 001H, 0CAH, (* add edx, ecx *) + (* L2: *) + 05BH (* pop ebx *) ) - - RETURN 0 -END divmod; - - -PROCEDURE [stdcall] _div2* (x, y: INTEGER): INTEGER; -VAR - div, mod: INTEGER; - -BEGIN - div := divmod(x, y, mod); - IF (mod # 0) & ((x < 0) & (y > 0) OR (x > 0) & (y < 0)) THEN - DEC(div) - END - - RETURN div -END _div2; - - -PROCEDURE [stdcall] _mod2* (x, y: INTEGER): INTEGER; -VAR - div, mod: INTEGER; - -BEGIN - div := divmod(x, y, mod); - IF (mod # 0) & ((x < 0) & (y > 0) OR (x > 0) & (y < 0)) THEN - INC(mod, y) - END - - RETURN mod -END _mod2; - - -PROCEDURE [stdcall] _div* (b, a: INTEGER): INTEGER; - RETURN _div2(a, b) -END _div; - - -PROCEDURE [stdcall] _mod* (b, a: INTEGER): INTEGER; - RETURN _mod2(a, b) -END _mod; +END _divmod; PROCEDURE [stdcall] _new* (t, size: INTEGER; VAR ptr: INTEGER); @@ -223,7 +171,7 @@ BEGIN ptr := API._NEW(size); IF ptr # 0 THEN SYSTEM.PUT(ptr, t); - INC(ptr, SIZE_OF_DWORD) + INC(ptr, WORD) END END _new; @@ -231,15 +179,14 @@ END _new; PROCEDURE [stdcall] _dispose* (VAR ptr: INTEGER); BEGIN IF ptr # 0 THEN - ptr := API._DISPOSE(ptr - SIZE_OF_DWORD) + ptr := API._DISPOSE(ptr - WORD) END END _dispose; -PROCEDURE [stdcall] _length* (len, str: INTEGER): INTEGER; +PROCEDURE [stdcall] _length* (len, str: INTEGER); BEGIN SYSTEM.CODE( - 08BH, 045H, 00CH, (* mov eax, dword [ebp + 0Ch] *) 08BH, 04DH, 008H, (* mov ecx, dword [ebp + 08h] *) 048H, (* dec eax *) @@ -250,19 +197,14 @@ BEGIN 0E2H, 0F8H, (* loop L1 *) 040H, (* inc eax *) (* L2: *) - 02BH, 045H, 00CH, (* sub eax, dword [ebp + 0Ch] *) - 0C9H, (* leave *) - 0C2H, 008H, 000H (* ret 08h *) + 02BH, 045H, 00CH (* sub eax, dword [ebp + 0Ch] *) ) - - RETURN 0 END _length; -PROCEDURE [stdcall] _lengthw* (len, str: INTEGER): INTEGER; +PROCEDURE [stdcall] _lengthw* (len, str: INTEGER); BEGIN SYSTEM.CODE( - 08BH, 045H, 00CH, (* mov eax, dword [ebp + 0Ch] *) 08BH, 04DH, 008H, (* mov ecx, dword [ebp + 08h] *) 048H, (* dec eax *) @@ -277,58 +219,92 @@ BEGIN 040H, (* inc eax *) (* L2: *) 02BH, 045H, 00CH, (* sub eax, dword [ebp + 0Ch] *) - 0D1H, 0E8H, (* shr eax, 1 *) - 0C9H, (* leave *) - 0C2H, 008H, 000H (* ret 08h *) + 0D1H, 0E8H (* shr eax, 1 *) ) - - RETURN 0 END _lengthw; -PROCEDURE strncmp (a, b, n: INTEGER): INTEGER; -VAR - A, B: CHAR; - res: INTEGER; - +PROCEDURE [stdcall] strncmp (a, b, n: INTEGER): INTEGER; BEGIN - res := minint; - WHILE n > 0 DO - SYSTEM.GET(a, A); INC(a); - SYSTEM.GET(b, B); INC(b); - DEC(n); - IF A # B THEN - res := ORD(A) - ORD(B); - n := 0 - ELSIF A = 0X THEN - res := 0; - n := 0 - END - END - RETURN res + SYSTEM.CODE( + 056H, (* push esi *) + 057H, (* push edi *) + 053H, (* push ebx *) + 08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *) + 08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *) + 08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *) + 031H, 0C9H, (* xor ecx, ecx *) + 031H, 0D2H, (* xor edx, edx *) + 0B8H, + 000H, 000H, 000H, 080H, (* mov eax, minint *) + (* L1: *) + 085H, 0DBH, (* test ebx, ebx *) + 07EH, 017H, (* jle L3 *) + 08AH, 00EH, (* mov cl, byte[esi] *) + 08AH, 017H, (* mov dl, byte[edi] *) + 046H, (* inc esi *) + 047H, (* inc edi *) + 04BH, (* dec ebx *) + 039H, 0D1H, (* cmp ecx, edx *) + 074H, 006H, (* je L2 *) + 089H, 0C8H, (* mov eax, ecx *) + 029H, 0D0H, (* sub eax, edx *) + 0EBH, 006H, (* jmp L3 *) + (* L2: *) + 085H, 0C9H, (* test ecx, ecx *) + 075H, 0E7H, (* jne L1 *) + 031H, 0C0H, (* xor eax, eax *) + (* L3: *) + 05BH, (* pop ebx *) + 05FH, (* pop edi *) + 05EH, (* pop esi *) + 05DH, (* pop ebp *) + 0C2H, 00CH, 000H (* ret 12 *) + ) + RETURN 0 END strncmp; -PROCEDURE strncmpw (a, b, n: INTEGER): INTEGER; -VAR - A, B: WCHAR; - res: INTEGER; - +PROCEDURE [stdcall] strncmpw (a, b, n: INTEGER): INTEGER; BEGIN - res := minint; - WHILE n > 0 DO - SYSTEM.GET(a, A); INC(a, 2); - SYSTEM.GET(b, B); INC(b, 2); - DEC(n); - IF A # B THEN - res := ORD(A) - ORD(B); - n := 0 - ELSIF A = 0X THEN - res := 0; - n := 0 - END - END - RETURN res + SYSTEM.CODE( + 056H, (* push esi *) + 057H, (* push edi *) + 053H, (* push ebx *) + 08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *) + 08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *) + 08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *) + 031H, 0C9H, (* xor ecx, ecx *) + 031H, 0D2H, (* xor edx, edx *) + 0B8H, + 000H, 000H, 000H, 080H, (* mov eax, minint *) + (* L1: *) + 085H, 0DBH, (* test ebx, ebx *) + 07EH, 01BH, (* jle L3 *) + 066H, 08BH, 00EH, (* mov cx, word[esi] *) + 066H, 08BH, 017H, (* mov dx, word[edi] *) + 046H, (* inc esi *) + 046H, (* inc esi *) + 047H, (* inc edi *) + 047H, (* inc edi *) + 04BH, (* dec ebx *) + 039H, 0D1H, (* cmp ecx, edx *) + 074H, 006H, (* je L2 *) + 089H, 0C8H, (* mov eax, ecx *) + 029H, 0D0H, (* sub eax, edx *) + 0EBH, 006H, (* jmp L3 *) + (* L2: *) + 085H, 0C9H, (* test ecx, ecx *) + 075H, 0E3H, (* jne L1 *) + 031H, 0C0H, (* xor eax, eax *) + (* L3: *) + 05BH, (* pop ebx *) + 05FH, (* pop edi *) + 05EH, (* pop esi *) + 05DH, (* pop ebp *) + 0C2H, 00CH, 000H (* ret 12 *) + ) + RETURN 0 END strncmpw; @@ -507,7 +483,7 @@ END _isrec; PROCEDURE [stdcall] _is* (t0, p: INTEGER): INTEGER; BEGIN IF p # 0 THEN - SYSTEM.GET(p - SIZE_OF_DWORD, p); + SYSTEM.GET(p - WORD, p); SYSTEM.GET(t0 + p + types, p) END @@ -526,7 +502,7 @@ PROCEDURE [stdcall] _guard* (t0, p: INTEGER): INTEGER; BEGIN SYSTEM.GET(p, p); IF p # 0 THEN - SYSTEM.GET(p - SIZE_OF_DWORD, p); + SYSTEM.GET(p - WORD, p); SYSTEM.GET(t0 + p + types, p) ELSE p := 1 @@ -567,14 +543,6 @@ BEGIN END _dllentry; -PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY); -BEGIN - dll.process_detach := process_detach; - dll.thread_detach := thread_detach; - dll.thread_attach := thread_attach -END SetDll; - - PROCEDURE [stdcall] _exit* (code: INTEGER); BEGIN API.exit(code) @@ -596,14 +564,20 @@ BEGIN t0 := i; t1 := j; WHILE (t1 # 0) & (t1 # t0) DO - SYSTEM.GET(_types + t1 * SIZE_OF_DWORD, t1) + SYSTEM.GET(_types + t1 * WORD, t1) END; SYSTEM.PUT8(i * tcount + j + types, ORD(t0 = t1)) END END; - name := modname; + j := 1; + FOR i := 0 TO MAX_SET DO + bits[i] := j; + j := LSL(j, 1) + END; + + name := modname; dll.process_detach := NIL; dll.thread_detach := NIL; @@ -621,10 +595,18 @@ BEGIN END _sofinit; +PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY); +BEGIN + dll.process_detach := process_detach; + dll.thread_detach := thread_detach; + dll.thread_attach := thread_attach +END SetDll; + + PROCEDURE SetFini* (ProcFini: PROC); BEGIN fini := ProcFini END SetFini; -END RTL. \ No newline at end of file +END RTL. diff --git a/programs/develop/oberon07/Lib/KolibriOS/RasterWorks.ob07 b/programs/develop/oberon07/Lib/KolibriOS/RasterWorks.ob07 index 5c804aa180..dc814845ca 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/RasterWorks.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/RasterWorks.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 KolibriOS team This program is free software: you can redistribute it and/or modify @@ -121,4 +121,4 @@ END main; BEGIN main -END RasterWorks. \ No newline at end of file +END RasterWorks. diff --git a/programs/develop/oberon07/Lib/KolibriOS/Read.ob07 b/programs/develop/oberon07/Lib/KolibriOS/Read.ob07 index c9df9d2c4f..85bb58d801 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/Read.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/Read.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -39,8 +39,8 @@ PROCEDURE Set*(F: File.FS; VAR x: SET): BOOLEAN; RETURN File.Read(F, sys.ADR(x), sys.SIZE(SET)) = sys.SIZE(SET) END Set; -PROCEDURE Card16*(F: File.FS; VAR x: sys.CARD16): BOOLEAN; - RETURN File.Read(F, sys.ADR(x), sys.SIZE(sys.CARD16)) = sys.SIZE(sys.CARD16) -END Card16; +PROCEDURE WChar*(F: File.FS; VAR x: WCHAR): BOOLEAN; + RETURN File.Read(F, sys.ADR(x), sys.SIZE(WCHAR)) = sys.SIZE(WCHAR) +END WChar; -END Read. \ No newline at end of file +END Read. diff --git a/programs/develop/oberon07/Source/UNIXTIME.ob07 b/programs/develop/oberon07/Lib/KolibriOS/UnixTime.ob07 similarity index 88% rename from programs/develop/oberon07/Source/UNIXTIME.ob07 rename to programs/develop/oberon07/Lib/KolibriOS/UnixTime.ob07 index e5f6ce39de..138e4297fa 100644 --- a/programs/develop/oberon07/Source/UNIXTIME.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/UnixTime.ob07 @@ -1,11 +1,11 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) -MODULE UNIXTIME; +MODULE UnixTime; VAR @@ -61,4 +61,4 @@ END time; BEGIN init -END UNIXTIME. \ No newline at end of file +END UnixTime. diff --git a/programs/develop/oberon07/Lib/KolibriOS/Vector.ob07 b/programs/develop/oberon07/Lib/KolibriOS/Vector.ob07 index 46de391ccd..0792204a98 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/Vector.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/Vector.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -118,4 +118,4 @@ BEGIN END destroy; -END Vector. \ No newline at end of file +END Vector. diff --git a/programs/develop/oberon07/Lib/KolibriOS/Write.ob07 b/programs/develop/oberon07/Lib/KolibriOS/Write.ob07 index 153b2bb930..7a9823f25b 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/Write.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/Write.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -39,8 +39,8 @@ PROCEDURE Set*(F: File.FS; x: SET): BOOLEAN; RETURN File.Write(F, sys.ADR(x), sys.SIZE(SET)) = sys.SIZE(SET) END Set; -PROCEDURE Card16*(F: File.FS; x: sys.CARD16): BOOLEAN; - RETURN File.Write(F, sys.ADR(x), sys.SIZE(sys.CARD16)) = sys.SIZE(sys.CARD16) -END Card16; +PROCEDURE WChar*(F: File.FS; x: WCHAR): BOOLEAN; + RETURN File.Write(F, sys.ADR(x), sys.SIZE(WCHAR)) = sys.SIZE(WCHAR) +END WChar; -END Write. \ No newline at end of file +END Write. diff --git a/programs/develop/oberon07/Lib/KolibriOS/kfonts.ob07 b/programs/develop/oberon07/Lib/KolibriOS/kfonts.ob07 index 8ef267a004..67c1080406 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/kfonts.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/kfonts.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 Anton Krotov This program is free software: you can redistribute it and/or modify @@ -489,4 +489,4 @@ BEGIN RETURN Font END LoadFont; -END kfonts. \ No newline at end of file +END kfonts. diff --git a/programs/develop/oberon07/Lib/KolibriOS/libimg.ob07 b/programs/develop/oberon07/Lib/KolibriOS/libimg.ob07 index 425f74034a..9c5a516a96 100644 --- a/programs/develop/oberon07/Lib/KolibriOS/libimg.ob07 +++ b/programs/develop/oberon07/Lib/KolibriOS/libimg.ob07 @@ -1,4 +1,4 @@ -(* +(* Copyright 2016, 2018 KolibriOS team This program is free software: you can redistribute it and/or modify @@ -432,4 +432,4 @@ END main; BEGIN main -END libimg. \ No newline at end of file +END libimg. diff --git a/programs/develop/oberon07/Lib/Linux32/API.ob07 b/programs/develop/oberon07/Lib/Linux32/API.ob07 index b461216a69..42a337fd01 100644 --- a/programs/develop/oberon07/Lib/Linux32/API.ob07 +++ b/programs/develop/oberon07/Lib/Linux32/API.ob07 @@ -1,4 +1,4 @@ -(* +(* BSD 2-Clause License Copyright (c) 2019, Anton Krotov @@ -12,7 +12,7 @@ IMPORT SYSTEM; CONST - BASE_ADR = 08048000H; + RTLD_LAZY* = 1; TYPE @@ -22,8 +22,8 @@ TYPE VAR - eol*: ARRAY 2 OF CHAR; - base*, MainParam*: INTEGER; + eol*: ARRAY 2 OF CHAR; + MainParam*: INTEGER; libc*, librt*: INTEGER; @@ -93,6 +93,7 @@ END _DISPOSE; PROCEDURE GetProcAdr (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER); VAR sym: INTEGER; + BEGIN sym := dlsym(lib, SYSTEM.ADR(name[0])); ASSERT(sym # 0); @@ -105,10 +106,9 @@ BEGIN SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER) * 2, dlopen); SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER), dlsym); MainParam := sp; - base := BASE_ADR; eol := 0AX; - libc := dlopen(SYSTEM.SADR("libc.so.6"), 1); + libc := dlopen(SYSTEM.SADR("libc.so.6"), RTLD_LAZY); GetProcAdr(libc, "malloc", SYSTEM.ADR(malloc)); GetProcAdr(libc, "free", SYSTEM.ADR(free)); GetProcAdr(libc, "exit", SYSTEM.ADR(_exit)); @@ -125,7 +125,7 @@ BEGIN GetProcAdr(libc, "fclose", SYSTEM.ADR(fclose)); GetProcAdr(libc, "time", SYSTEM.ADR(time)); - librt := dlopen(SYSTEM.SADR("librt.so.1"), 1); + librt := dlopen(SYSTEM.SADR("librt.so.1"), RTLD_LAZY); GetProcAdr(librt, "clock_gettime", SYSTEM.ADR(clock_gettime)) END init; @@ -142,4 +142,4 @@ BEGIN END exit_thread; -END API. \ No newline at end of file +END API. diff --git a/programs/develop/oberon07/Lib/Linux32/HOST.ob07 b/programs/develop/oberon07/Lib/Linux32/HOST.ob07 index 967e2657bc..a2f43bc83c 100644 --- a/programs/develop/oberon07/Lib/Linux32/HOST.ob07 +++ b/programs/develop/oberon07/Lib/Linux32/HOST.ob07 @@ -1,4 +1,4 @@ -(* +(* BSD 2-Clause License Copyright (c) 2019, Anton Krotov @@ -68,22 +68,12 @@ BEGIN END GetCurrentDirectory; -PROCEDURE ReadFile (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER; - RETURN API.fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F) -END ReadFile; - - -PROCEDURE WriteFile (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER; - RETURN API.fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F) -END WriteFile; - - -PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER; +PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER; VAR res: INTEGER; BEGIN - res := ReadFile(F, Buffer, bytes); + res := API.fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F); IF res <= 0 THEN res := -1 END @@ -97,7 +87,7 @@ VAR res: INTEGER; BEGIN - res := WriteFile(F, Buffer, bytes); + res := API.fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F); IF res <= 0 THEN res := -1 END @@ -175,4 +165,4 @@ END splitf; BEGIN eol := 0AX; SYSTEM.GET(API.MainParam, argc) -END HOST. \ No newline at end of file +END HOST. diff --git a/programs/develop/oberon07/Lib/Linux32/LINAPI.ob07 b/programs/develop/oberon07/Lib/Linux32/LINAPI.ob07 index 9506a44109..d38c8b3f47 100644 --- a/programs/develop/oberon07/Lib/Linux32/LINAPI.ob07 +++ b/programs/develop/oberon07/Lib/Linux32/LINAPI.ob07 @@ -1,4 +1,4 @@ -(* +(* BSD 2-Clause License Copyright (c) 2019, Anton Krotov @@ -74,12 +74,18 @@ VAR ptr: INTEGER; BEGIN - envc := -1; - SYSTEM.GET(API.MainParam, argc); - REPEAT - SYSTEM.GET(API.MainParam + (envc + argc + 3) * SYSTEM.SIZE(INTEGER), ptr); - INC(envc) - UNTIL ptr = 0; + + IF API.MainParam # 0 THEN + envc := -1; + SYSTEM.GET(API.MainParam, argc); + REPEAT + SYSTEM.GET(API.MainParam + (envc + argc + 3) * SYSTEM.SIZE(INTEGER), ptr); + INC(envc) + UNTIL ptr = 0 + ELSE + envc := 0; + argc := 0 + END; libc := API.libc; @@ -128,4 +134,4 @@ END syscall; BEGIN init -END LINAPI. \ No newline at end of file +END LINAPI. diff --git a/programs/develop/oberon07/Lib/Linux32/RTL.ob07 b/programs/develop/oberon07/Lib/Linux32/RTL.ob07 index 0a33a3269c..3aa6c454e1 100644 --- a/programs/develop/oberon07/Lib/Linux32/RTL.ob07 +++ b/programs/develop/oberon07/Lib/Linux32/RTL.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -16,13 +16,13 @@ CONST maxint* = 7FFFFFFFH; minint* = 80000000H; - DLL_PROCESS_ATTACH = 1; - DLL_THREAD_ATTACH = 2; - DLL_THREAD_DETACH = 3; - DLL_PROCESS_DETACH = 0; + DLL_PROCESS_ATTACH = 1; + DLL_THREAD_ATTACH = 2; + DLL_THREAD_DETACH = 3; + DLL_PROCESS_DETACH = 0; - SIZE_OF_DWORD = 4; - MAX_SET = 31; + WORD = bit_depth DIV 8; + MAX_SET = bit_depth - 1; TYPE @@ -35,6 +35,7 @@ VAR name: INTEGER; types: INTEGER; + bits: ARRAY MAX_SET + 1 OF INTEGER; dll: RECORD process_detach, @@ -45,35 +46,9 @@ VAR fini: PROC; -PROCEDURE [stdcall] _move* (bytes, source, dest: INTEGER); +PROCEDURE [stdcall] _move* (bytes, dest, source: INTEGER); BEGIN SYSTEM.CODE( - - 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) - 085H, 0C0H, (* test eax, eax *) - 07EH, 019H, (* jle L *) - 0FCH, (* cld *) - 057H, (* push edi *) - 056H, (* push esi *) - 08BH, 075H, 00CH, (* mov esi, dword [ebp + 12] *) - 08BH, 07DH, 010H, (* mov edi, dword [ebp + 16] *) - 089H, 0C1H, (* mov ecx, eax *) - 0C1H, 0E9H, 002H, (* shr ecx, 2 *) - 0F3H, 0A5H, (* rep movsd *) - 089H, 0C1H, (* mov ecx, eax *) - 083H, 0E1H, 003H, (* and ecx, 3 *) - 0F3H, 0A4H, (* rep movsb *) - 05EH, (* pop esi *) - 05FH (* pop edi *) - (* L: *) - ) -END _move; - - -PROCEDURE [stdcall] _move2* (bytes, dest, source: INTEGER); -BEGIN - SYSTEM.CODE( - 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) 085H, 0C0H, (* test eax, eax *) 07EH, 019H, (* jle L *) @@ -92,7 +67,7 @@ BEGIN 05FH (* pop edi *) (* L: *) ) -END _move2; +END _move; PROCEDURE [stdcall] _arrcpy* (base_size, len_dst, dst, len_src, src: INTEGER): BOOLEAN; @@ -103,7 +78,7 @@ BEGIN IF len_src > len_dst THEN res := FALSE ELSE - _move(len_src * base_size, src, dst); + _move(len_src * base_size, dst, src); res := TRUE END @@ -113,7 +88,7 @@ END _arrcpy; PROCEDURE [stdcall] _strcpy* (chr_size, len_src, src, len_dst, dst: INTEGER); BEGIN - _move(MIN(len_dst, len_src) * chr_size, src, dst) + _move(MIN(len_dst, len_src) * chr_size, dst, src) END _strcpy; @@ -144,7 +119,7 @@ BEGIN IF a < 0 THEN a := 0 END; - a := LSR(ASR(ROR(1, 1), b - a), MAX_SET - b) + a := LSR(ASR(minint, b - a), MAX_SET - b) ELSE a := 0 END @@ -153,69 +128,42 @@ BEGIN END _set; -PROCEDURE [stdcall] _set2* (a, b: INTEGER): INTEGER; - RETURN _set(b, a) -END _set2; +PROCEDURE [stdcall] _set1* (a: INTEGER): INTEGER; +BEGIN + IF ASR(a, 5) = 0 THEN + SYSTEM.GET(SYSTEM.ADR(bits[0]) + a * WORD, a) + ELSE + a := 0 + END + RETURN a +END _set1; -PROCEDURE [stdcall] divmod (a, b: INTEGER; VAR mod: INTEGER): INTEGER; +PROCEDURE [stdcall] _divmod* (y, x: INTEGER); (* (x div y) -> eax; (x mod y) -> edx *) BEGIN SYSTEM.CODE( - - 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) - 08BH, 04DH, 00CH, (* mov ecx, dword [ebp + 12] *) + 053H, (* push ebx *) + 08BH, 045H, 00CH, (* mov eax, dword [ebp + 12] *) (* eax <- x *) 031H, 0D2H, (* xor edx, edx *) 085H, 0C0H, (* test eax, eax *) - 07DH, 002H, (* jge L1 *) + 074H, 018H, (* je L2 *) + 07FH, 002H, (* jg L1 *) 0F7H, 0D2H, (* not edx *) (* L1: *) + 089H, 0C3H, (* mov ebx, eax *) + 08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *) (* ecx <- y *) 0F7H, 0F9H, (* idiv ecx *) - 08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *) - 089H, 011H, (* mov dword [ecx], edx *) - 0C9H, (* leave *) - 0C2H, 00CH, 000H (* ret 12 *) + 085H, 0D2H, (* test edx, edx *) + 074H, 009H, (* je L2 *) + 031H, 0CBH, (* xor ebx, ecx *) + 085H, 0DBH, (* test ebx, ebx *) + 07DH, 003H, (* jge L2 *) + 048H, (* dec eax *) + 001H, 0CAH, (* add edx, ecx *) + (* L2: *) + 05BH (* pop ebx *) ) - - RETURN 0 -END divmod; - - -PROCEDURE [stdcall] _div2* (x, y: INTEGER): INTEGER; -VAR - div, mod: INTEGER; - -BEGIN - div := divmod(x, y, mod); - IF (mod # 0) & ((x < 0) & (y > 0) OR (x > 0) & (y < 0)) THEN - DEC(div) - END - - RETURN div -END _div2; - - -PROCEDURE [stdcall] _mod2* (x, y: INTEGER): INTEGER; -VAR - div, mod: INTEGER; - -BEGIN - div := divmod(x, y, mod); - IF (mod # 0) & ((x < 0) & (y > 0) OR (x > 0) & (y < 0)) THEN - INC(mod, y) - END - - RETURN mod -END _mod2; - - -PROCEDURE [stdcall] _div* (b, a: INTEGER): INTEGER; - RETURN _div2(a, b) -END _div; - - -PROCEDURE [stdcall] _mod* (b, a: INTEGER): INTEGER; - RETURN _mod2(a, b) -END _mod; +END _divmod; PROCEDURE [stdcall] _new* (t, size: INTEGER; VAR ptr: INTEGER); @@ -223,7 +171,7 @@ BEGIN ptr := API._NEW(size); IF ptr # 0 THEN SYSTEM.PUT(ptr, t); - INC(ptr, SIZE_OF_DWORD) + INC(ptr, WORD) END END _new; @@ -231,15 +179,14 @@ END _new; PROCEDURE [stdcall] _dispose* (VAR ptr: INTEGER); BEGIN IF ptr # 0 THEN - ptr := API._DISPOSE(ptr - SIZE_OF_DWORD) + ptr := API._DISPOSE(ptr - WORD) END END _dispose; -PROCEDURE [stdcall] _length* (len, str: INTEGER): INTEGER; +PROCEDURE [stdcall] _length* (len, str: INTEGER); BEGIN SYSTEM.CODE( - 08BH, 045H, 00CH, (* mov eax, dword [ebp + 0Ch] *) 08BH, 04DH, 008H, (* mov ecx, dword [ebp + 08h] *) 048H, (* dec eax *) @@ -250,19 +197,14 @@ BEGIN 0E2H, 0F8H, (* loop L1 *) 040H, (* inc eax *) (* L2: *) - 02BH, 045H, 00CH, (* sub eax, dword [ebp + 0Ch] *) - 0C9H, (* leave *) - 0C2H, 008H, 000H (* ret 08h *) + 02BH, 045H, 00CH (* sub eax, dword [ebp + 0Ch] *) ) - - RETURN 0 END _length; -PROCEDURE [stdcall] _lengthw* (len, str: INTEGER): INTEGER; +PROCEDURE [stdcall] _lengthw* (len, str: INTEGER); BEGIN SYSTEM.CODE( - 08BH, 045H, 00CH, (* mov eax, dword [ebp + 0Ch] *) 08BH, 04DH, 008H, (* mov ecx, dword [ebp + 08h] *) 048H, (* dec eax *) @@ -277,58 +219,92 @@ BEGIN 040H, (* inc eax *) (* L2: *) 02BH, 045H, 00CH, (* sub eax, dword [ebp + 0Ch] *) - 0D1H, 0E8H, (* shr eax, 1 *) - 0C9H, (* leave *) - 0C2H, 008H, 000H (* ret 08h *) + 0D1H, 0E8H (* shr eax, 1 *) ) - - RETURN 0 END _lengthw; -PROCEDURE strncmp (a, b, n: INTEGER): INTEGER; -VAR - A, B: CHAR; - res: INTEGER; - +PROCEDURE [stdcall] strncmp (a, b, n: INTEGER): INTEGER; BEGIN - res := minint; - WHILE n > 0 DO - SYSTEM.GET(a, A); INC(a); - SYSTEM.GET(b, B); INC(b); - DEC(n); - IF A # B THEN - res := ORD(A) - ORD(B); - n := 0 - ELSIF A = 0X THEN - res := 0; - n := 0 - END - END - RETURN res + SYSTEM.CODE( + 056H, (* push esi *) + 057H, (* push edi *) + 053H, (* push ebx *) + 08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *) + 08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *) + 08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *) + 031H, 0C9H, (* xor ecx, ecx *) + 031H, 0D2H, (* xor edx, edx *) + 0B8H, + 000H, 000H, 000H, 080H, (* mov eax, minint *) + (* L1: *) + 085H, 0DBH, (* test ebx, ebx *) + 07EH, 017H, (* jle L3 *) + 08AH, 00EH, (* mov cl, byte[esi] *) + 08AH, 017H, (* mov dl, byte[edi] *) + 046H, (* inc esi *) + 047H, (* inc edi *) + 04BH, (* dec ebx *) + 039H, 0D1H, (* cmp ecx, edx *) + 074H, 006H, (* je L2 *) + 089H, 0C8H, (* mov eax, ecx *) + 029H, 0D0H, (* sub eax, edx *) + 0EBH, 006H, (* jmp L3 *) + (* L2: *) + 085H, 0C9H, (* test ecx, ecx *) + 075H, 0E7H, (* jne L1 *) + 031H, 0C0H, (* xor eax, eax *) + (* L3: *) + 05BH, (* pop ebx *) + 05FH, (* pop edi *) + 05EH, (* pop esi *) + 05DH, (* pop ebp *) + 0C2H, 00CH, 000H (* ret 12 *) + ) + RETURN 0 END strncmp; -PROCEDURE strncmpw (a, b, n: INTEGER): INTEGER; -VAR - A, B: WCHAR; - res: INTEGER; - +PROCEDURE [stdcall] strncmpw (a, b, n: INTEGER): INTEGER; BEGIN - res := minint; - WHILE n > 0 DO - SYSTEM.GET(a, A); INC(a, 2); - SYSTEM.GET(b, B); INC(b, 2); - DEC(n); - IF A # B THEN - res := ORD(A) - ORD(B); - n := 0 - ELSIF A = 0X THEN - res := 0; - n := 0 - END - END - RETURN res + SYSTEM.CODE( + 056H, (* push esi *) + 057H, (* push edi *) + 053H, (* push ebx *) + 08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *) + 08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *) + 08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *) + 031H, 0C9H, (* xor ecx, ecx *) + 031H, 0D2H, (* xor edx, edx *) + 0B8H, + 000H, 000H, 000H, 080H, (* mov eax, minint *) + (* L1: *) + 085H, 0DBH, (* test ebx, ebx *) + 07EH, 01BH, (* jle L3 *) + 066H, 08BH, 00EH, (* mov cx, word[esi] *) + 066H, 08BH, 017H, (* mov dx, word[edi] *) + 046H, (* inc esi *) + 046H, (* inc esi *) + 047H, (* inc edi *) + 047H, (* inc edi *) + 04BH, (* dec ebx *) + 039H, 0D1H, (* cmp ecx, edx *) + 074H, 006H, (* je L2 *) + 089H, 0C8H, (* mov eax, ecx *) + 029H, 0D0H, (* sub eax, edx *) + 0EBH, 006H, (* jmp L3 *) + (* L2: *) + 085H, 0C9H, (* test ecx, ecx *) + 075H, 0E3H, (* jne L1 *) + 031H, 0C0H, (* xor eax, eax *) + (* L3: *) + 05BH, (* pop ebx *) + 05FH, (* pop edi *) + 05EH, (* pop esi *) + 05DH, (* pop ebp *) + 0C2H, 00CH, 000H (* ret 12 *) + ) + RETURN 0 END strncmpw; @@ -507,7 +483,7 @@ END _isrec; PROCEDURE [stdcall] _is* (t0, p: INTEGER): INTEGER; BEGIN IF p # 0 THEN - SYSTEM.GET(p - SIZE_OF_DWORD, p); + SYSTEM.GET(p - WORD, p); SYSTEM.GET(t0 + p + types, p) END @@ -526,7 +502,7 @@ PROCEDURE [stdcall] _guard* (t0, p: INTEGER): INTEGER; BEGIN SYSTEM.GET(p, p); IF p # 0 THEN - SYSTEM.GET(p - SIZE_OF_DWORD, p); + SYSTEM.GET(p - WORD, p); SYSTEM.GET(t0 + p + types, p) ELSE p := 1 @@ -567,14 +543,6 @@ BEGIN END _dllentry; -PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY); -BEGIN - dll.process_detach := process_detach; - dll.thread_detach := thread_detach; - dll.thread_attach := thread_attach -END SetDll; - - PROCEDURE [stdcall] _exit* (code: INTEGER); BEGIN API.exit(code) @@ -596,14 +564,20 @@ BEGIN t0 := i; t1 := j; WHILE (t1 # 0) & (t1 # t0) DO - SYSTEM.GET(_types + t1 * SIZE_OF_DWORD, t1) + SYSTEM.GET(_types + t1 * WORD, t1) END; SYSTEM.PUT8(i * tcount + j + types, ORD(t0 = t1)) END END; - name := modname; + j := 1; + FOR i := 0 TO MAX_SET DO + bits[i] := j; + j := LSL(j, 1) + END; + + name := modname; dll.process_detach := NIL; dll.thread_detach := NIL; @@ -621,10 +595,18 @@ BEGIN END _sofinit; +PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY); +BEGIN + dll.process_detach := process_detach; + dll.thread_detach := thread_detach; + dll.thread_attach := thread_attach +END SetDll; + + PROCEDURE SetFini* (ProcFini: PROC); BEGIN fini := ProcFini END SetFini; -END RTL. \ No newline at end of file +END RTL. diff --git a/programs/develop/oberon07/Lib/Windows32/API.ob07 b/programs/develop/oberon07/Lib/Windows32/API.ob07 index 588669fa75..ec9ce7a93a 100644 --- a/programs/develop/oberon07/Lib/Windows32/API.ob07 +++ b/programs/develop/oberon07/Lib/Windows32/API.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -9,6 +9,12 @@ MODULE API; IMPORT SYSTEM; + +CONST + + SectionAlignment = 1000H; + + VAR eol*: ARRAY 3 OF CHAR; @@ -46,7 +52,7 @@ END _DISPOSE; PROCEDURE init* (reserved, code: INTEGER); BEGIN eol[0] := 0DX; eol[1] := 0AX; eol[2] := 0X; - base := code - 4096; + base := code - SectionAlignment; heap := GetProcessHeap() END init; diff --git a/programs/develop/oberon07/Lib/Windows32/HOST.ob07 b/programs/develop/oberon07/Lib/Windows32/HOST.ob07 index 78c531b72b..8e5568d8f1 100644 --- a/programs/develop/oberon07/Lib/Windows32/HOST.ob07 +++ b/programs/develop/oberon07/Lib/Windows32/HOST.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -42,9 +42,9 @@ TYPE cBytes: CHAR; fFixedDisk: CHAR; - nErrCode: SYSTEM.CARD16; - Reserved1: SYSTEM.CARD16; - Reserved2: SYSTEM.CARD16; + nErrCode: WCHAR; + Reserved1: WCHAR; + Reserved2: WCHAR; szPathName: ARRAY OFS_MAXPATHNAME OF CHAR END; @@ -211,7 +211,7 @@ BEGIN END GetArg; -PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER; +PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER; VAR res, n: INTEGER; @@ -328,4 +328,4 @@ BEGIN eol[0] := 0DX; eol[1] := 0AX; eol[2] := 0X; hConsoleOutput := _GetStdHandle(-11); ParamParse -END HOST. \ No newline at end of file +END HOST. diff --git a/programs/develop/oberon07/Lib/Windows32/RTL.ob07 b/programs/develop/oberon07/Lib/Windows32/RTL.ob07 index 0a33a3269c..3aa6c454e1 100644 --- a/programs/develop/oberon07/Lib/Windows32/RTL.ob07 +++ b/programs/develop/oberon07/Lib/Windows32/RTL.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -16,13 +16,13 @@ CONST maxint* = 7FFFFFFFH; minint* = 80000000H; - DLL_PROCESS_ATTACH = 1; - DLL_THREAD_ATTACH = 2; - DLL_THREAD_DETACH = 3; - DLL_PROCESS_DETACH = 0; + DLL_PROCESS_ATTACH = 1; + DLL_THREAD_ATTACH = 2; + DLL_THREAD_DETACH = 3; + DLL_PROCESS_DETACH = 0; - SIZE_OF_DWORD = 4; - MAX_SET = 31; + WORD = bit_depth DIV 8; + MAX_SET = bit_depth - 1; TYPE @@ -35,6 +35,7 @@ VAR name: INTEGER; types: INTEGER; + bits: ARRAY MAX_SET + 1 OF INTEGER; dll: RECORD process_detach, @@ -45,35 +46,9 @@ VAR fini: PROC; -PROCEDURE [stdcall] _move* (bytes, source, dest: INTEGER); +PROCEDURE [stdcall] _move* (bytes, dest, source: INTEGER); BEGIN SYSTEM.CODE( - - 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) - 085H, 0C0H, (* test eax, eax *) - 07EH, 019H, (* jle L *) - 0FCH, (* cld *) - 057H, (* push edi *) - 056H, (* push esi *) - 08BH, 075H, 00CH, (* mov esi, dword [ebp + 12] *) - 08BH, 07DH, 010H, (* mov edi, dword [ebp + 16] *) - 089H, 0C1H, (* mov ecx, eax *) - 0C1H, 0E9H, 002H, (* shr ecx, 2 *) - 0F3H, 0A5H, (* rep movsd *) - 089H, 0C1H, (* mov ecx, eax *) - 083H, 0E1H, 003H, (* and ecx, 3 *) - 0F3H, 0A4H, (* rep movsb *) - 05EH, (* pop esi *) - 05FH (* pop edi *) - (* L: *) - ) -END _move; - - -PROCEDURE [stdcall] _move2* (bytes, dest, source: INTEGER); -BEGIN - SYSTEM.CODE( - 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) 085H, 0C0H, (* test eax, eax *) 07EH, 019H, (* jle L *) @@ -92,7 +67,7 @@ BEGIN 05FH (* pop edi *) (* L: *) ) -END _move2; +END _move; PROCEDURE [stdcall] _arrcpy* (base_size, len_dst, dst, len_src, src: INTEGER): BOOLEAN; @@ -103,7 +78,7 @@ BEGIN IF len_src > len_dst THEN res := FALSE ELSE - _move(len_src * base_size, src, dst); + _move(len_src * base_size, dst, src); res := TRUE END @@ -113,7 +88,7 @@ END _arrcpy; PROCEDURE [stdcall] _strcpy* (chr_size, len_src, src, len_dst, dst: INTEGER); BEGIN - _move(MIN(len_dst, len_src) * chr_size, src, dst) + _move(MIN(len_dst, len_src) * chr_size, dst, src) END _strcpy; @@ -144,7 +119,7 @@ BEGIN IF a < 0 THEN a := 0 END; - a := LSR(ASR(ROR(1, 1), b - a), MAX_SET - b) + a := LSR(ASR(minint, b - a), MAX_SET - b) ELSE a := 0 END @@ -153,69 +128,42 @@ BEGIN END _set; -PROCEDURE [stdcall] _set2* (a, b: INTEGER): INTEGER; - RETURN _set(b, a) -END _set2; +PROCEDURE [stdcall] _set1* (a: INTEGER): INTEGER; +BEGIN + IF ASR(a, 5) = 0 THEN + SYSTEM.GET(SYSTEM.ADR(bits[0]) + a * WORD, a) + ELSE + a := 0 + END + RETURN a +END _set1; -PROCEDURE [stdcall] divmod (a, b: INTEGER; VAR mod: INTEGER): INTEGER; +PROCEDURE [stdcall] _divmod* (y, x: INTEGER); (* (x div y) -> eax; (x mod y) -> edx *) BEGIN SYSTEM.CODE( - - 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) - 08BH, 04DH, 00CH, (* mov ecx, dword [ebp + 12] *) + 053H, (* push ebx *) + 08BH, 045H, 00CH, (* mov eax, dword [ebp + 12] *) (* eax <- x *) 031H, 0D2H, (* xor edx, edx *) 085H, 0C0H, (* test eax, eax *) - 07DH, 002H, (* jge L1 *) + 074H, 018H, (* je L2 *) + 07FH, 002H, (* jg L1 *) 0F7H, 0D2H, (* not edx *) (* L1: *) + 089H, 0C3H, (* mov ebx, eax *) + 08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *) (* ecx <- y *) 0F7H, 0F9H, (* idiv ecx *) - 08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *) - 089H, 011H, (* mov dword [ecx], edx *) - 0C9H, (* leave *) - 0C2H, 00CH, 000H (* ret 12 *) + 085H, 0D2H, (* test edx, edx *) + 074H, 009H, (* je L2 *) + 031H, 0CBH, (* xor ebx, ecx *) + 085H, 0DBH, (* test ebx, ebx *) + 07DH, 003H, (* jge L2 *) + 048H, (* dec eax *) + 001H, 0CAH, (* add edx, ecx *) + (* L2: *) + 05BH (* pop ebx *) ) - - RETURN 0 -END divmod; - - -PROCEDURE [stdcall] _div2* (x, y: INTEGER): INTEGER; -VAR - div, mod: INTEGER; - -BEGIN - div := divmod(x, y, mod); - IF (mod # 0) & ((x < 0) & (y > 0) OR (x > 0) & (y < 0)) THEN - DEC(div) - END - - RETURN div -END _div2; - - -PROCEDURE [stdcall] _mod2* (x, y: INTEGER): INTEGER; -VAR - div, mod: INTEGER; - -BEGIN - div := divmod(x, y, mod); - IF (mod # 0) & ((x < 0) & (y > 0) OR (x > 0) & (y < 0)) THEN - INC(mod, y) - END - - RETURN mod -END _mod2; - - -PROCEDURE [stdcall] _div* (b, a: INTEGER): INTEGER; - RETURN _div2(a, b) -END _div; - - -PROCEDURE [stdcall] _mod* (b, a: INTEGER): INTEGER; - RETURN _mod2(a, b) -END _mod; +END _divmod; PROCEDURE [stdcall] _new* (t, size: INTEGER; VAR ptr: INTEGER); @@ -223,7 +171,7 @@ BEGIN ptr := API._NEW(size); IF ptr # 0 THEN SYSTEM.PUT(ptr, t); - INC(ptr, SIZE_OF_DWORD) + INC(ptr, WORD) END END _new; @@ -231,15 +179,14 @@ END _new; PROCEDURE [stdcall] _dispose* (VAR ptr: INTEGER); BEGIN IF ptr # 0 THEN - ptr := API._DISPOSE(ptr - SIZE_OF_DWORD) + ptr := API._DISPOSE(ptr - WORD) END END _dispose; -PROCEDURE [stdcall] _length* (len, str: INTEGER): INTEGER; +PROCEDURE [stdcall] _length* (len, str: INTEGER); BEGIN SYSTEM.CODE( - 08BH, 045H, 00CH, (* mov eax, dword [ebp + 0Ch] *) 08BH, 04DH, 008H, (* mov ecx, dword [ebp + 08h] *) 048H, (* dec eax *) @@ -250,19 +197,14 @@ BEGIN 0E2H, 0F8H, (* loop L1 *) 040H, (* inc eax *) (* L2: *) - 02BH, 045H, 00CH, (* sub eax, dword [ebp + 0Ch] *) - 0C9H, (* leave *) - 0C2H, 008H, 000H (* ret 08h *) + 02BH, 045H, 00CH (* sub eax, dword [ebp + 0Ch] *) ) - - RETURN 0 END _length; -PROCEDURE [stdcall] _lengthw* (len, str: INTEGER): INTEGER; +PROCEDURE [stdcall] _lengthw* (len, str: INTEGER); BEGIN SYSTEM.CODE( - 08BH, 045H, 00CH, (* mov eax, dword [ebp + 0Ch] *) 08BH, 04DH, 008H, (* mov ecx, dword [ebp + 08h] *) 048H, (* dec eax *) @@ -277,58 +219,92 @@ BEGIN 040H, (* inc eax *) (* L2: *) 02BH, 045H, 00CH, (* sub eax, dword [ebp + 0Ch] *) - 0D1H, 0E8H, (* shr eax, 1 *) - 0C9H, (* leave *) - 0C2H, 008H, 000H (* ret 08h *) + 0D1H, 0E8H (* shr eax, 1 *) ) - - RETURN 0 END _lengthw; -PROCEDURE strncmp (a, b, n: INTEGER): INTEGER; -VAR - A, B: CHAR; - res: INTEGER; - +PROCEDURE [stdcall] strncmp (a, b, n: INTEGER): INTEGER; BEGIN - res := minint; - WHILE n > 0 DO - SYSTEM.GET(a, A); INC(a); - SYSTEM.GET(b, B); INC(b); - DEC(n); - IF A # B THEN - res := ORD(A) - ORD(B); - n := 0 - ELSIF A = 0X THEN - res := 0; - n := 0 - END - END - RETURN res + SYSTEM.CODE( + 056H, (* push esi *) + 057H, (* push edi *) + 053H, (* push ebx *) + 08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *) + 08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *) + 08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *) + 031H, 0C9H, (* xor ecx, ecx *) + 031H, 0D2H, (* xor edx, edx *) + 0B8H, + 000H, 000H, 000H, 080H, (* mov eax, minint *) + (* L1: *) + 085H, 0DBH, (* test ebx, ebx *) + 07EH, 017H, (* jle L3 *) + 08AH, 00EH, (* mov cl, byte[esi] *) + 08AH, 017H, (* mov dl, byte[edi] *) + 046H, (* inc esi *) + 047H, (* inc edi *) + 04BH, (* dec ebx *) + 039H, 0D1H, (* cmp ecx, edx *) + 074H, 006H, (* je L2 *) + 089H, 0C8H, (* mov eax, ecx *) + 029H, 0D0H, (* sub eax, edx *) + 0EBH, 006H, (* jmp L3 *) + (* L2: *) + 085H, 0C9H, (* test ecx, ecx *) + 075H, 0E7H, (* jne L1 *) + 031H, 0C0H, (* xor eax, eax *) + (* L3: *) + 05BH, (* pop ebx *) + 05FH, (* pop edi *) + 05EH, (* pop esi *) + 05DH, (* pop ebp *) + 0C2H, 00CH, 000H (* ret 12 *) + ) + RETURN 0 END strncmp; -PROCEDURE strncmpw (a, b, n: INTEGER): INTEGER; -VAR - A, B: WCHAR; - res: INTEGER; - +PROCEDURE [stdcall] strncmpw (a, b, n: INTEGER): INTEGER; BEGIN - res := minint; - WHILE n > 0 DO - SYSTEM.GET(a, A); INC(a, 2); - SYSTEM.GET(b, B); INC(b, 2); - DEC(n); - IF A # B THEN - res := ORD(A) - ORD(B); - n := 0 - ELSIF A = 0X THEN - res := 0; - n := 0 - END - END - RETURN res + SYSTEM.CODE( + 056H, (* push esi *) + 057H, (* push edi *) + 053H, (* push ebx *) + 08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *) + 08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *) + 08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *) + 031H, 0C9H, (* xor ecx, ecx *) + 031H, 0D2H, (* xor edx, edx *) + 0B8H, + 000H, 000H, 000H, 080H, (* mov eax, minint *) + (* L1: *) + 085H, 0DBH, (* test ebx, ebx *) + 07EH, 01BH, (* jle L3 *) + 066H, 08BH, 00EH, (* mov cx, word[esi] *) + 066H, 08BH, 017H, (* mov dx, word[edi] *) + 046H, (* inc esi *) + 046H, (* inc esi *) + 047H, (* inc edi *) + 047H, (* inc edi *) + 04BH, (* dec ebx *) + 039H, 0D1H, (* cmp ecx, edx *) + 074H, 006H, (* je L2 *) + 089H, 0C8H, (* mov eax, ecx *) + 029H, 0D0H, (* sub eax, edx *) + 0EBH, 006H, (* jmp L3 *) + (* L2: *) + 085H, 0C9H, (* test ecx, ecx *) + 075H, 0E3H, (* jne L1 *) + 031H, 0C0H, (* xor eax, eax *) + (* L3: *) + 05BH, (* pop ebx *) + 05FH, (* pop edi *) + 05EH, (* pop esi *) + 05DH, (* pop ebp *) + 0C2H, 00CH, 000H (* ret 12 *) + ) + RETURN 0 END strncmpw; @@ -507,7 +483,7 @@ END _isrec; PROCEDURE [stdcall] _is* (t0, p: INTEGER): INTEGER; BEGIN IF p # 0 THEN - SYSTEM.GET(p - SIZE_OF_DWORD, p); + SYSTEM.GET(p - WORD, p); SYSTEM.GET(t0 + p + types, p) END @@ -526,7 +502,7 @@ PROCEDURE [stdcall] _guard* (t0, p: INTEGER): INTEGER; BEGIN SYSTEM.GET(p, p); IF p # 0 THEN - SYSTEM.GET(p - SIZE_OF_DWORD, p); + SYSTEM.GET(p - WORD, p); SYSTEM.GET(t0 + p + types, p) ELSE p := 1 @@ -567,14 +543,6 @@ BEGIN END _dllentry; -PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY); -BEGIN - dll.process_detach := process_detach; - dll.thread_detach := thread_detach; - dll.thread_attach := thread_attach -END SetDll; - - PROCEDURE [stdcall] _exit* (code: INTEGER); BEGIN API.exit(code) @@ -596,14 +564,20 @@ BEGIN t0 := i; t1 := j; WHILE (t1 # 0) & (t1 # t0) DO - SYSTEM.GET(_types + t1 * SIZE_OF_DWORD, t1) + SYSTEM.GET(_types + t1 * WORD, t1) END; SYSTEM.PUT8(i * tcount + j + types, ORD(t0 = t1)) END END; - name := modname; + j := 1; + FOR i := 0 TO MAX_SET DO + bits[i] := j; + j := LSL(j, 1) + END; + + name := modname; dll.process_detach := NIL; dll.thread_detach := NIL; @@ -621,10 +595,18 @@ BEGIN END _sofinit; +PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY); +BEGIN + dll.process_detach := process_detach; + dll.thread_detach := thread_detach; + dll.thread_attach := thread_attach +END SetDll; + + PROCEDURE SetFini* (ProcFini: PROC); BEGIN fini := ProcFini END SetFini; -END RTL. \ No newline at end of file +END RTL. diff --git a/programs/develop/oberon07/Samples/Dialogs.ob07 b/programs/develop/oberon07/Samples/Dialogs.ob07 index a0630c7d5c..d680c3ffde 100644 --- a/programs/develop/oberon07/Samples/Dialogs.ob07 +++ b/programs/develop/oberon07/Samples/Dialogs.ob07 @@ -107,4 +107,4 @@ END main; BEGIN main -END Dialogs. \ No newline at end of file +END Dialogs. diff --git a/programs/develop/oberon07/Samples/HW.ob07 b/programs/develop/oberon07/Samples/HW.ob07 index dd3d0ffe28..707071da17 100644 --- a/programs/develop/oberon07/Samples/HW.ob07 +++ b/programs/develop/oberon07/Samples/HW.ob07 @@ -47,4 +47,4 @@ END Main; BEGIN Main("HW", "Hello, world!") -END HW. \ No newline at end of file +END HW. diff --git a/programs/develop/oberon07/Samples/HW_con.ob07 b/programs/develop/oberon07/Samples/HW_con.ob07 index 6cab57e15d..e32bec396f 100644 --- a/programs/develop/oberon07/Samples/HW_con.ob07 +++ b/programs/develop/oberon07/Samples/HW_con.ob07 @@ -1,4 +1,4 @@ -MODULE HW_con; +MODULE HW_con; IMPORT Out, In, Console, DateTime; @@ -10,14 +10,14 @@ BEGIN Out.Char("0") END; Out.Int(n, 0) -END OutInt2; +END OutInt2; PROCEDURE OutMonth(n: INTEGER); VAR str: ARRAY 4 OF CHAR; -BEGIN +BEGIN CASE n OF | 1: str := "jan" @@ -32,10 +32,10 @@ BEGIN |10: str := "oct" |11: str := "nov" |12: str := "dec" - END; + END; Out.String(str) -END OutMonth; +END OutMonth; PROCEDURE main; @@ -52,7 +52,7 @@ BEGIN OutInt2(Hour); Out.Char(":"); OutInt2(Min); Out.Char(":"); OutInt2(Sec) -END main; +END main; BEGIN @@ -60,4 +60,4 @@ BEGIN main; In.Ln; Console.exit(TRUE) -END HW_con. \ No newline at end of file +END HW_con. diff --git a/programs/develop/oberon07/Source/AMD64.ob07 b/programs/develop/oberon07/Source/AMD64.ob07 index fb34e0754d..b93712817d 100644 --- a/programs/develop/oberon07/Source/AMD64.ob07 +++ b/programs/develop/oberon07/Source/AMD64.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -750,7 +750,7 @@ BEGIN IL.opCOPYS, IL.opROT, IL.opNEW, IL.opDISP, IL.opISREC, IL.opIS, IL.opTYPEGR, IL.opTYPEGP, - IL.opCASET, IL.opDIV, + IL.opTYPEGD, IL.opCASET, IL.opDIV, IL.opDIVL, IL.opMOD, IL.opMODL, IL.opLENGTH, IL.opLENGTHW: leaf := FALSE @@ -1163,8 +1163,11 @@ BEGIN REG.Reset(R) |IL.opSAVES: - PushAll(1); + UnOp(reg1); + REG.PushAll_1(R); pushDA(stroffs + param2); + push(reg1); + drop; pushc(param1); CallRTL(IL._move) @@ -1327,16 +1330,17 @@ BEGIN GetRegA |IL.opRSETL: - PushAll(1); + UnOp(reg1); + REG.PushAll_1(R); pushc(param2); - CallRTL(IL._set2); + push(reg1); + drop; + CallRTL(IL._set); GetRegA |IL.opRSET1: - UnOp(reg1); PushAll(1); - push(reg1); - CallRTL(IL._set); + CallRTL(IL._set1); GetRegA |IL.opINCL, IL.opEXCL: @@ -1573,11 +1577,11 @@ BEGIN |IL.opCOPY: PushAll(2); pushc(param2); - CallRTL(IL._move2) + CallRTL(IL._move) |IL.opMOVE: PushAll(3); - CallRTL(IL._move2) + CallRTL(IL._move) |IL.opCOPYA: PushAll(4); @@ -1819,7 +1823,7 @@ BEGIN |IL.opDIV: PushAll(2); - CallRTL(IL._div); + CallRTL(IL._divmod); GetRegA |IL.opDIVR: @@ -1854,20 +1858,24 @@ BEGIN ELSE PushAll(1); pushc(param2); - CallRTL(IL._div); + CallRTL(IL._divmod); GetRegA END END |IL.opDIVL: - PushAll(1); + UnOp(reg1); + REG.PushAll_1(R); pushc(param2); - CallRTL(IL._div2); + push(reg1); + drop; + CallRTL(IL._divmod); GetRegA |IL.opMOD: PushAll(2); - CallRTL(IL._mod); + CallRTL(IL._divmod); + mov(rax, rdx); GetRegA |IL.opMODR: @@ -1899,15 +1907,20 @@ BEGIN ELSE PushAll(1); pushc(param2); - CallRTL(IL._mod); + CallRTL(IL._divmod); + mov(rax, rdx); GetRegA END END |IL.opMODL: - PushAll(1); + UnOp(reg1); + REG.PushAll_1(R); pushc(param2); - CallRTL(IL._mod2); + push(reg1); + drop; + CallRTL(IL._divmod); + mov(rax, rdx); GetRegA |IL.opMUL: @@ -2561,12 +2574,12 @@ BEGIN END translate; -PROCEDURE prolog (code: IL.CODES; modname: ARRAY OF CHAR; target, stack_size: INTEGER); +PROCEDURE prolog (modname: ARRAY OF CHAR; target, stack_size: INTEGER); VAR ModName_Offs, entry, L: INTEGER; BEGIN - ModName_Offs := tcount * 8 + CHL.Length(code.data); + ModName_Offs := tcount * 8 + CHL.Length(IL.codes.data); Numbers_Offs := ModName_Offs + LENGTH(modname) + 1; ASSERT(UTILS.Align(Numbers_Offs, 16)); @@ -2596,7 +2609,7 @@ BEGIN pushDA(ModName_Offs); //MODNAME CallRTL(IL._init); - IF target IN {mConst.Target_iConsole64, mConst.Target_iGUI64} THEN + IF target IN {mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iELF64} THEN L := NewLabel(); pushc(0); push(rsp); @@ -2613,7 +2626,7 @@ BEGIN END prolog; -PROCEDURE epilog (code: IL.CODES; modname: ARRAY OF CHAR; target: INTEGER); +PROCEDURE epilog (modname: ARRAY OF CHAR; target: INTEGER); VAR i, n: INTEGER; number: Number; @@ -2660,13 +2673,13 @@ BEGIN i := 0; WHILE i < tcount DO - BIN.PutData64LE(prog, CHL.GetInt(code.types, i)); + BIN.PutData64LE(prog, CHL.GetInt(IL.codes.types, i)); INC(i) END; i := 0; - WHILE i < CHL.Length(code.data) DO - BIN.PutData(prog, CHL.GetByte(code.data, i)); + WHILE i < CHL.Length(IL.codes.data) DO + BIN.PutData(prog, CHL.GetByte(IL.codes.data, i)); INC(i) END; @@ -2685,13 +2698,13 @@ BEGIN number := number.next(Number) END; - exp := code.export.first(IL.EXPORT_PROC); + exp := IL.codes.export.first(IL.EXPORT_PROC); WHILE exp # NIL DO BIN.Export(prog, exp.name, exp.label); exp := exp.next(IL.EXPORT_PROC) END; - import(code.import) + import(IL.codes.import) END epilog; @@ -2719,12 +2732,12 @@ BEGIN END rsave; -PROCEDURE CodeGen* (code: IL.CODES; outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS); +PROCEDURE CodeGen* (outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS); VAR path, modname, ext: PATHS.PATH; BEGIN - tcount := CHL.Length(code.types); + tcount := CHL.Length(IL.codes.types); Win64RegPar[0] := rcx; Win64RegPar[1] := rdx; @@ -2743,7 +2756,7 @@ BEGIN REG.Init(R, push, pop, mov, xchg, rload, rsave, {rax, r10, r11}, {rcx, rdx, r8, r9}); - code.bss := MAX(code.bss, MAX(code.dmin - CHL.Length(code.data), 8)); + IL.set_bss(MAX(IL.codes.bss, MAX(IL.codes.dmin - CHL.Length(IL.codes.data), 8))); Numbers := LISTS.create(NIL); Numbers_Count := 0; @@ -2755,22 +2768,22 @@ BEGIN NewNumber(ORD(-BITS(LSR(ASR(ROR(1, 1), 10), 1)))); (* {0..51, 63} *) NewNumber(LSR(ASR(ROR(1, 1), 9), 2)); (* {52..61} *) - prog := BIN.create(code.lcount); - BIN.SetParams(prog, code.bss, 1, WCHR(1), WCHR(0)); + prog := BIN.create(IL.codes.lcount); + BIN.SetParams(prog, IL.codes.bss, 1, WCHR(1), WCHR(0)); X86.SetProgram(prog); - prolog(code, modname, target, options.stack); - translate(code.commands, tcount * 8); - epilog(code, modname, target); + prolog(modname, target, options.stack); + translate(IL.codes.commands, tcount * 8); + epilog(modname, target); BIN.fixup(prog); IF target IN {mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iDLL64} THEN - PE32.write(prog, outname, options.base, target = mConst.Target_iConsole64, target = mConst.Target_iDLL64, TRUE) + PE32.write(prog, outname, target = mConst.Target_iConsole64, target = mConst.Target_iDLL64, TRUE) ELSIF target IN {mConst.Target_iELF64, mConst.Target_iELFSO64} THEN ELF.write(prog, outname, sofinit, target = mConst.Target_iELFSO64, TRUE) END END CodeGen; -END AMD64. \ No newline at end of file +END AMD64. diff --git a/programs/develop/oberon07/Source/ARITH.ob07 b/programs/develop/oberon07/Source/ARITH.ob07 index 7a5734ab46..452e2b7b8c 100644 --- a/programs/develop/oberon07/Source/ARITH.ob07 +++ b/programs/develop/oberon07/Source/ARITH.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -46,15 +46,12 @@ VAR BEGIN - IF v.typ = tINTEGER THEN + CASE v.typ OF + |tINTEGER, tCHAR, tWCHAR: res := v.int - ELSIF v.typ = tCHAR THEN - res := v.int - ELSIF v.typ = tWCHAR THEN - res := v.int - ELSIF v.typ = tSET THEN + |tSET: res := UTILS.Long(ORD(v.set)) - ELSIF v.typ = tBOOLEAN THEN + |tBOOLEAN: res := ORD(v.bool) END @@ -80,35 +77,28 @@ END Float; PROCEDURE check* (v: VALUE): BOOLEAN; VAR - error: BOOLEAN; + res: BOOLEAN; BEGIN - error := FALSE; - - IF (v.typ = tINTEGER) & ((v.int < UTILS.target.minInt) OR (v.int > UTILS.target.maxInt)) THEN - error := TRUE - ELSIF (v.typ = tCHAR) & ((v.int < 0) OR (v.int > 255)) THEN - error := TRUE - ELSIF (v.typ = tWCHAR) & ((v.int < 0) OR (v.int > 65535)) THEN - error := TRUE - ELSIF (v.typ = tREAL) & ((v.float < -UTILS.target.maxReal) OR (v.float > UTILS.target.maxReal)) THEN - error := TRUE + CASE v.typ OF + |tINTEGER: res := (UTILS.target.minInt <= v.int) & (v.int <= UTILS.target.maxInt) + |tCHAR: res := (0 <= v.int) & (v.int <= 255) + |tWCHAR: res := (0 <= v.int) & (v.int <= 65535) + |tREAL: res := (-UTILS.target.maxReal <= v.float) & (v.float <= UTILS.target.maxReal) END - RETURN ~error + RETURN res END check; PROCEDURE isZero* (v: VALUE): BOOLEAN; VAR res: BOOLEAN; -BEGIN - ASSERT(v.typ IN {tINTEGER, tREAL}); - IF v.typ = tINTEGER THEN - res := v.int = 0 - ELSIF v.typ = tREAL THEN - res := v.float = 0.0 +BEGIN + CASE v.typ OF + |tINTEGER: res := v.int = 0 + |tREAL: res := v.float = 0.0 END RETURN res @@ -844,4 +834,4 @@ END init; BEGIN init -END ARITH. \ No newline at end of file +END ARITH. diff --git a/programs/develop/oberon07/Source/AVLTREES.ob07 b/programs/develop/oberon07/Source/AVLTREES.ob07 index 84053be03e..bb0cf0bfb3 100644 --- a/programs/develop/oberon07/Source/AVLTREES.ob07 +++ b/programs/develop/oberon07/Source/AVLTREES.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -194,4 +194,4 @@ END destroy; BEGIN nodes := C.create() -END AVLTREES. \ No newline at end of file +END AVLTREES. diff --git a/programs/develop/oberon07/Source/BIN.ob07 b/programs/develop/oberon07/Source/BIN.ob07 index a3f7db6433..554624c4d8 100644 --- a/programs/develop/oberon07/Source/BIN.ob07 +++ b/programs/develop/oberon07/Source/BIN.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -380,4 +380,4 @@ BEGIN END InitArray; -END BIN. \ No newline at end of file +END BIN. diff --git a/programs/develop/oberon07/Source/CHUNKLISTS.ob07 b/programs/develop/oberon07/Source/CHUNKLISTS.ob07 index b604c2d6cc..d020a3a71b 100644 --- a/programs/develop/oberon07/Source/CHUNKLISTS.ob07 +++ b/programs/develop/oberon07/Source/CHUNKLISTS.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -283,4 +283,4 @@ PROCEDURE Length* (list: ANYLIST): INTEGER; END Length; -END CHUNKLISTS. \ No newline at end of file +END CHUNKLISTS. diff --git a/programs/develop/oberon07/Source/COLLECTIONS.ob07 b/programs/develop/oberon07/Source/COLLECTIONS.ob07 index 311d6dfac3..21b97ea336 100644 --- a/programs/develop/oberon07/Source/COLLECTIONS.ob07 +++ b/programs/develop/oberon07/Source/COLLECTIONS.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -56,4 +56,4 @@ BEGIN END create; -END COLLECTIONS. \ No newline at end of file +END COLLECTIONS. diff --git a/programs/develop/oberon07/Source/CONSOLE.ob07 b/programs/develop/oberon07/Source/CONSOLE.ob07 index 7b4072faa9..372b190da4 100644 --- a/programs/develop/oberon07/Source/CONSOLE.ob07 +++ b/programs/develop/oberon07/Source/CONSOLE.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -79,4 +79,4 @@ BEGIN END Int2Ln; -END CONSOLE. \ No newline at end of file +END CONSOLE. diff --git a/programs/develop/oberon07/Source/CONSTANTS.ob07 b/programs/develop/oberon07/Source/CONSTANTS.ob07 index a3b2b2de2b..f7006b5ab3 100644 --- a/programs/develop/oberon07/Source/CONSTANTS.ob07 +++ b/programs/develop/oberon07/Source/CONSTANTS.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -10,7 +10,7 @@ MODULE CONSTANTS; CONST vMajor* = 1; - vMinor* = 0; + vMinor* = 13; FILE_EXT* = ".ob07"; RTL_NAME* = "RTL"; @@ -46,4 +46,4 @@ CONST Target_sMSP430* = "msp430"; -END CONSTANTS. \ No newline at end of file +END CONSTANTS. diff --git a/programs/develop/oberon07/Source/Compiler.ob07 b/programs/develop/oberon07/Source/Compiler.ob07 index 0156182889..ed4945902e 100644 --- a/programs/develop/oberon07/Source/Compiler.ob07 +++ b/programs/develop/oberon07/Source/Compiler.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -49,7 +49,7 @@ BEGIN END Target; -PROCEDURE keys (VAR options: PROG.OPTIONS); +PROCEDURE keys (VAR options: PROG.OPTIONS; VAR out: PARS.PATH); VAR param: PARS.PATH; i, j: INTEGER; @@ -60,9 +60,10 @@ VAR checking: SET; BEGIN + out := ""; checking := options.checking; end := FALSE; - i := 4; + i := 3; REPEAT UTILS.GetArg(i, param); @@ -76,14 +77,13 @@ BEGIN DEC(i) END - ELSIF param = "-base" THEN + ELSIF param = "-out" THEN INC(i); UTILS.GetArg(i, param); - IF STRINGS.StrToInt(param, value) THEN - options.base := ((value DIV 64) * 64) * 1024 - END; IF param[0] = "-" THEN DEC(i) + ELSE + out := param END ELSIF param = "-ram" THEN @@ -202,20 +202,20 @@ BEGIN IF inname = "" THEN C.Ln; - C.StringLn("Usage: Compiler
[optional settings]"); C.Ln; + C.StringLn("Usage: Compiler
[optional settings]"); C.Ln; IF UTILS.bit_depth = 64 THEN C.StringLn('target = console | gui | dll | console64 | gui64 | dll64 | kos | obj | elfexe | elfso | elfexe64 | elfso64 | msp430'); C.Ln; ELSIF UTILS.bit_depth = 32 THEN C.StringLn('target = console | gui | dll | kos | obj | elfexe | elfso | msp430'); C.Ln; END; C.StringLn("optional settings:"); C.Ln; + C.StringLn(" -out output"); C.Ln; C.StringLn(" -stk set size of stack in megabytes"); C.Ln; - C.StringLn(" -base
set base address of image in kilobytes"); C.Ln; - C.StringLn(' -ver set version of program'); C.Ln; C.StringLn(' -nochk <"ptibcwra"> disable runtime checking (pointers, types, indexes,'); C.StringLn(' BYTE, CHR, WCHR)'); C.Ln; - C.StringLn(" -ram set size of RAM in bytes (MSP430)"); C.Ln; - C.StringLn(" -rom set size of ROM in bytes (MSP430)"); C.Ln; + C.StringLn(" -ver set version of program ('obj' target)"); C.Ln; + C.StringLn(" -ram set size of RAM in bytes ('msp430' target)"); C.Ln; + C.StringLn(" -rom set size of ROM in bytes ('msp430' target)"); C.Ln; UTILS.Exit(0) END; @@ -230,16 +230,7 @@ BEGIN path := temp END; - UTILS.GetArg(2, outname); - IF outname = "" THEN - ERRORS.Error(205) - END; - IF PATHS.isRelative(outname) THEN - PATHS.RelPath(app_path, outname, temp); - outname := temp - END; - - UTILS.GetArg(3, param); + UTILS.GetArg(2, param); IF param = "" THEN ERRORS.Error(205) END; @@ -271,11 +262,6 @@ BEGIN CASE target OF |mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL: - IF target = mConst.Target_iDLL THEN - options.base := 10000000H - ELSE - options.base := 400000H - END; STRINGS.append(lib_path, "Windows32") |mConst.Target_iKolibri, mConst.Target_iObject: @@ -297,7 +283,34 @@ BEGIN STRINGS.append(lib_path, UTILS.slash); - keys(options); + keys(options, outname); + IF outname = "" THEN + outname := path; + STRINGS.append(outname, modname); + CASE target OF + |mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iConsole64, mConst.Target_iGUI64: + STRINGS.append(outname, ".exe") + + |mConst.Target_iObject: + STRINGS.append(outname, ".obj") + + |mConst.Target_iKolibri, mConst.Target_iELF32, mConst.Target_iELF64: + + |mConst.Target_iELFSO32, mConst.Target_iELFSO64: + STRINGS.append(outname, ".so") + + |mConst.Target_iDLL, mConst.Target_iDLL64: + STRINGS.append(outname, ".dll") + + |mConst.Target_iMSP430: + STRINGS.append(outname, ".hex") + END + ELSE + IF PATHS.isRelative(outname) THEN + PATHS.RelPath(app_path, outname, temp); + outname := temp + END + END; PARS.init(bit_depth, target, options); @@ -308,6 +321,7 @@ BEGIN time := UTILS.GetTickCount() - UTILS.time; + C.Int(PARS.lines); C.String(" lines, "); C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, "); C.Int(WRITER.counter); C.StringLn(" bytes"); @@ -317,4 +331,4 @@ END main; BEGIN main -END Compiler. \ No newline at end of file +END Compiler. diff --git a/programs/develop/oberon07/Source/ELF.ob07 b/programs/develop/oberon07/Source/ELF.ob07 index 2c74d467f0..d502af91a6 100644 --- a/programs/develop/oberon07/Source/ELF.ob07 +++ b/programs/develop/oberon07/Source/ELF.ob07 @@ -1,4 +1,4 @@ -(* +(* BSD 2-Clause License Copyright (c) 2019, Anton Krotov @@ -648,4 +648,4 @@ BEGIN END write; -END ELF. \ No newline at end of file +END ELF. diff --git a/programs/develop/oberon07/Source/ERRORS.ob07 b/programs/develop/oberon07/Source/ERRORS.ob07 index 6738d047b9..0121f39d0d 100644 --- a/programs/develop/oberon07/Source/ERRORS.ob07 +++ b/programs/develop/oberon07/Source/ERRORS.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -206,7 +206,7 @@ BEGIN |201: Error1("writing file error") |202: Error1("too many relocations") |203: Error1("size of program is too large") - |204: Error1("size of global variables is too large") + |204: Error1("size of variables is too large") |205: Error1("not enough parameters") |206: Error1("bad parameter ") |207: Error3('inputfile name extension must be "', mConst.FILE_EXT, '"') @@ -214,4 +214,4 @@ BEGIN END Error; -END ERRORS. \ No newline at end of file +END ERRORS. diff --git a/programs/develop/oberon07/Source/FILES.ob07 b/programs/develop/oberon07/Source/FILES.ob07 index fc67c1fecd..7aa5b0be4a 100644 --- a/programs/develop/oberon07/Source/FILES.ob07 +++ b/programs/develop/oberon07/Source/FILES.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -134,7 +134,7 @@ BEGIN END close; -PROCEDURE read* (file: FILE; VAR chunk: ARRAY OF BYTE; bytes: INTEGER): INTEGER; +PROCEDURE read* (file: FILE; VAR chunk: ARRAY OF CHAR; bytes: INTEGER): INTEGER; VAR res: INTEGER; @@ -216,4 +216,4 @@ END WriteByte; BEGIN files := C.create() -END FILES. \ No newline at end of file +END FILES. diff --git a/programs/develop/oberon07/Source/IL.ob07 b/programs/develop/oberon07/Source/IL.ob07 index 89278d5bc7..9ca222672d 100644 --- a/programs/develop/oberon07/Source/IL.ob07 +++ b/programs/develop/oberon07/Source/IL.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -96,18 +96,18 @@ CONST opLADR_UNPK* = -24; - _move *= 0; - _move2 *= 1; + _init *= 0; + _move *= 1; _strcmpw *= 2; _exit *= 3; _set *= 4; - _set2 *= 5; + _set1 *= 5; _lengthw *= 6; _strcpy *= 7; - _div *= 8; - _mod *= 9; - _div2 *= 10; - _mod2 *= 11; + _length *= 8; + _divmod *= 9; + _dllentry *= 10; + _sofinit *= 11; _arrcpy *= 12; _rot *= 13; _new *= 14; @@ -118,10 +118,6 @@ CONST _isrec *= 19; _guard *= 20; _guardrec *= 21; - _length *= 22; - _init *= 23; - _dllentry *= 24; - _sofinit *= 25; TYPE @@ -175,7 +171,7 @@ TYPE END; - CODES* = POINTER TO RECORD + CODES = RECORD last: COMMAND; begcall: CMDSTACK; @@ -188,7 +184,7 @@ TYPE dmin*: INTEGER; lcount*: INTEGER; bss*: INTEGER; - rtl*: ARRAY 26 OF INTEGER; + rtl*: ARRAY 22 OF INTEGER; errlabels*: ARRAY 12 OF INTEGER; charoffs: ARRAY 256 OF INTEGER; @@ -208,6 +204,24 @@ VAR commands, variables: C.COLLECTION; +PROCEDURE set_dmin* (value: INTEGER); +BEGIN + codes.dmin := value +END set_dmin; + + +PROCEDURE set_bss* (value: INTEGER); +BEGIN + codes.bss := value +END set_bss; + + +PROCEDURE set_rtl* (idx, label: INTEGER); +BEGIN + codes.rtl[idx] := label +END set_rtl; + + PROCEDURE NewCmd (): COMMAND; VAR cmd: COMMAND; @@ -257,7 +271,7 @@ PROCEDURE getlast* (): COMMAND; END getlast; -PROCEDURE PutByte (codes: CODES; b: BYTE); +PROCEDURE PutByte (b: BYTE); BEGIN CHL.PushByte(codes.data, b) END PutByte; @@ -272,11 +286,11 @@ BEGIN i := 0; n := LENGTH(s); WHILE i < n DO - PutByte(codes, ORD(s[i])); + PutByte(ORD(s[i])); INC(i) END; - PutByte(codes, 0) + PutByte(0) RETURN res END putstr; @@ -289,8 +303,8 @@ VAR BEGIN IF codes.charoffs[c] = -1 THEN res := CHL.Length(codes.data); - PutByte(codes, c); - PutByte(codes, 0); + PutByte(c); + PutByte(0); codes.charoffs[c] := res ELSE res := codes.charoffs[c] @@ -308,7 +322,7 @@ BEGIN res := CHL.Length(codes.data); IF ODD(res) THEN - PutByte(codes, 0); + PutByte(0); INC(res) END; @@ -317,17 +331,17 @@ BEGIN i := 0; WHILE i < n DO IF endianness = little_endian THEN - PutByte(codes, ORD(codes.wstr[i]) MOD 256); - PutByte(codes, ORD(codes.wstr[i]) DIV 256) + PutByte(ORD(codes.wstr[i]) MOD 256); + PutByte(ORD(codes.wstr[i]) DIV 256) ELSIF endianness = big_endian THEN - PutByte(codes, ORD(codes.wstr[i]) DIV 256); - PutByte(codes, ORD(codes.wstr[i]) MOD 256) + PutByte(ORD(codes.wstr[i]) DIV 256); + PutByte(ORD(codes.wstr[i]) MOD 256) END; INC(i) END; - PutByte(codes, 0); - PutByte(codes, 0) + PutByte(0); + PutByte(0) RETURN res END putstrW; @@ -342,20 +356,20 @@ BEGIN res := CHL.Length(codes.data); IF ODD(res) THEN - PutByte(codes, 0); + PutByte(0); INC(res) END; IF endianness = little_endian THEN - PutByte(codes, c MOD 256); - PutByte(codes, c DIV 256) + PutByte(c MOD 256); + PutByte(c DIV 256) ELSIF endianness = big_endian THEN - PutByte(codes, c DIV 256); - PutByte(codes, c MOD 256) + PutByte(c DIV 256); + PutByte(c MOD 256) END; - PutByte(codes, 0); - PutByte(codes, 0); + PutByte(0); + PutByte(0); codes.wcharoffs[c] := res ELSE @@ -935,18 +949,6 @@ BEGIN END flt; -PROCEDURE odd*; -BEGIN - AddCmd0(opODD) -END odd; - - -PROCEDURE ord*; -BEGIN - AddCmd0(opORD) -END ord; - - PROCEDURE shift_minmax* (op: CHAR); BEGIN CASE op OF @@ -1147,7 +1149,6 @@ BEGIN numRegsFloat := pNumRegsFloat; endianness := pEndianness; - NEW(codes); NEW(codes.begcall); codes.begcall.top := -1; NEW(codes.endcall); @@ -1179,4 +1180,4 @@ BEGIN END init; -END IL. \ No newline at end of file +END IL. diff --git a/programs/develop/oberon07/Source/KOS.ob07 b/programs/develop/oberon07/Source/KOS.ob07 index fe44eed0a5..0e5e551ec3 100644 --- a/programs/develop/oberon07/Source/KOS.ob07 +++ b/programs/develop/oberon07/Source/KOS.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -215,4 +215,4 @@ BEGIN END write; -END KOS. \ No newline at end of file +END KOS. diff --git a/programs/develop/oberon07/Source/LISTS.ob07 b/programs/develop/oberon07/Source/LISTS.ob07 index 59b1342ca6..34cfdebce6 100644 --- a/programs/develop/oberon07/Source/LISTS.ob07 +++ b/programs/develop/oberon07/Source/LISTS.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -199,4 +199,4 @@ BEGIN END create; -END LISTS. \ No newline at end of file +END LISTS. diff --git a/programs/develop/oberon07/Source/MSCOFF.ob07 b/programs/develop/oberon07/Source/MSCOFF.ob07 index 5abc8310d9..0907a22b12 100644 --- a/programs/develop/oberon07/Source/MSCOFF.ob07 +++ b/programs/develop/oberon07/Source/MSCOFF.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -313,4 +313,4 @@ BEGIN END write; -END MSCOFF. \ No newline at end of file +END MSCOFF. diff --git a/programs/develop/oberon07/Source/MSP430.ob07 b/programs/develop/oberon07/Source/MSP430.ob07 index a2edaffab1..b0ce4a0526 100644 --- a/programs/develop/oberon07/Source/MSP430.ob07 +++ b/programs/develop/oberon07/Source/MSP430.ob07 @@ -1,4 +1,4 @@ -(* +(* BSD 2-Clause License Copyright (c) 2019, Anton Krotov @@ -582,7 +582,7 @@ BEGIN END Neg; -PROCEDURE translate (code: IL.CODES); +PROCEDURE translate; VAR cmd, next: COMMAND; @@ -593,7 +593,7 @@ VAR cc: INTEGER; BEGIN - cmd := code.commands.first(COMMAND); + cmd := IL.codes.commands.first(COMMAND); WHILE cmd # NIL DO @@ -1643,7 +1643,7 @@ BEGIN END WriteHex; -PROCEDURE CodeGen* (code: IL.CODES; outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS); +PROCEDURE CodeGen* (outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS); VAR i, adr, heap, stack, TextSize, TypesSize, bits, n: INTEGER; @@ -1668,12 +1668,12 @@ BEGIN ram := MIN(MAX(ram, minRAM), maxRAM); rom := MIN(MAX(rom, minROM), maxROM); - IF code.bss > ram - minStackSize - RTL.VarSize THEN + IF IL.codes.bss > ram - minStackSize - RTL.VarSize THEN ERRORS.Error(204) END; Labels := CHL.CreateIntList(); - FOR i := 1 TO code.lcount DO + FOR i := 1 TO IL.codes.lcount DO CHL.PushInt(Labels, 0) END; @@ -1681,28 +1681,28 @@ BEGIN mem[i] := 0 END; - TypesSize := CHL.Length(code.types) * 2; + TypesSize := CHL.Length(IL.codes.types) * 2; CodeList := LISTS.create(NIL); RelList := LISTS.create(NIL); REG.Init(R, Push, Pop, mov, xchg, NIL, NIL, {R4, R5, R6, R7}, {}); prolog(ram); - translate(code); + translate; epilog; Code.address := 10000H - rom; Code.size := Fixup(Code.address, IntVectorSize + TypesSize); Data.address := Code.address + Code.size; - Data.size := CHL.Length(code.data); + Data.size := CHL.Length(IL.codes.data); Data.size := Data.size + ORD(ODD(Data.size)); TextSize := Code.size + Data.size; - IF Code.address + TextSize + MAX(code.dmin - Data.size, IntVectorSize + TypesSize) > 10000H THEN + IF Code.address + TextSize + MAX(IL.codes.dmin - Data.size, IntVectorSize + TypesSize) > 10000H THEN ERRORS.Error(203) END; Bss.address := RTL.ram + RTL.VarSize; - Bss.size := code.bss + ORD(ODD(code.bss)); + Bss.size := IL.codes.bss + ORD(ODD(IL.codes.bss)); heap := Bss.address + Bss.size; stack := RTL.ram + ram; ASSERT(stack - heap >= minStackSize); @@ -1724,15 +1724,15 @@ BEGIN adr := Data.address; - FOR i := 0 TO CHL.Length(code.data) - 1 DO - mem[adr] := CHL.GetByte(code.data, i); + FOR i := 0 TO CHL.Length(IL.codes.data) - 1 DO + mem[adr] := CHL.GetByte(IL.codes.data, i); INC(adr) END; adr := 10000H - IntVectorSize - TypesSize; FOR i := TypesSize DIV 2 - 1 TO 0 BY -1 DO - PutWord(CHL.GetInt(code.types, i), adr) + PutWord(CHL.GetInt(IL.codes.types, i), adr) END; FOR i := 0 TO 15 DO @@ -1790,4 +1790,4 @@ BEGIN END CodeGen; -END MSP430. \ No newline at end of file +END MSP430. diff --git a/programs/develop/oberon07/Source/MSP430RTL.ob07 b/programs/develop/oberon07/Source/MSP430RTL.ob07 index 86e4278c2f..17c858b86c 100644 --- a/programs/develop/oberon07/Source/MSP430RTL.ob07 +++ b/programs/develop/oberon07/Source/MSP430RTL.ob07 @@ -1,4 +1,4 @@ -(* +(* BSD 2-Clause License Copyright (c) 2019, Anton Krotov @@ -674,4 +674,4 @@ BEGIN END Init; -END MSP430RTL. \ No newline at end of file +END MSP430RTL. diff --git a/programs/develop/oberon07/Source/PARS.ob07 b/programs/develop/oberon07/Source/PARS.ob07 index 3f183a2c18..6694d65668 100644 --- a/programs/develop/oberon07/Source/PARS.ob07 +++ b/programs/develop/oberon07/Source/PARS.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -77,6 +77,8 @@ VAR parsers: C.COLLECTION; + lines*: INTEGER; + PROCEDURE destroy* (VAR parser: PARSER); BEGIN @@ -1178,9 +1180,9 @@ BEGIN ExpectSym(parser, SCAN.lxIDENT); check1(parser.lex.s = unit.name.s, parser, 25); ExpectSym(parser, SCAN.lxPOINT) - END; + INC(lines, parser.lex.pos.line); PROG.closeUnit(unit) END parse; @@ -1248,8 +1250,9 @@ END create; PROCEDURE init* (bit_depth, target: INTEGER; options: PROG.OPTIONS); BEGIN program := PROG.create(bit_depth, target, options); - parsers := C.create() + parsers := C.create(); + lines := 0 END init; -END PARS. \ No newline at end of file +END PARS. diff --git a/programs/develop/oberon07/Source/PATHS.ob07 b/programs/develop/oberon07/Source/PATHS.ob07 index e6ea79255e..4410514158 100644 --- a/programs/develop/oberon07/Source/PATHS.ob07 +++ b/programs/develop/oberon07/Source/PATHS.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -106,4 +106,4 @@ BEGIN END GetCurrentDirectory; -END PATHS. \ No newline at end of file +END PATHS. diff --git a/programs/develop/oberon07/Source/PE32.ob07 b/programs/develop/oberon07/Source/PE32.ob07 index 18a77bb664..6dc88d8b70 100644 --- a/programs/develop/oberon07/Source/PE32.ob07 +++ b/programs/develop/oberon07/Source/PE32.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -28,8 +28,8 @@ CONST (* SectionHeader.Characteristics *) SHC_text = 060000020H; - SHC_data = 0C0000040H; - SHC_bss = 0C00000C0H; + SHC_data = 040000040H; + SHC_bss = 0C0000080H; SectionAlignment = 1000H; FileAlignment = 200H; @@ -372,7 +372,7 @@ BEGIN END WriteFileHeader; -PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; BaseAddress: INTEGER; console, dll, amd64: BOOLEAN); +PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; console, dll, amd64: BOOLEAN); VAR i, n: INTEGER; @@ -382,6 +382,8 @@ VAR END; + BaseAddress: INTEGER; + Address: VIRTUAL_ADDR; File: FILE; @@ -504,6 +506,12 @@ BEGIN Size.Bss := program.bss; Size.Stack := program.stack; + IF dll THEN + BaseAddress := 10000000H + ELSE + BaseAddress := 400000H + END; + PEHeader.Signature[0] := 50H; PEHeader.Signature[1] := 45H; PEHeader.Signature[2] := 0; @@ -556,7 +564,7 @@ BEGIN InitSection(SectionHeaders[0], ".text", SHC_text); SectionHeaders[0].VirtualSize := Size.Code; - SectionHeaders[0].VirtualAddress := 1000H; + SectionHeaders[0].VirtualAddress := SectionAlignment; SectionHeaders[0].SizeOfRawData := align(Size.Code, FileAlignment); SectionHeaders[0].PointerToRawData := PEHeader.OptionalHeader.SizeOfHeaders; @@ -730,4 +738,4 @@ BEGIN END write; -END PE32. \ No newline at end of file +END PE32. diff --git a/programs/develop/oberon07/Source/PROG.ob07 b/programs/develop/oberon07/Source/PROG.ob07 index a5e090126f..cb9804b191 100644 --- a/programs/develop/oberon07/Source/PROG.ob07 +++ b/programs/develop/oberon07/Source/PROG.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -24,9 +24,9 @@ CONST tINTEGER* = 1; tBYTE* = 2; tCHAR* = 3; tSET* = 4; tBOOLEAN* = 5; tREAL* = 6; tARRAY* = 7; tRECORD* = 8; tPOINTER* = 9; tPROCEDURE* = 10; tSTRING* = 11; tNIL* = 12; - tCARD16* = 13; tCARD32* = 14; tANYREC* = 15; tWCHAR* = 16; + tCARD32* = 13; tANYREC* = 14; tWCHAR* = 15; - BASICTYPES* = {tINTEGER, tBYTE, tCHAR, tSET, tBOOLEAN, tREAL, tCARD16, tCARD32, tWCHAR}; + BASICTYPES* = {tINTEGER, tBYTE, tCHAR, tSET, tBOOLEAN, tREAL, tCARD32, tWCHAR}; stABS* = 1; stASR* = 2; stCHR* = 3; stFLOOR* = 4; stFLT* = 5; stLEN* = 6; stLSL* = 7; stODD* = 8; @@ -72,7 +72,7 @@ TYPE OPTIONS* = RECORD - version*, stack*, base*, ram*, rom*: INTEGER; + version*, stack*, ram*, rom*: INTEGER; pic*: BOOLEAN; checking*: SET @@ -205,7 +205,7 @@ TYPE stTypes*: RECORD tINTEGER*, tBYTE*, tCHAR*, tWCHAR*, tSET*, tBOOLEAN*, tREAL*, - tSTRING*, tNIL*, tCARD16*, tCARD32*, tANYREC*: TYPE_ + tSTRING*, tNIL*, tCARD32*, tANYREC*: TYPE_ END; @@ -254,23 +254,27 @@ VAR BEGIN IF varIdent.offset = -1 THEN + size := varIdent.type.size; IF varIdent.global THEN IF UTILS.Align(program.bss, varIdent.type.align) THEN - IF UTILS.maxint - program.bss >= varIdent.type.size THEN + IF UTILS.maxint - program.bss >= size THEN varIdent.offset := program.bss; - INC(program.bss, varIdent.type.size) + INC(program.bss, size) END END ELSE word := program.target.word; - size := varIdent.type.size; IF UTILS.Align(size, word) THEN size := size DIV word; IF UTILS.maxint - program.locsize >= size THEN INC(program.locsize, size); - varIdent.offset := program.locsize; + varIdent.offset := program.locsize END END + END; + + IF varIdent.offset = -1 THEN + ERRORS.Error(204) END END @@ -509,7 +513,6 @@ BEGIN END; DEC(unit.scopeLvl) - END closeScope; @@ -631,6 +634,13 @@ PROCEDURE isOpenArray* (t: TYPE_): BOOLEAN; END isOpenArray; +PROCEDURE arrcomp* (src, dst: TYPE_): BOOLEAN; + RETURN (dst.typ = tARRAY) & isOpenArray(src) & + ~isOpenArray(src.base) & ~isOpenArray(dst.base) & + isTypeEq(src.base, dst.base) +END arrcomp; + + PROCEDURE getUnit* (program: PROGRAM; name: SCAN.IDENT): UNIT; VAR item: UNIT; @@ -1059,25 +1069,15 @@ VAR BEGIN - IF typ = ARITH.tINTEGER THEN - res := program.stTypes.tINTEGER - ELSIF typ = ARITH.tREAL THEN - res := program.stTypes.tREAL - ELSIF typ = ARITH.tSET THEN - res := program.stTypes.tSET - ELSIF typ = ARITH.tBOOLEAN THEN - res := program.stTypes.tBOOLEAN - ELSIF typ = ARITH.tCHAR THEN - res := program.stTypes.tCHAR - ELSIF typ = ARITH.tWCHAR THEN - res := program.stTypes.tWCHAR - ELSIF typ = ARITH.tSTRING THEN - res := program.stTypes.tSTRING - ELSE - res := NIL - END; - - ASSERT(res # NIL) + CASE typ OF + |ARITH.tINTEGER: res := program.stTypes.tINTEGER + |ARITH.tREAL: res := program.stTypes.tREAL + |ARITH.tSET: res := program.stTypes.tSET + |ARITH.tBOOLEAN: res := program.stTypes.tBOOLEAN + |ARITH.tCHAR: res := program.stTypes.tCHAR + |ARITH.tWCHAR: res := program.stTypes.tWCHAR + |ARITH.tSTRING: res := program.stTypes.tSTRING + END RETURN res END getType; @@ -1126,10 +1126,6 @@ BEGIN EnterProc(unit, "PUT16", idSYSPROC, sysPUT16); EnterProc(unit, "COPY", idSYSPROC, sysCOPY); - ident := addIdent(unit, SCAN.enterid("CARD16"), idTYPE); - ident.type := program.stTypes.tCARD16; - ident.export := TRUE; - ident := addIdent(unit, SCAN.enterid("CARD32"), idTYPE); ident.type := program.stTypes.tCARD32; ident.export := TRUE @@ -1248,7 +1244,6 @@ BEGIN IF target # mConst.Target_iMSP430 THEN program.stTypes.tWCHAR := enterType(program, tWCHAR, 2, 0, NIL); program.stTypes.tREAL := enterType(program, tREAL, 8, 0, NIL); - program.stTypes.tCARD16 := enterType(program, tCARD16, 2, 0, NIL); program.stTypes.tCARD32 := enterType(program, tCARD32, 4, 0, NIL) END; @@ -1267,7 +1262,6 @@ BEGIN IF target # mConst.Target_iMSP430 THEN program.stTypes.tWCHAR.align := program.stTypes.tWCHAR.size; program.stTypes.tREAL.align := program.stTypes.tREAL.size; - program.stTypes.tCARD16.align := program.stTypes.tCARD16.size; program.stTypes.tCARD32.align := program.stTypes.tCARD32.size END; @@ -1280,4 +1274,4 @@ BEGIN END create; -END PROG. \ No newline at end of file +END PROG. diff --git a/programs/develop/oberon07/Source/REG.ob07 b/programs/develop/oberon07/Source/REG.ob07 index b77aebf4e2..f5abb0f2c4 100644 --- a/programs/develop/oberon07/Source/REG.ob07 +++ b/programs/develop/oberon07/Source/REG.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -293,10 +293,8 @@ PROCEDURE Lock* (VAR R: REGS; reg, offs, size: INTEGER); BEGIN ASSERT(reg IN R.vregs); ASSERT(offs # 0); + ASSERT(size IN {1, 2, 4, 8}); R.offs[reg] := offs; - IF size = 0 THEN - size := 8 - END; R.size[reg] := size END Lock; @@ -437,4 +435,4 @@ BEGIN END Init; -END REG. \ No newline at end of file +END REG. diff --git a/programs/develop/oberon07/Source/SCAN.ob07 b/programs/develop/oberon07/Source/SCAN.ob07 index 91de0575a9..e6c0aef060 100644 --- a/programs/develop/oberon07/Source/SCAN.ob07 +++ b/programs/develop/oberon07/Source/SCAN.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -51,7 +51,8 @@ TYPE IDENT* = POINTER TO RECORD (AVL.DATA) s*: LEXSTR; - offset*, offsetW*: INTEGER + offset*, offsetW*: INTEGER; + key: INTEGER END; @@ -78,19 +79,14 @@ TYPE SCANNER* = TXT.TEXT; - KEYWORD = ARRAY 10 OF CHAR; - VAR - vocabulary: RECORD + idents: AVL.NODE; - KW: ARRAY 33 OF KEYWORD; - delimiters: ARRAY 256 OF BOOLEAN; - idents: AVL.NODE; - ident: IDENT + delimiters: ARRAY 256 OF BOOLEAN; - END; + NewIdent: IDENT; upto: BOOLEAN; @@ -100,46 +96,20 @@ PROCEDURE nodecmp (a, b: AVL.DATA): INTEGER; END nodecmp; -PROCEDURE key (VAR lex: LEX); -VAR - L, R, M: INTEGER; - found: BOOLEAN; - -BEGIN - L := 0; - R := LEN(vocabulary.KW) - 1; - found := FALSE; - - REPEAT - M := (L + R) DIV 2; - - IF lex.s # vocabulary.KW[M] THEN - IF lex.s > vocabulary.KW[M] THEN - L := M + 1 - ELSE - R := M - 1 - END - ELSE - found := TRUE; - lex.sym := lxKW + M - END - UNTIL found OR (L > R) -END key; - - PROCEDURE enterid* (s: LEXSTR): IDENT; VAR newnode: BOOLEAN; node: AVL.NODE; BEGIN - vocabulary.ident.s := s; - vocabulary.idents := AVL.insert(vocabulary.idents, vocabulary.ident, nodecmp, newnode, node); + NewIdent.s := s; + idents := AVL.insert(idents, NewIdent, nodecmp, newnode, node); IF newnode THEN - NEW(vocabulary.ident); - vocabulary.ident.offset := -1; - vocabulary.ident.offsetW := -1 + NEW(NewIdent); + NewIdent.offset := -1; + NewIdent.offsetW := -1; + NewIdent.key := 0 END RETURN node.data(IDENT) @@ -181,12 +151,12 @@ BEGIN IF lex.over THEN lex.sym := lxERROR06 ELSE - lex.sym := lxIDENT; - key(lex) - END; - - IF lex.sym = lxIDENT THEN - lex.ident := enterid(lex.s) + lex.ident := enterid(lex.s); + IF lex.ident.key # 0 THEN + lex.sym := lex.ident.key + ELSE + lex.sym := lxIDENT + END END END ident; @@ -518,7 +488,7 @@ BEGIN number(text, lex) ELSIF (c = '"') OR (c = "'") THEN string(text, lex, c) - ELSIF vocabulary.delimiters[ORD(c)] THEN + ELSIF delimiters[ORD(c)] THEN delimiter(text, lex, c) ELSIF c = 0X THEN lex.sym := lxEOF; @@ -566,10 +536,13 @@ VAR delim: ARRAY 23 OF CHAR; - PROCEDURE enterkw (VAR i: INTEGER; kw: KEYWORD); + PROCEDURE enterkw (key: INTEGER; kw: LEXSTR); + VAR + id: IDENT; + BEGIN - vocabulary.KW[i] := kw; - INC(i) + id := enterid(kw); + id.key := key END enterkw; @@ -577,58 +550,60 @@ BEGIN upto := FALSE; FOR i := 0 TO 255 DO - vocabulary.delimiters[i] := FALSE + delimiters[i] := FALSE END; delim := "+-*/~&.,;|([{^=#<>:)]}"; FOR i := 0 TO LEN(delim) - 2 DO - vocabulary.delimiters[ORD(delim[i])] := TRUE + delimiters[ORD(delim[i])] := TRUE END; - i := 0; - enterkw(i, "ARRAY"); - enterkw(i, "BEGIN"); - enterkw(i, "BY"); - enterkw(i, "CASE"); - enterkw(i, "CONST"); - enterkw(i, "DIV"); - enterkw(i, "DO"); - enterkw(i, "ELSE"); - enterkw(i, "ELSIF"); - enterkw(i, "END"); - enterkw(i, "FALSE"); - enterkw(i, "FOR"); - enterkw(i, "IF"); - enterkw(i, "IMPORT"); - enterkw(i, "IN"); - enterkw(i, "IS"); - enterkw(i, "MOD"); - enterkw(i, "MODULE"); - enterkw(i, "NIL"); - enterkw(i, "OF"); - enterkw(i, "OR"); - enterkw(i, "POINTER"); - enterkw(i, "PROCEDURE"); - enterkw(i, "RECORD"); - enterkw(i, "REPEAT"); - enterkw(i, "RETURN"); - enterkw(i, "THEN"); - enterkw(i, "TO"); - enterkw(i, "TRUE"); - enterkw(i, "TYPE"); - enterkw(i, "UNTIL"); - enterkw(i, "VAR"); - enterkw(i, "WHILE"); + NEW(NewIdent); + NewIdent.s := ""; + NewIdent.offset := -1; + NewIdent.offsetW := -1; + NewIdent.key := 0; + + idents := NIL; + + enterkw(lxARRAY, "ARRAY"); + enterkw(lxBEGIN, "BEGIN"); + enterkw(lxBY, "BY"); + enterkw(lxCASE, "CASE"); + enterkw(lxCONST, "CONST"); + enterkw(lxDIV, "DIV"); + enterkw(lxDO, "DO"); + enterkw(lxELSE, "ELSE"); + enterkw(lxELSIF, "ELSIF"); + enterkw(lxEND, "END"); + enterkw(lxFALSE, "FALSE"); + enterkw(lxFOR, "FOR"); + enterkw(lxIF, "IF"); + enterkw(lxIMPORT, "IMPORT"); + enterkw(lxIN, "IN"); + enterkw(lxIS, "IS"); + enterkw(lxMOD, "MOD"); + enterkw(lxMODULE, "MODULE"); + enterkw(lxNIL, "NIL"); + enterkw(lxOF, "OF"); + enterkw(lxOR, "OR"); + enterkw(lxPOINTER, "POINTER"); + enterkw(lxPROCEDURE, "PROCEDURE"); + enterkw(lxRECORD, "RECORD"); + enterkw(lxREPEAT, "REPEAT"); + enterkw(lxRETURN, "RETURN"); + enterkw(lxTHEN, "THEN"); + enterkw(lxTO, "TO"); + enterkw(lxTRUE, "TRUE"); + enterkw(lxTYPE, "TYPE"); + enterkw(lxUNTIL, "UNTIL"); + enterkw(lxVAR, "VAR"); + enterkw(lxWHILE, "WHILE") - NEW(vocabulary.ident); - vocabulary.ident.s := ""; - vocabulary.ident.offset := -1; - vocabulary.ident.offsetW := -1; - vocabulary.idents := NIL END init; BEGIN init -END SCAN. \ No newline at end of file +END SCAN. diff --git a/programs/develop/oberon07/Source/STATEMENTS.ob07 b/programs/develop/oberon07/Source/STATEMENTS.ob07 index 8f53dd80c4..c263d4f49b 100644 --- a/programs/develop/oberon07/Source/STATEMENTS.ob07 +++ b/programs/develop/oberon07/Source/STATEMENTS.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -267,17 +267,10 @@ PROCEDURE assigncomp (e: PARS.EXPR; t: PROG.TYPE_): BOOLEAN; VAR res: BOOLEAN; - - PROCEDURE arrcomp (src, dst: PROG.TYPE_): BOOLEAN; - RETURN (dst.typ = PROG.tARRAY) & PROG.isOpenArray(src) & - ~PROG.isOpenArray(src.base) & ~PROG.isOpenArray(dst.base) & - PROG.isTypeEq(src.base, dst.base) - END arrcomp; - - BEGIN IF isExpr(e) OR (e.obj IN {ePROC, eIMP}) THEN - IF arrcomp(e.type, t) THEN + + IF t = e.type THEN res := TRUE ELSIF isInt(e) & (t.typ IN {PROG.tBYTE, PROG.tINTEGER}) THEN IF (e.obj = eCONST) & (t = tBYTE) THEN @@ -285,29 +278,16 @@ BEGIN ELSE res := TRUE END - ELSIF isSet(e) & (t = tSET) THEN - res := TRUE - ELSIF isBoolean(e) & (t = tBOOLEAN) THEN - res := TRUE - ELSIF isReal(e) & (t = tREAL) THEN - res := TRUE - ELSIF isChar(e) & (t = tCHAR) THEN - res := TRUE - ELSIF (e.obj = eCONST) & isChar(e) & (t = tWCHAR) THEN - res := TRUE - ELSIF isStringW1(e) & (t = tWCHAR) THEN - res := TRUE - ELSIF isCharW(e) & (t = tWCHAR) THEN - res := TRUE - ELSIF PROG.isBaseOf(t, e.type) THEN - res := TRUE - ELSIF ~PROG.isOpenArray(t) & ~PROG.isOpenArray(e.type) & PROG.isTypeEq(t, e.type) THEN - res := TRUE - ELSIF isNil(e) & (t.typ IN {PROG.tPOINTER, PROG.tPROCEDURE}) THEN - res := TRUE - ELSIF isString(e) & ((t.typ = PROG.tARRAY) & (t.base = tCHAR) & (t.length > strlen(e))) THEN - res := TRUE - ELSIF isStringW(e) & ((t.typ = PROG.tARRAY) & (t.base = tWCHAR) & (t.length > utf8strlen(e))) THEN + ELSIF + (e.obj = eCONST) & isChar(e) & (t = tWCHAR) + OR isStringW1(e) & (t = tWCHAR) + OR PROG.isBaseOf(t, e.type) + OR ~PROG.isOpenArray(t) & ~PROG.isOpenArray(e.type) & PROG.isTypeEq(t, e.type) + OR isNil(e) & (t.typ IN {PROG.tPOINTER, PROG.tPROCEDURE}) + OR PROG.arrcomp(e.type, t) + OR isString(e) & (t.typ = PROG.tARRAY) & (t.base = tCHAR) & (t.length > strlen(e)) + OR isStringW(e) & (t.typ = PROG.tARRAY) & (t.base = tWCHAR) & (t.length > utf8strlen(e)) + THEN res := TRUE ELSE res := FALSE @@ -315,6 +295,7 @@ BEGIN ELSE res := FALSE END + RETURN res END assigncomp; @@ -384,18 +365,10 @@ VAR res: BOOLEAN; label: INTEGER; - - PROCEDURE arrcomp (src, dst: PROG.TYPE_): BOOLEAN; - RETURN (dst.typ = PROG.tARRAY) & PROG.isOpenArray(src) & - ~PROG.isOpenArray(src.base) & ~PROG.isOpenArray(dst.base) & - PROG.isTypeEq(src.base, dst.base) - END arrcomp; - - BEGIN IF isExpr(e) OR (e.obj IN {ePROC, eIMP}) THEN res := TRUE; - IF arrcomp(e.type, VarType) THEN + IF PROG.arrcomp(e.type, VarType) THEN IF ~PROG.isOpenArray(VarType) THEN IL.Const(VarType.length) @@ -470,8 +443,6 @@ BEGIN END ELSIF (e.type.typ = PROG.tCARD32) & (VarType.typ = PROG.tCARD32) THEN IL.AddCmd0(IL.opSAVE32) - ELSIF (e.type.typ = PROG.tCARD16) & (VarType.typ = PROG.tCARD16) THEN - IL.AddCmd0(IL.opSAVE16) ELSIF ~PROG.isOpenArray(VarType) & ~PROG.isOpenArray(e.type) & PROG.isTypeEq(VarType, e.type) THEN IF e.obj = ePROC THEN IL.AssignProc(e.ident.proc.label) @@ -642,7 +613,7 @@ BEGIN stroffs := StringW(e); IL.StrAdr(stroffs) END; - IL.codes.dmin := stroffs + p.type.size; + IL.set_dmin(stroffs + p.type.size); IL.Param1 ELSE LoadConst(e); @@ -934,7 +905,7 @@ BEGIN END ELSIF (proc = PROG.sysPUT8) OR (proc = PROG.sysPUT16) OR (proc = PROG.sysPUT32) THEN - PARS.check(e2.type.typ IN {PROG.tINTEGER, PROG.tBYTE, PROG.tCHAR, PROG.tSET, PROG.tWCHAR, PROG.tCARD16, PROG.tCARD32}, pos, 66); + PARS.check(e2.type.typ IN {PROG.tINTEGER, PROG.tBYTE, PROG.tCHAR, PROG.tSET, PROG.tWCHAR, PROG.tCARD32}, pos, 66); IF e2.obj = eCONST THEN LoadConst(e2) END; @@ -1142,7 +1113,7 @@ BEGIN IF e.obj = eCONST THEN ARITH.odd(e.value) ELSE - IL.odd + IL.AddCmd0(IL.opODD) END |PROG.stORD: @@ -1156,7 +1127,7 @@ BEGIN END ELSE IF isBoolean(e) THEN - IL.ord + IL.AddCmd0(IL.opORD) END END; e.type := tINTEGER @@ -3257,10 +3228,10 @@ VAR id := PROG.getIdent(rtl, SCAN.enterid(name), FALSE); IF (id # NIL) & (id.import # NIL) THEN - IL.codes.rtl[idx] := -id.import(IL.IMPORT_PROC).label; + IL.set_rtl(idx, -id.import(IL.IMPORT_PROC).label); id.proc.used := TRUE ELSIF (id # NIL) & (id.proc # NIL) THEN - IL.codes.rtl[idx] := id.proc.label; + IL.set_rtl(idx, id.proc.label); id.proc.used := TRUE ELSE ERRORS.WrongRTL(name) @@ -3276,7 +3247,6 @@ BEGIN getproc(rtl, "_strcmp", IL._strcmp); getproc(rtl, "_length", IL._length); getproc(rtl, "_arrcpy", IL._arrcpy); - getproc(rtl, "_move", IL._move); getproc(rtl, "_is", IL._is); getproc(rtl, "_guard", IL._guard); getproc(rtl, "_guardrec", IL._guardrec); @@ -3284,13 +3254,10 @@ BEGIN getproc(rtl, "_new", IL._new); getproc(rtl, "_rot", IL._rot); getproc(rtl, "_strcpy", IL._strcpy); - getproc(rtl, "_move2", IL._move2); - getproc(rtl, "_div2", IL._div2); - getproc(rtl, "_mod2", IL._mod2); - getproc(rtl, "_div", IL._div); - getproc(rtl, "_mod", IL._mod); + getproc(rtl, "_move", IL._move); + getproc(rtl, "_divmod", IL._divmod); getproc(rtl, "_set", IL._set); - getproc(rtl, "_set2", IL._set2); + getproc(rtl, "_set1", IL._set1); getproc(rtl, "_isrec", IL._isrec); getproc(rtl, "_lengthw", IL._lengthw); getproc(rtl, "_strcmpw", IL._strcmpw); @@ -3339,9 +3306,9 @@ BEGIN LISTS.push(CaseVariants, NewVariant(0, NIL)); CASE CPU OF - |cpuAMD64: IL.init(6, IL.little_endian) - |cpuX86: IL.init(8, IL.little_endian) - |cpuMSP430: IL.init(0, IL.little_endian) + |cpuAMD64: IL.init(6, IL.little_endian) + |cpuX86: IL.init(8, IL.little_endian) + |cpuMSP430: IL.init(0, IL.little_endian) END; IF CPU # cpuMSP430 THEN @@ -3382,15 +3349,15 @@ BEGIN PROG.DelUnused(PARS.program, IL.DelImport); - IL.codes.bss := PARS.program.bss; + IL.set_bss(PARS.program.bss); CASE CPU OF - | cpuAMD64: AMD64.CodeGen(IL.codes, outname, target, options) - | cpuX86: X86.CodeGen(IL.codes, outname, target, options) - |cpuMSP430: MSP430.CodeGen(IL.codes, outname, target, options) + | cpuAMD64: AMD64.CodeGen(outname, target, options) + | cpuX86: X86.CodeGen(outname, target, options) + |cpuMSP430: MSP430.CodeGen(outname, target, options) END END compile; -END STATEMENTS. \ No newline at end of file +END STATEMENTS. diff --git a/programs/develop/oberon07/Source/STRINGS.ob07 b/programs/develop/oberon07/Source/STRINGS.ob07 index 2905c08b81..2ab48c5e74 100644 --- a/programs/develop/oberon07/Source/STRINGS.ob07 +++ b/programs/develop/oberon07/Source/STRINGS.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -311,4 +311,4 @@ BEGIN END Utf8To16; -END STRINGS. \ No newline at end of file +END STRINGS. diff --git a/programs/develop/oberon07/Source/TEXTDRV.ob07 b/programs/develop/oberon07/Source/TEXTDRV.ob07 index 5838782399..4e75c78db8 100644 --- a/programs/develop/oberon07/Source/TEXTDRV.ob07 +++ b/programs/develop/oberon07/Source/TEXTDRV.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -21,7 +21,7 @@ TYPE TEXT* = POINTER TO RECORD (C.ITEM) - chunk: ARRAY CHUNK OF BYTE; + chunk: ARRAY CHUNK OF CHAR; pos, size: INTEGER; file: FILES.FILE; utf8: BOOLEAN; @@ -47,9 +47,9 @@ BEGIN text.pos := 0; IF text.size = 0 THEN text.eof := TRUE; - text.chunk[0] := 0 + text.chunk[0] := 0X END; - text.peak := CHR(text.chunk[0]) + text.peak := text.chunk[0] END END load; @@ -61,7 +61,7 @@ VAR BEGIN IF text.pos < text.size - 1 THEN INC(text.pos); - text.peak := CHR(text.chunk[text.pos]) + text.peak := text.chunk[text.pos] ELSE load(text) END; @@ -87,7 +87,7 @@ BEGIN ELSE text.eol := FALSE; IF text.utf8 THEN - IF (c < 80X) OR (c > 0BFX) THEN + IF ORD(c) DIV 64 # 2 THEN INC(text.col) END ELSE @@ -104,16 +104,16 @@ END next; PROCEDURE init (text: TEXT); BEGIN IF (text.pos = 0) & (text.size >= 3) THEN - IF (text.chunk[0] = 0EFH) & - (text.chunk[1] = 0BBH) & - (text.chunk[2] = 0BFH) THEN + IF (text.chunk[0] = 0EFX) & + (text.chunk[1] = 0BBX) & + (text.chunk[2] = 0BFX) THEN text.pos := 3; text.utf8 := TRUE END END; IF text.size = 0 THEN - text.chunk[0] := 0; + text.chunk[0] := 0X; text.size := 1; text.eof := FALSE END; @@ -121,7 +121,7 @@ BEGIN text.line := 1; text.col := 1; - text.peak := CHR(text.chunk[text.pos]) + text.peak := text.chunk[text.pos] END init; @@ -152,7 +152,7 @@ BEGIN END; IF text # NIL THEN - text.chunk[0] := 0; + text.chunk[0] := 0X; text.pos := 0; text.size := 0; text.utf8 := FALSE; @@ -177,4 +177,4 @@ END open; BEGIN texts := C.create() -END TEXTDRV. \ No newline at end of file +END TEXTDRV. diff --git a/programs/develop/oberon07/Source/UTILS.ob07 b/programs/develop/oberon07/Source/UTILS.ob07 index c31ac8189e..e64b440ec0 100644 --- a/programs/develop/oberon07/Source/UTILS.ob07 +++ b/programs/develop/oberon07/Source/UTILS.ob07 @@ -1,13 +1,13 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) MODULE UTILS; -IMPORT HOST, UNIXTIME; +IMPORT HOST; CONST @@ -24,6 +24,11 @@ CONST max32* = 2147483647; +TYPE + + DAYS = ARRAY 12, 31, 2 OF INTEGER; + + VAR time*: INTEGER; @@ -48,8 +53,10 @@ VAR bit_diff*: INTEGER; + days: DAYS; -PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER; + +PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER; RETURN HOST.FileRead(F, Buffer, bytes) END FileRead; @@ -114,6 +121,11 @@ BEGIN END GetCurrentDirectory; +PROCEDURE GetUnixTime* (year, month, day, hour, min, sec: INTEGER): INTEGER; + RETURN ((year - 1970) * 365 + days[month - 1, day - 1, ORD(year DIV 4 = 0)] + (year - 1969) DIV 4) * 86400 + hour * 3600 + min * 60 + sec +END GetUnixTime; + + PROCEDURE UnixTime* (): INTEGER; VAR year, month, day, hour, min, sec: INTEGER; @@ -124,7 +136,7 @@ BEGIN res := HOST.UnixTime() ELSE HOST.now(year, month, day, hour, min, sec); - res := UNIXTIME.time(year, month, day, hour, min, sec) + res := GetUnixTime(year, month, day, hour, min, sec) END RETURN res @@ -201,9 +213,52 @@ BEGIN END Log2; +PROCEDURE init (VAR days: DAYS); +VAR + i, j, n0, n1: INTEGER; + +BEGIN + + FOR i := 0 TO 11 DO + FOR j := 0 TO 30 DO + days[i, j, 0] := 0; + days[i, j, 1] := 0; + END + END; + + days[ 1, 28, 0] := -1; + + FOR i := 0 TO 1 DO + days[ 1, 29, i] := -1; + days[ 1, 30, i] := -1; + days[ 3, 30, i] := -1; + days[ 5, 30, i] := -1; + days[ 8, 30, i] := -1; + days[10, 30, i] := -1; + END; + + n0 := 0; + n1 := 0; + FOR i := 0 TO 11 DO + FOR j := 0 TO 30 DO + IF days[i, j, 0] = 0 THEN + days[i, j, 0] := n0; + INC(n0) + END; + IF days[i, j, 1] = 0 THEN + days[i, j, 1] := n1; + INC(n1) + END + END + END + +END init; + + BEGIN time := GetTickCount(); COPY(HOST.eol, eol); maxreal := 1.9; - PACK(maxreal, 1023) -END UTILS. \ No newline at end of file + PACK(maxreal, 1023); + init(days) +END UTILS. diff --git a/programs/develop/oberon07/Source/WRITER.ob07 b/programs/develop/oberon07/Source/WRITER.ob07 index 4781013bd1..985f9ddaa6 100644 --- a/programs/develop/oberon07/Source/WRITER.ob07 +++ b/programs/develop/oberon07/Source/WRITER.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -108,4 +108,4 @@ BEGIN END Close; -END WRITER. \ No newline at end of file +END WRITER. diff --git a/programs/develop/oberon07/Source/X86.ob07 b/programs/develop/oberon07/Source/X86.ob07 index fde3b94b47..af8fa42205 100644 --- a/programs/develop/oberon07/Source/X86.ob07 +++ b/programs/develop/oberon07/Source/X86.ob07 @@ -1,7 +1,7 @@ -(* +(* BSD 2-Clause License - Copyright (c) 2018, 2019, Anton Krotov + Copyright (c) 2018-2019, Anton Krotov All rights reserved. *) @@ -573,7 +573,7 @@ BEGIN END GetRegA; -PROCEDURE translate (code: IL.CODES; pic: BOOLEAN; stroffs: INTEGER); +PROCEDURE translate (pic: BOOLEAN; stroffs: INTEGER); VAR cmd: COMMAND; @@ -586,7 +586,7 @@ VAR float: REAL; BEGIN - cmd := code.commands.first(COMMAND); + cmd := IL.codes.commands.first(COMMAND); WHILE cmd # NIL DO @@ -1186,27 +1186,29 @@ BEGIN |8: PushAll(0); - push(reg2); push(reg1); + push(reg2); pushc(8); CallRTL(pic, IL._move) END |IL.opSAVES: - UnOp(reg1); - drop; - PushAll(0); - push(reg1); + UnOp(reg2); + REG.PushAll_1(R); IF pic THEN + reg1 := GetAnyReg(); Pic(reg1, BIN.PICDATA, stroffs + param2); - push(reg1) + push(reg1); + drop ELSE OutByte(068H); // push _data + stroffs + param2 Reloc(BIN.RDATA, stroffs + param2); END; + push(reg2); + drop; pushc(param1); CallRTL(pic, IL._move) @@ -1458,16 +1460,17 @@ BEGIN GetRegA |IL.opRSETL: - PushAll(1); + UnOp(reg1); + REG.PushAll_1(R); pushc(param2); - CallRTL(pic, IL._set2); + push(reg1); + drop; + CallRTL(pic, IL._set); GetRegA |IL.opRSET1: - UnOp(reg1); PushAll(1); - push(reg1); - CallRTL(pic, IL._set); + CallRTL(pic, IL._set1); GetRegA |IL.opINCL, IL.opEXCL: @@ -1497,7 +1500,7 @@ BEGIN |IL.opDIV: PushAll(2); - CallRTL(pic, IL._div); + CallRTL(pic, IL._divmod); GetRegA |IL.opDIVR: @@ -1540,20 +1543,24 @@ BEGIN ELSE PushAll(1); pushc(param2); - CallRTL(pic, IL._div); + CallRTL(pic, IL._divmod); GetRegA END END |IL.opDIVL: - PushAll(1); + UnOp(reg1); + REG.PushAll_1(R); pushc(param2); - CallRTL(pic, IL._div2); + push(reg1); + drop; + CallRTL(pic, IL._divmod); GetRegA |IL.opMOD: PushAll(2); - CallRTL(pic, IL._mod); + CallRTL(pic, IL._divmod); + mov(eax, edx); GetRegA |IL.opMODR: @@ -1589,15 +1596,20 @@ BEGIN ELSE PushAll(1); pushc(param2); - CallRTL(pic, IL._mod); + CallRTL(pic, IL._divmod); + mov(eax, edx); GetRegA END END |IL.opMODL: - PushAll(1); + UnOp(reg1); + REG.PushAll_1(R); pushc(param2); - CallRTL(pic, IL._mod2); + push(reg1); + drop; + CallRTL(pic, IL._divmod); + mov(eax, edx); GetRegA |IL.opERR: @@ -1613,11 +1625,11 @@ BEGIN |IL.opCOPY: PushAll(2); pushc(param2); - CallRTL(pic, IL._move2) + CallRTL(pic, IL._move) |IL.opMOVE: PushAll(3); - CallRTL(pic, IL._move2) + CallRTL(pic, IL._move) |IL.opCOPYA: PushAll(4); @@ -2075,9 +2087,9 @@ BEGIN END translate; -PROCEDURE prolog (code: IL.CODES; pic: BOOLEAN; target, stack, dllinit, dllret: INTEGER); +PROCEDURE prolog (pic: BOOLEAN; target, stack, dllinit, dllret: INTEGER); VAR - reg1, entry, dcount: INTEGER; + reg1, entry, L, dcount: INTEGER; BEGIN @@ -2131,7 +2143,7 @@ BEGIN Reloc(BIN.RDATA, 0) END; - dcount := CHL.Length(code.data); + dcount := CHL.Length(IL.codes.data); pushc(tcount); @@ -2145,11 +2157,26 @@ BEGIN Reloc(BIN.RDATA, tcount * 4 + dcount) END; - CallRTL(pic, IL._init) + CallRTL(pic, IL._init); + + IF target = mConst.Target_iELF32 THEN + L := NewLabel(); + pushc(0); + push(esp); + pushc(1024 * 1024 * stack); + pushc(0); + CallRTL(pic, IL._new); + pop(eax); + test(eax); + jcc(je, L); + addrc(eax, 1024 * 1024 * stack - 4); + mov(esp, eax); + SetLabel(L) + END END prolog; -PROCEDURE epilog (code: IL.CODES; pic: BOOLEAN; modname: ARRAY OF CHAR; target, stack, ver, dllinit, dllret, sofinit: INTEGER); +PROCEDURE epilog (pic: BOOLEAN; modname: ARRAY OF CHAR; target, stack, ver, dllinit, dllret, sofinit: INTEGER); VAR exp: IL.EXPORT_PROC; path, name, ext: PATHS.PATH; @@ -2200,14 +2227,14 @@ BEGIN fixup; - dcount := CHL.Length(code.data); + dcount := CHL.Length(IL.codes.data); FOR i := 0 TO tcount - 1 DO - BIN.PutData32LE(program, CHL.GetInt(code.types, i)) + BIN.PutData32LE(program, CHL.GetInt(IL.codes.types, i)) END; FOR i := 0 TO dcount - 1 DO - BIN.PutData(program, CHL.GetByte(code.data, i)) + BIN.PutData(program, CHL.GetByte(IL.codes.data, i)) END; program.modname := CHL.Length(program.data); @@ -2221,33 +2248,33 @@ BEGIN BIN.Export(program, "lib_init", dllinit); END; - exp := code.export.first(IL.EXPORT_PROC); + exp := IL.codes.export.first(IL.EXPORT_PROC); WHILE exp # NIL DO BIN.Export(program, exp.name, exp.label); exp := exp.next(IL.EXPORT_PROC) END; - import(code.import); + import(IL.codes.import); - code.bss := MAX(code.bss, MAX(code.dmin - CHL.Length(code.data), 4)); + IL.set_bss(MAX(IL.codes.bss, MAX(IL.codes.dmin - CHL.Length(IL.codes.data), 4))); - BIN.SetParams(program, code.bss, stack * (1024 * 1024), WCHR(ver DIV 65536), WCHR(ver MOD 65536)); + BIN.SetParams(program, IL.codes.bss, stack * (1024 * 1024), WCHR(ver DIV 65536), WCHR(ver MOD 65536)); END epilog; -PROCEDURE CodeGen* (code: IL.CODES; outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS); +PROCEDURE CodeGen* (outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS); VAR dllret, dllinit, sofinit: INTEGER; opt: PROG.OPTIONS; BEGIN - tcount := CHL.Length(code.types); + tcount := CHL.Length(IL.codes.types); opt := options; CodeList := LISTS.create(NIL); - program := BIN.create(code.lcount); + program := BIN.create(IL.codes.lcount); dllinit := NewLabel(); dllret := NewLabel(); @@ -2263,14 +2290,14 @@ BEGIN REG.Init(R, push, pop, mov, xchg, NIL, NIL, {eax, ecx, edx}, {}); - prolog(code, opt.pic, target, opt.stack, dllinit, dllret); - translate(code, opt.pic, tcount * 4); - epilog(code, opt.pic, outname, target, opt.stack, opt.version, dllinit, dllret, sofinit); + prolog(opt.pic, target, opt.stack, dllinit, dllret); + translate(opt.pic, tcount * 4); + epilog(opt.pic, outname, target, opt.stack, opt.version, dllinit, dllret, sofinit); BIN.fixup(program); IF target IN {mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL} THEN - PE32.write(program, outname, opt.base, target = mConst.Target_iConsole, target = mConst.Target_iDLL, FALSE) + PE32.write(program, outname, target = mConst.Target_iConsole, target = mConst.Target_iDLL, FALSE) ELSIF target = mConst.Target_iKolibri THEN KOS.write(program, outname) ELSIF target = mConst.Target_iObject THEN @@ -2289,4 +2316,4 @@ BEGIN END SetProgram; -END X86. \ No newline at end of file +END X86.