ZMLEB@SCFVM.BITNET (Lee Brotzman) (07/22/88)
In reponse to a number of requests for more information about ComForth, the Forth system developed by the South Belgium Forth Chapter, I have been given this synopsis of ComForth by Andre Pirard, the author of the original article entitled "Forth in an operating system". Enjoy, but be forwarned that this is a lengthy article (more than 400 lines). -- Lee Brotzman -- Moderator of the Forth Interest Group International List -- (FIGI-L@SCFVM.BITNET) ------------------------------------------------------------------------ Following my article about "Forth in an operation system", I have received questions asking what is ComForth and is it available. Despite its professional look, Comforth is not a commercial product. It is the work of the Southern Belgium Fig Chapter to whom I belong and whose every member has contributed to Comforth at least by being a criticizing user. Being the only member with access to this list, I redistibute FIGI-L to my Chapter's members. They suggested I'd spend some time writing an article explaining how we feel Forth. But we don't give it away either. It helps us covering the hardware expenses (and also much time) we put into our dreams. So, to answer the general interest, we put the specs sheet to the list. I hope you will excuse inevitable redundancy with my previous article. Please, don't send Lee questions any more. Write directly to me. I'll make the best of my available time to answer them or relay them to the right person. But please allow for some time for answers, I have to do all that from home. Andre'. ComForth specifications Interpreters make testing a program a delight, but are slow when executing. Compilers produce fast code but compilation turnaround time and reduced interactive test facilities are a nightmare for the programmer. Forth is a programming system that offers the advantages of both interpreters and compilers. Its interactivity makes it tremendous to experiment problems solutions and write many applications quickly. Its compiled code gives very fast execution. It combines the ease of programming in an expandable high-level strongly structured language with direct access to machine code for versatility with equal interactivity. However, the Forth standards make Forth its own operating system and only define a minimal ground onto which specialized systems can be grown. Many Forth implementations do not implement access to the host system files. They are limited to storing 1024 bytes blocks of data on either an unstructured disk or its simulation on a single direct access file. This provides high program portability but only to those applications restricting to the minimal definition. This is why Forth usually excels in specialized fields. To be standard, applications designed to interface with a particular operating system are bound to include the operating system interface, which everyone writes his own way and has to be rewritten for each system. The lack of a host system interface also explains their inability to generate small executable modules, use chaining, load overlays etc... This is a pity, because operating systems are bridges that allow applications to share data and manage them efficiently. Furthermore, several features commonly found in other programming languages are missing, principally strings, local data storage management, error recovery, screen management etc... ComForth is a professionally designed Forth development system designed and used at the "Southern Belgium FIG chapter". It is written to combine the powerful interactive debugging facilities of Forth and the usefulness of traditional languages and operating systems. It uses a very simple operating system files handling interface which is identical between a variety of common operating systems on a wide range of machines. It makes possible the easy generation of very small true modules directly executable from the host system command level. It integrates several essential language extensions and particularly enhances user friendliness and the ease of development by providing many debugging tools. ComForth has been loved by many other people and used in several economical, scientific and industrial applications such as accounting, IBM 3270 terminal emulation and reliable data transfer protocol, botanical data acquisition and analysis system, geological data acquisition and analysis (ComForth found gold!), Eprom programmer control, thermodynamics data acquisition and control, cable layout computation, pasture fattening mixture computation on handheld computer etc... In summary, the ComForth implementation objective is to eliminate many inconveniences of traditional Forth systems and provide a (let us say it) comfortable programming environment similar to say Turbo-Pascal(TM) but with all the added advantages of Forth interactivity. Notes to the Forth novice: the following text often refers to the expression "word". A Forth word is what would be called function or routine in other languages. Words make a sentence that is either executed or used to define another new word. They are organized in vocabularies. Don't be discouraged by some very technical remarks in the discussion below. They are meant for the Forth specialist to get a full insight of Comforth. Understanding them is not necessary for everyday use of the system. Features - ComForth versions support and allow source portability between: - MSDOS (any, version 2.0 or higher, including PCDOS and clones) - CP/M 80 (version 2.0 or higher) - CP/M 86 - Commodore 64 - Commodore 128 (either mode 64, mode 128 or CP/M) - Commodore AMIGA - Atari ST - Sinclair/Timex QL - Apple-Dos on Apple II or IIe, 80 column support implemented. - Forth-83 standard with didactic Forth-79 and Fig-Forth compatibility supersets. Of course, assemblers and double words set. Many many extensions such as CASE ?LEAVE ?DO RECURSE, ? .S DUMP BASE? ORDER, ASCII HEXA BIN OCT, B! B@, STRING S! SCAN SKIP MATCH, WITHIN UWITHIN ROTATE SHIFT ASHIFT 2* 2/ DU2/, PERFORM EVALUATE NEWSTREAM SUSPEND RESUME, ALIGN, REPLY and the like... - Drastically easy to use system independent interface words to access host system files in sequential or direct access mode (FILE OPEN CLOSE GET PUT READ WRITE GETLINE POINT NOTE INFILE INDATA PUTEOR PUTEOF MUTEIOER IOER DELETE RENAME...). MSDOS Path support. - Source code can be maintained in and loaded from free format, variable length records, operating system ASCII files. No storage waste, no update nor cataloging nor documentation problems. Files are generally 1/3 the size of screens files. This frees from the necessity to cram the most on a single line and really yields a new much clearer coding layout style with only related words on the same line and comments interspersed where they belong. - Very convenient and complete fullscreen EDITOR to update these system source files from within Forth. It uses general screen management functions that easily customize to any system (GOTOXY, CURSOR, CLS, RUBLINE, HILIGHT, LOLIGHT). Special keyboard keys are user customizable for editing functions. Exiting the editor can request interpreting the edit buffer and, in case of error, re-editing with the cursor positioned at the point of error. - Immediate command words to manage system files from within Forth (DIR ERA DEL REN FTYPE FPRINT FCOPY DOS etc...). - Blocks support is optional and uses true LRU buffers management. I/O is made on direct access host files using the system independent file access interface. Line editor. - FORTHGEN: rewrites the current augmented system as a new executable file. Useful for customization or for immediate access to the pre-compiled stable part of a development in progress. Can also define an autostart word. - COMGEN: Easy host system application compact modules generator. One just types: COMGEN source-file main-word module-file map-file It automatically compiles the application, selects the sole required words tree and relocates them to a minimally sized headerless execution file. Even defining words definition parts are excluded. However, a user created dictionary can be isolated and searched with FIND in an application module to provide keywords interpretation or scan. COMGEN will handle any dictionary contents not containing uninitialized data area nor relative references (offsets) from one word to another. COMGEN diagnoses uninitialized data and the ComForth assemblers issue error messages when they are instructed to generate such offsets. But any compiling method adhering to these restrictions can be used. In particular, ComForth assemblers can be replaced with any user's choice and any machine code compiled with very minimal changes. - A smart DECOMPILER can be used to examine the components of the whole system nucleus to the deepest level, by name or address. This is the key to fully understand any detail of the system and allow any modifications for specific needs. The best of balance between source-like and compiled-like display has been chosen to both serve readability and accuracy. Each line is prefixed with its offset in the parameter field, branching words arguments are converted to offsets and every target of a branch is on a new line. Consequently, control structures are easily recognized, but what they compile is also faithfully shown. - Thus, the development system is very easily examined, patched, augmented and saved as a new executable module. Bootup literals are referenced using the names of the user variables with which they are paired. Before saving a new system with FORTHGEN or at the end of a COMGEN compilation, they can be modified by "value user-variable PRESET" for new initial values of the user variables (storage allocation, type of vocabulary structure, input/output or other execution vectors redefinition, numerical conversion radix etc...). This process does not affect the normal operation of the current system. The user variables are refreshed from the bootup literals by COLD, WARM or QUIT. They are ordered in three groups so that this refresh is a simple matter of a storage move. 8 spare positions in each group are free for the user (filling from top) or specific system (filling from bottom) to participate to the same refresh method. Other user variables are not initialized by the system. The total number is controlled by one of the storage allocation values which are user variables themselves. - BREAKPOINT facility used in conjunction with the decompiler. Any word reference in a high-level word can be patched to execute a user-defined word (action word) before executing that reference. Patches can even be installed in action words. By defaults, the action is a special interpreter allowing execution to stop, and interactive commands to be issued to examine and modify data. This interpreter uses ONERROR to prevent terminating the execution of the tested program by errors caused by command lines interpretation. A single return keystroke single-steps through the tested word while displaying its name, the offset and name of the reference and the parameter stack. - Relocatable OVERLAYS creation and loading. Speeds up the loading of utilities anywhere in a development system. The editor, assemblers, decompiler, breakpoint and module generator are in overlays. The user can easily create his own overlays. - FLOATING POINT model (slow) in high level source code. Includes trigonometric and hyperbolic functions. Designed to be data representation independent and easily converted to interface any math coprocessor or ROM floating point routines. - 8087 math coprocessor (fast!) assembler and floating point for MSDOS and CP/M 86. Floating point system library interface for Amiga and ROM interface for CBM64/128. - System library interface on Amiga. - CHAINING from one application module to the other. - Input command line editing and previous lines retrieval (EDEXPECT). Uses the same keyboard customization as the source files editor. - Friendly user interfaces. e. g. long lists can be frozen on the screen by the simple use of the return key and canceled with the C key. - ONERROR protects a program section from ABORT by defining an "ONERROR recovery DURING protected NOERROR" structure similar to IF THEN ELSE. If ABORT occurs during "protected", the stacks are returned to their initial depths and "recovery" is executed. It is used, for example, by the breakpoint facility to protect the tested program against ABORTs produced by interactive debug mode commands and the compile exit of the editor to catch compilation errors. A delight to use to return error conditions and a must for strong applications. - TEMPORARY and HEADERLESS conserve dictionary space (for example: assemble then remove the assembler or remove the no longer necessary names of words). The first use starts an alternate dictionary space distant from HERE by the value contained in LAG (the modifiable maximum size that can be compiled before DISPOSE). In TEMPORARY state, everything is compiled there. In HEADERLESS state, only the name and link fields. DISPOSE removes the alternate dictionary. Example to load the assembler: "TEMPORARY CODE DUMMY END-CODE ... DISPOSE". - Assembler LABELs can be coded anywhere within machine code because they generate TEMPORARY constants. ENTRY: can be used to redefine the entry point anywhere in the body rather than at its beginning. Both features come handy to relax Forth assemblers strict structuring constraints, for example a common exit sequence coded ahead of the body and referenced from several points in it. - ONLY ALSO PREVIOUS vocabulary stack used for search order. SEALED or LINKED vocabularies (global option and override), optional search of CURRENT. These allow a wide variety of vocabulary structures, including Fig-Forth like. - Facility to implement two user defined words to be executed at startup and close down of the application module and/or development system. Useful for setting up and removing things like a restart interrupt trap, screen options, printer initialization etc... - Restart is such that an interrupt (for example caused by a special key stroke) interrupt a looping program and do a warmstart. ComForth has a single entry point. The first entry causes a coldstart. Subsequent ones cause warmstarts. Restart is provided on all systems except generic CP/M. - An aggregate STACK is integrated to easily store LIFO data structures. This conserves memory space and is the base to implement local variables. - Character STRINGs words making use of the aggregate stack. - Input/Output redirection to any device and customizable printer support. Many other key words are vectored. - Several general and system specific examples and utilities. The number of these is ever growing. (Assembler examples, Menus driver, Sort, Random numbers, Conditional compilation, Structures, Graphics, Sound etc...) - Selectable automatic or fixed adjustment of the size of memory allocated to Forth. Non self-modifying code, word alignment for faster 6502, 8086 and 68000 operation. Very fast 8088 operation. Documentation: 70 pages tutorial explaining the ComForth special features + 65 pages of functionally organized full glossary + 12 pages alphabetical index. Beginners will need an additional tutorial to Forth-83. Unlike most glossaries, Comforth's is organized by subjects, so that every definition is learned in context. The index serves the alphabetical purpose. Disk formats: usually distributed as single sided diskettes on the two sides of one diskette. Specify your machine, system, disk format and if you were unable to read single sided. MSDOS: IBM PC 5"1/4 or 3"1/2 format. Atari ST: own 3"1/2 MSDOS-like. Apple Dos: own format. Commodore 64: own format. Commodore 128: own format. Commodore AMIGA: own format. Sinclair/Timex QL: own format (tape). CP/M 80 or 86: 8" single density IBM 3740 format or one of the following 5"1/4 double density: IBM PC (CP/M 86) Zenith Z100 Kaypro II Epson QX-10 Osborne I Other formats on arrangement. Prepaid with Eurocheque or international postal money order (apparently unknown in the states). To other cheques not drawn on a Belgian bank, sorry add $10 for endorsement. You may send cash confidently, but we cannot take upon ourselves the risk of postal loss. $99 (3500 FB) for the base system. $30 (1000 FB) for the applications companion diskette. $3 for shipping to Europe. $8.5 to the rest of the world. Order and payment to: A. Pirard 5, Piretfontaine B-4052 Dolembreux (Belgium) 33-(0)41-688069 (19-21h GMT). ComForth is copyrighted. No part of the system can be transferred other parties, even just to allow the execution of applications. However, the licensee is entitled to sell royalty-free applications using any part of ComForth compiled with COMGEN, that is with words identifiers removed. A limited selected set of words can however be aliased in a sealed dictionary to allow their interpretation in a COMGENed application offering its users a set of specialized commands. Despite no official support service, the "Southern Belgium FIG chapter" are responsive to improve their product and will make the best of available time for documentation supplements and occasional bug fixes. They are collated and sent to purchasers whose remarks help us towards this improvement. Typical system sizes. Example is MSDOS. Other systems nucleus size vary slightly according to the complexity of the files system or other system requirements. Overlay sizes include a relocation table (11%). The other files contain common or system specific source code. F83NUC0 COM 13054 Minimal uncustomized system nucleus. F COM 17574 Typical customized development system. with utilities. OVLGEN OVL 885 Overlays generation ASM8086 OVL 7007 Assembler COMGEN OVL 999 Module generation, load phase COMGEN2 OVL 3870 Modules generation, generation phase SED OVL 4478 Fullscreen source editor (3964 bytes) SEDMAC OVL 6246 Same with macro feature. DECOMPLR OVL 1805 Decompiler. BRKPOINT OVL 1983 Breakpoint and trace. Files only on the companion diskette (*): QCKSORT F83 1628 Quicksort. SWORDS F83 1324 Example, sorted dictionary display. CONDINT F83 2658 Conditional interpretation. PRETTY F83 3730 Source code printer, ejects between words MESSAGES F83 5982 Loading application messages from a file MENUS F83 8540 Simple effective menus system MENUEX F83 4571 Example MENUEX FR 1072 Loaded messages, providing MENUEX US 842 language independence. STRUC F83 3242 Pascal like structures. STRUCEX F83 637 Examples. SYNMAC F83 1758 Defining synonyms and macros. BASIC F83 10212 BASIC interpreter IMATH F83 2894 Extended integer maths. GO F83 6860 Game of GO in Forth (*) Some are credited to the original author and only reworked for improvement or adaptation to Comforth.