Note: Since v4.5, executable is scol.exe (no more usmwin.exe) Tmp Note: Error messages: - src/kernel/compiler/typcheck.cpp - src/kernel/compiler/typmisc.cpp - Look for >>> ERROR (just started replacing, still in progress) kernel45/src/kernel/include/vscol.h *********************************** v4.6a1 #define VERSION_N (2001) #define PREFSE "4.6" #define SUFFSE "alpha" v4.6a5 #define VERSION_N (2003) #define PREFSE "4.6" #define SUFFSE "c" v4.6a6 #define VERSION_N (2004) #define PREFSE "4.6" #define SUFFSE "d" v5.00 (Former v4.6a7) #define VERSION_N (2007) #define PREFSE "5.0" #define SUFFSE "0" #define VERSION_D ((time_t)0xc64986d5) Added last VM compilation date (use tools/vm/get_new_version.scol to generate) v5.01 #define VERSION_N (2008) #define PREFSE "5.0" #define SUFFSE "1" #define VERSION_D ((time_t)0xc6e7d47c) v5.10 #define VERSION_N (2010) #define PREFSE "5.1" #define SUFFSE "0" #define VERSION_D ((time_t)0xc73081d0) v5.11 #define VERSION_N (2011) #define PREFSE "5.1" #define SUFFSE "1" #define VERSION_D ((time_t)0xc73081d0) Unchanged (Not a public version) v5.20 #define VERSION_N (2012) #define PREFSE "5.2" #define SUFFSE "0" #define VERSION_D ((time_t)0xc7b1adee) v5.21 #define VERSION_N (2013) #define PREFSE "5.2" #define SUFFSE "1" #define VERSION_D ((time_t)0xc7b1adee) Unchanged (Not a public version / Ltd distributed version) v5.22 #define VERSION_N (2014) #define PREFSE "5.2" #define SUFFSE "2" #define VERSION_D ((time_t)0xc7b1adee) Unchanged (Not a public version / Ltd distributed version) v5.23 #define VERSION_N (2015) #define PREFSE "5.2" #define SUFFSE "3" #define VERSION_D ((time_t)0xc7f36099) v5.24 #define VERSION_N (2016) #define PREFSE "5.2" #define SUFFSE "4" #define VERSION_D ((time_t)0xc7f36099) Unchanged (Not a public version / Ltd distributed version) v5.2.05 #define VERSION_N (2017) #define PREFSE "5.2" #define SUFFSE ".05" #define VERSION_D ((time_t)0xc80dfcdb) v5.2.06 #define VERSION_N (2018) #define PREFSE "5.2" #define SUFFSE ".06" #define VERSION_D ((time_t)0xc80dfcdb) Dev version v5.3.00 #define VERSION_N (2020) #define PREFSE "5.3" #define SUFFSE ".00" #define VERSION_D ((time_t)0xc8490db8) Major change: Files & directories management v5.3.01 #define VERSION_N (2021) #define PREFSE "5.3" #define SUFFSE ".01" #define VERSION_D ((time_t)0xc8490db8) Unchanged (Not a public version / Ltd distributed version) v5.3.02 #define VERSION_N (2022) #define PREFSE "5.3" #define SUFFSE ".02" #define VERSION_D ((time_t)0xc8c7a328) Beta v5.3.03 #define VERSION_N (2023) #define PREFSE "5.3" #define SUFFSE ".03" #define VERSION_D ((time_t)0xc94bfb22) Beta v5.3.04 //BB #define VERSION_N (2024) #define PREFSE "5.3" #define SUFFSE ".04" #define VERSION_D ((time_t)0xc9d2187f) Beta kernel45/src/kernel/scol.c ************************** v4.6a2 050924: _fooId() New function - As _fooI() but with decimal output. Note: The output is limited to 9 digits. This seems to come from sprintf(). The problem is present in other _foo or conversion functions, at least once displayed. v4.6a3: Implementation of Windows Registry Access functions. API initialized in SCOLloadWinReg(). General notes: - Registry access is limited to HKEY_LOCAL_MACHINE\SOFTWARE\Scol-Technologies\ and below. - All access paths are relative to this registry key. - Note that management of Values is accepted directly at the above Scol root Key (relative path coded as ""). But we recommend you to create your own personal/application SubKeys and to work with your own Values in these SubKeys. - For Windows compatibility issues, we recommend to limit the size of Key or Value names to 255 characters, and the content of Values to 2048 characters. This last limit is hardcoded. As explained in MSDN, bigger content should be stored in files and the file names stored in the registry. - Most new functions return a I value: 0 if the action was successful, NIL otherwise. _winreg_createkey() New function: Lets you add a new Key to the Registry. Prototype: fun [S] I Parameters: Key name Example: _winreg_createkey "Kyrien\\Scol-Voyager\\Infos\\ToDel\\SubKey"; _winreg_deletekey() New function: Lets you delete a Key from the Registry. Prototype: fun [S] I Parameters: Key name Example: _winreg_deletekey "Kyrien\\Scol-Voyager\\Infos\\ToDel"; _winreg_setvalue() New function: Lets you add (or update) a Value under a Key. Prototype: fun [S S I S] I Parameters: Key name, Value name and then Value content (I or S, other one set to NIL) Note: Parameters accepted types are I (C++ REG_DWORD) and S (C++ REG_SZ: base character strings) Examples: _winreg_setvalue "Kyrien\\Scol-Voyager\\Infos" "INT" 0xffff00 nil; _winreg_setvalue "Kyrien\\Scol-Voyager\\Infos" "STR" nil "0xffffff"; _winreg_getvalue() New function: Lets you retrieve the content of a Value. Prototype: fun [S S] [I S] Parameters: Key name, Value name Returns: Tuple if successful, NIL otherwise. The tuple contains the content of of the Value (I or S, other tuple member set to NIL) Example: let _winreg_getvalue "Kyrien\\Scol-Voyager\\Infos" "INT" -> val in let val -> [int str] in ... _winreg_delvalue() New function: Lets you delete a Value entry under a Key. Prototype: fun [S S] I Parameters: Key name, Value name Example: _winreg_delvalue "Kyrien\\Scol-Voyager\\Infos" "STR"; v5.11 080204: Removed various comparisons between maxsock & MAXSOCKS maxsock is initialized as MAXSOCKS and never modified (cf testLicence in scolsys.cpp) except in case of ReduceCapacity. v5.2.06 080428: _logClear() New function - fun [] I Clears the logs Params: - Return: 1 or 0 if some files couldn't be deleted (list available in log) Can't return 1 if logs are activated of course. 080526: _isStartMode New function - fun [] I Checks VM starting mode Params: - Return: 0, or 1 in specific case where the Voyager is started from a .scol file. 080526: MAJOR CHANGE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! New file organization. cf _blg_5.2.06_major_change.txt file. A few files had to be modified to implement this. - src/win/myloop.cpp - src/kernel/scol.c - src/kernel/scolsys.cpp - src/kernel/scolsign.cpp - src/kernel/mainscol.c Other Scol programs had to be modified too: ZooGL24 & Scol.exe kernel45/src/win/hardload.c *************************** v4.6a3 051022: SCOLloadWinReg() Added prototype of the function as well as its call in SCinitsyspack(). Used to register Windows Registry Access functions. cf 'scol.c' above. v5.22 080304: SCinitsyspack() This function, called in src/kernel/scol.c by SCinit() loads System Packages (DLLs) and creates the minimal environment through createInitialEnvironment() which can be found in src/kernel/listlab.c. However, adding new functionalities to the VM increases the size of this environment. We came to a point where filling the environment triggered a GC, this one crashing the VM by corrupting (while cleaning) pre-computed reference pointers and bringing the VM to a crash ... The GC in fact is triggered because we're running out of memory and we're asking for more. So, I added a new entry in the Mmachine structure to allow protection from GC while building our minimal environment (and possibly for other actions too). This flag hinders calls to MMgc() while we call MMneedMemory(), both functions being located in src/kernel/mmemory.c. Modifications: - SCinitsyspack(): protecting and unprotecting GC during call to createInitialEnvironment. - src/kernel/mainscol.c - mainscol(): flag initialized to 0. - src/kernel/mmemory.c - MMneedMemory(): calling GC only if flag is set to 0 (unprotected). Mmachine structure modifications: - src/kernel/mmemory.h Modified too for: Kernel40, xTension - src/kernel/scolplugin.h Modified too for: 2D, 2DOS, blg_frmdbg, Kernel 40, MMedia, SerialIO, xTension - src/kernel/include/kernel.h Modified too for: Kernel40 - (SQL) kernel/x/winuser.h Modified too for: xTension, wii, ZooGL v5.3.03 081213: SCinitsyspack() The above lckdGC parameter management has been moved to scol.c to encompass the whole init process. Other modified files: - src/kernel/scol.c kernel45/src/kernel/mzip.c ************************** v4.6a2 (intermediary v4.6a1 - v4.6a2) 050902: MGzip() & MGunzip() Fixed some buffer overflow that corrupted zipped/unzipped data. kernel45/src/kernel/scolpack.c ****************************** v4.6a3 051001: _isCacheActivated() New function - fun _isCacheActivated[] I Returns 1 if Cache is activated, 0 if not. Function definition: kernel45/src/kernel/scolpack.h & kernel45/src/kernel/scol.c 051001: _loadS() "Fixed" the temporary pkg file location. -> to do: no more use of temporary files (didn't find the way to delete the file) v4.6a4 051121: _loadS() Final fix (cf v4.6a3) Modified SPloadpakS; Added BLG_SPloadpakbisS() scolpack.h has been modified too, as well as: loadpak.cpp & loadpak.h : Added BLG_PKloaderS() & BLG_PKloaderS2() kernel45/src/kernel/compiler/lexer.cpp & lexer.h : Added BLG_MopenpackS() v4.6a6 061125: _appendpack() "Fixed" "cannot write file" error. v5.22 080317: _uncypherpack() New function - fun[S S] I Decrypts a file crypted through Cipher method Params: source & destination files Return: 0 or nil if problem Other modified files: - kernel45/src/kernel/scolpack.h - kernel45/src/kernel/scol.c - kernel45/src/kernel/cipher.h & cipher.cpp v5.24 080418: _filemd5() New function - fun[P] S Signs a file through MD5 algorythm Param: source file Return: signature Other modified files: - kernel45/src/kernel/scolpack.h - kernel45/src/kernel/scol.c New files: - kernel45/src/kernel/md5.h & md5.c v5.2.06 080424: _filemd5() Fixed bug on NIL param 080428: _cacheClear() New function - fun [] I Clears the Cache Params: - Return: 1 or 0 is some files couldn't be deleted (list available in log) Other modified files: - kernel45/src/kernel/scolpack.h - kernel45/src/kernel/scol.c kernel45/src/kernel/baselib.cpp ******************************* v4.6a4 051116: New functions by: $JI - julia.interactive@wanadoo.fr ftoa5d(), ftoa4d(), ftoa3d(), ftoa2d(), ftoa1d() Same as ftoa() but with reduced precision. ftoa() is based on C sprintf() function, with a precision of 6 digits after dot. Other modifications: kernel45/src/kernel/compiler/lexer.cpp & lexer.h 051117: MBnth_char() Fixed a bad interpretation of returned values above 0x7F. Chars are unsigned, but the returned value is a signed integer. A value of 0x7F or below was returned correctly (signed/positive). A value above 0x7F was interpreted as a signed/negative integer. Returned value is now in the 0-255 range. 060105: Fixed ftoa5d(), ftoa4d(), ftoa3d(), ftoa2d() & ftoa1d() Purpose of the functions was to allow display of Floats without rounding the values (ftoa() may round up the last/sixth digit) as this brought problems in some Text Control based applications. First version of the functions didn't bring the proper results. Additional modifications in lexer.cpp & lexer.h have been removed. v5.11 080204: memcpy() optimization. cf blg_memory.h 080204: New F type functions: minf - fun [F F] F maxf - fun [F F] F 080204: New string management functions: strcatinit - fun [I] S - Initializes a string of given length. Memory is allocated but string appears as empty. strcatblit - fun [S S] S - Blits the content of a string at the end of an initialized one. strcatlen - fun [S] I - Returns the length of an initialised string (what is used from the initial buffer). 080204: Removed various comparisons between maxsock & MAXSOCKS maxsock is initialized as MAXSOCKS and never modified (cf testLicence in scolsys.cpp) except in case of ReduceCapacity. 080204: strlowercase() & struppercase() Optimized through BLG_lowercase() & BLG_uppercase(). cf blg_memory.h v5.22 080318: Fixed memcpy() optimization. cf blg_memory.h 080320: _mkscript() & _scriptc() Fixed following bug: In DHDMS, when you call _DMSsend(), you in fact construct 2 defcoms. The first one is the one you want to use and the second one is hidden/encapsulated in DHDMS. When you want to send a big msg through a defcom (in DHDMS), the first defcom construction fails (nicefully, and this is normal behaviour). However, the second defcom depends on the first one, more precisely on a script built from the first one. If the script is "" (this is the case if defcom1 failed), we get a crash... Explanation: _mkscript doesn't expect an "empty" comm. It blits a \n\0 at the end of its output. However, the location is computed from comm's string length, \0 being the last character, and \n being placed 1 byte before. In the case of an "empty" comm, \0 is put at position 0 ... and \n at position -1 !!! Writing at position -1 overwrite string's size information and corrupts VM's memory. (string size is after that seen as 0x0A000000 - 0x0A being char 10: \n). When the corrupted size is used in MBcom2()/NMBsizetext() to check if it's to big to be accepted, we trigger some access violation and get the crash. Solution: _mkscript() has been modified to be able to use an "empty" comm, and what this returns can be sent through a comm. _scriptc() has been modified to manage received "empty" comm message without considering this as an anomaly. Other modified files: - kernel45/src/kernel/scolsys.cpp 080331: _on() Fixed following bug: In DHDMS, when calling multiple times _DMSsend() on 8192Bytes (average maximum adviced size in documentation) continuous data chunks (from a very big data string), we could cause our client/server channel to be broken ... Debugging shows that channel is brought down from receiver side because received data is corrupted in some way. Error message in receiver log: #HACK : bad size 4 In fact, what we receive is a Comm message of size 2, the message being \0\0 ... The message can be tracked on sender side where we see that it comes from the Comm constructor. Further investigations shows that it results from a too big message (>16384Bytes). What happened: - We sent a 8192Bytes message (with a lot of special characters within) - The defcom protects these characters with \, increasing the initial size. - Thanks to DHDMS which encapsulates our defcom in its own, special characters growth isn't x2 but x4 and we finally reached the big message limit, bringing down our channel ... This "explains" why the documentation says that the sending limit is "around 8KB" ... Solution: I increased the limit to 32KB. However, documentation wasn't changed, so adviced sending size is still 8KB. This is to avoid that the same problem appears again ... Modified file: - src/kernel/baselib.h v5.24 080418: strmd5() New function: fun [S] S Signs a string using MD5 algorythm. New files: - src/kernel/md5.h & md5.c Other modified files: - kernel45/src/kernel/scol.c v5.2.06 080519: strtrim() New function: fun [S] S Per as PHP trim() function. Removes spaces found at the beginning and at the end of a string. Other modified files: - kernel45/src/kernel/scol.c v5.3.01 080612: lgetinfo() New function: fun [[[S r1] r1] S] S Per as the Scol lib getInfo() function. 20x faster. 080612: lgetinfoi() New function: fun [[[S r1] r1] S] S Per as the Scol lib getInfoI() function. 10x faster. 080612: lgetinfos() New function: fun [[[S r1] r1] S] [S r1] Per as the Scol lib getInfos() function. 20x faster. 080613: lcat() New function: fun [[u0 r1] [u0 r1]] [u0 r1] Per as the Scol lib listcat() function. 20% faster. kernel45/src/win/timer.c ************************ v4.6a4 051213: General notes about Timers modifications: Timers precision, evaluation and reliability have been greatly improved. _starttimer() Minimum period is now 1ms if the client system is able to handle this. Couldn't test this, but _starttimer() should use the minimum accepted period if the specified period is too low. _gettimerscapabilities() New function - fun _gettimerscapabilities[] [I I] Retrieves the periods accepted by the client system. Params: - Return: Minimum and maximum periods _settimerperiod() New function - fun _settimerperiod[Timer I] I Dynamically updates a Timer's period. Params: Timer and new period Return: 0 or NIL if problem occured kernel45/src/kernel/scolsys.cpp ******************************* v4.6a5 060128: _trimmemory() New function - fun _trimmemory[] I Performs a Windows GC for your current application / scol.exe process Works on Win NT, 2000 and XP (Doesn't crash other systems of course) Params: - Return: 0 or nil if a problem occured. Why this new function: To reassure end users regarding the use of resources by Scol. Symptom: Open the Task Manager, Access a Scol site and have a look at the memory used. Minimize and restore the main window of the Scol site, then have a look a the memory used. This may have been divided by 10 ! Basic explanation: This doesn't have anything to do with Scol (Although the difference will certainly be enormous for a Scol site compared to Notepad behaviour). This is the way Windows works. http://support.microsoft.com/default.aspx?scid=kb;en-us;293215 As far as I understand: - The memory use that is displayed by the Task Manager for a process includes: - RAM used by the application (code, data ...) - Application data swapped on harddrive - Memory used by closely related system DLLs (this may be used and shared - not dupplicated, except in Task Manager - by many processes) - Memory which was formerly allocated for the application but which has been already (and successfully) released. The memory use should be interpreted as what is called Adress Space, not real-time memory use. - When you minimize the main window of your application, Windows performs an aggressive memory trimming/cleaning: - All application data in RAM (this is called Working Set) that isn't currently in use is considered as deletable (it stays in RAM until another process requires these memory slots, and when this happens, our data is swapped to harddrive). I say "currently in use" to simplify, all this is automatically handled by Windows. - All formerly allocated/released memory disappears from Address Space. - The Address Space is re-organized (as if "defragmented"). - This is what _trimmemory() does, without minimizing the main window. The method is probably less agressive and thus releases less resources. However the result is clearly visible in Task Manager (and transparent for the end user). Warning: As for any "Garbage Collector" like operation, this is consumming CPU resources. It is thus recommended to use it wisely. Furthermore, if other heavy tasks are running on your computer, don't forget that they may force your data to be swapped on your hardrive, forcing the system to load them back when necessary. Example 1: C3D3 - C3D3 may be a wise choice to implement this function as it is often one of the last loaded modules, and one of the heaviest ones. - A (mixed modules) Scol site may drop from 40 to 25MB if you trim the memory after scene loading. - It may even drop to 10MB if you trim the memory after loading the plugins. - And if your site really loads the C3D3 by the end, then why not 5MB. Why should an end-user be afraid of that ? Example 2: Voyager - Trimming the memory after basic initialization drops displayed memory use from 18MB to 5MB. - Displaying it will usually bring the displayed memory use back to 10MB. - However, minimizing it again will drop displayed memory use to 1MB !!! 060531: testLicense() Number of concurrently running sites was 50 (with 1Million of clients). Increased the number to 1000 (3D Blog project from I-Maginer.com). v4.6a7 070515: SCversiondate() New function - fun[] I Returns the date of the last VM (main DLL) compilation. Params: - Return: Date, number of seconds since 1970 (as per time() function) Other modified files: - kernel45/src/kernel/include/vscol.h Added VERSION_D variable - kernel45/src/kernel/scolsys.h Added function proto - kernel45/src/kernel/scol.c Added function v5.2.06 080526: _getScolProcesses() New function - fun[] I Returns the number of running scol.exe processes Params: - Return: Number of running Scol processes (for current user) Other modified files: - kernel45/src/kernel/scolsys.h Added function proto - kernel45/src/kernel/scol.c Added function src/kernel/compiler/token.h *************************** v4.6a5 060727: kMaxStringLiteralLength (type S size limit, at least for log writing) Modified constant value from 16KB to 32KB. Removed specific crash. Not sure about the previous comment ("do not modify"), especially about the date it was written (maybe when the limit was 8KB not 16KB). Tested on differents sites and got no crash. Direct impact: may slow down Scol when logs are activated. v5.21 Note: I misinterpreted the role of the variable. It has something to do with the Scol compiler, not the log. However, as this removed a bug, I let the new value. src/win/terminal.c & terminal.h ******************************* v4.6a6 061220: Added a stored DC in Terminal structure in .h Modified most functions in .c so that we now refer to this stored DC instead of getting a new one at each call. This was corrupting GDI resources use, increasing the number of used objects until we get a crash or some mysterious console appearance that corrupted the computer display. This may prove to have significantly reduced the memory regular increases that were seen too. v5.2.06 080514: Modified Console display to remove artifacts that appeared on Paint messages. src/win/net/socket.c ******************** v4.6a6 061128: Investigating "Tcp port %d busy" error msg. v5.11 080204: SCKstartserver(), SCKconnect(), SCKstartudpserver(), SCKsendudp() Increased socket size from default (8KB) to 64KB. v5.3.01 080703: SCKinit() Upgraded Windows socket model from v1.1 to v2.2 15% performance gain. src/win/quota.c *************** v4.6a6 070329: Modified Cache management debug. Debug output file redirected to c:/_stdout.txt src/kernel/net/upnp.cpp *********************** v5.01 070912: New files - +upnp.h, upnp_consts.h & upnp_types.h Implementation of UPnP API, purpose being to be able to auto configure ports on routeurs or boxes that are UPnP compliants. Using the API requires: - WindowsXP or above. - UPnP compliant Internet Gateway Device. - TCP port 2869 or UDP port 1900 being opened on Firewall if any. All functions are synchronous and require response from hardware device, which might take some time. _UPNP_Connect is the worst freezing function (3-5 seconds), the others work much faster if the device responds immediately (which is not always the case). New functions: - _UPNP_Connect fun [Chn] I Tries to find a UPnP compliant device on network (precisely an Internet Gateway Device) and connects to it. This function should be called once before using any other one. It will freeze the application during a few seconds (3-5). Params: Chn Channel, usually _channel. Returns: 1 or nil if it fails. - _UPNP_Disconnect fun [] I Closes the link with the Internet Gateway Device. Params: - Returns: 1 - _UPNP_OpenPort fun [S S I I I] I Opens a port on the Internet Gateway Device. Params: S Name, like Application Name. S IP address of the PC to which messages should be routed. Ex: _hostIP() I Port number (0-65535: 0-1023:WellKnown, 1024-49151:Registered, 49152-65535:Dynamic&Private) I Protocol, should be either UPNP_TCP or UPNP_UDP I Mode, should be either UPNP_SAFE or UPNP_FORCE. The second one will overwrite any existing similar port mapping (Port+Protocol) Returns: Port number if successful, nil if it fails - _UPNP_ClosePort fun [I I] I Removes a port on the Internet Gateway Device. Params: I Port number I Protocol Returns: Port number if successful, nil if it fails - _UPNP_IsPortUsed fun [I I] I Checks if a port is already used on the Internet Gateway Device. Params: I Port number I Protocol Returns: 1 if port is already defined, 0 if it's free to use. - _UPNP_GetExternalIP fun [] S Returns the external IP address of the Internet Gateway Device. Params: - Returns: S External IP address. src/kernel/mmemory.c ******************** v5.11 080204: Removed various comparisons between maxsock & MAXSOCKS maxsock is initialized as MAXSOCKS and never modified (cf testLicence in scolsys.cpp) except in case of ReduceCapacity. src/kernel/blg_memory.h *********************** v5.11 080204: New file BLG_memcpy8(): Optimized memcpy() function. src/kernel/scolsign.cpp *********************** v5.11 080204: Work in progress (Modifications currently not activated) Data signature optimization. This should affect the _fileSign() and _getlongname() functions. They are defined in scol.c and coded in scolpack.c Signing functions are in this file: SCsign() and SCsignInc(). Optimization is coded in blg_sign.h However, it isn't functional right now as I encountered some parameter corruption between C & ASM. A parameter (d) set to zero on C side sometimes comes with a nonzero value (88) on ASM side ... src/kernel/net/inet.c ********************* v5.11 080204: DINETGetURLengine() Increased socket size from default (8KB) to 64KB. src/kernel/net/httpserver.c *************************** v5.11 080204: Increased _SOCK_BACKLOG from 5 to 10. Maximum number of pending connections in queue for listen() set to default WinXP value. 080204: MstartHTTPserver() Increased socket size from default (8KB) to 64KB. 080204: _onWrite() Increased file buffer from 2KB to 64KB. 080204: _onRead() Increased file buffer from 16KB to 64KB. src/win/myloop.cpp ****************** v5.21 080303: MMechostr() - Increased internal logging messages' size from 16KB to 64KB. v5.2.06 080429: LoadUsmIni() - Fixed log/ directory presence. 080604: LoadUsmUserIni() - Fixed log/ directory creation on first run. Other modified files: - src/kernel/scolsys.h src/kernel/fifo.c ***************** v5.22 080310: SCreadchar() - Added MERRCHNLDWN return code. Other modified/updated files: - kernel/vm/mbytec.cpp - src/kernel/mmemory.h Modified too for: Kernel40, xTension - src/kernel/scolplugin.h Modified too for: 2D, 2DOS, blg_frmdbg, Kernel 40, MMedia, SerialIO, xTension - src/kernel/include/kernel.h Modified too for: Kernel40 - (SQL) kernel/x/winuser.h Modified too for: xTension, wii, ZooGL