Oberon/A2
Links
editInstalling and Running A2
editA2 can be installed and used on a bare PC. That includes desktop and laptop machines obsolete for commercial operating systems. A2 can also be a subsystem in an ARM, MS Windows or Unix-like system.
Tested Instances | ||
---|---|---|
Host System | Subsystem | Notes |
Debian 11 | UnixAOS rev.9779 | |
Debian 12 | LinuxA2 Generic, 64-bit, Apr 19 2023 |
Keyboard input bug, Issue 141. Retrieve and compile MyUnix.KbdMouse.Mod. <F12> disables HotKeys to allow Oberon keyboard functionality. If <Backspace> key doesn't work, try <Delete>. |
OLPC 13.2.11 | LinuxAos rev.7355 |
Installing and Running UnixAOS
editThe original instructions[1] for installing UnixAOS are in http://user.informatik.uni-bremen.de/fld/UnixAos/Readme.txt. Installation files are available from http://user.informatik.uni-bremen.de/fld/UnixAos/.
The shell script installer assumes existence of a sys group in the host. For systems lacking this group, the script is easily adapted. For example, the line,
chgrp -R sys ${aosdir}
can be changed to this.
chgrp -R bin ${aosdir}
The UnixAOS working directory can have an ext2 or FAT filesystem on a removable flash store.
Releases Prior to 10272
editThe default directory for the system is /usr/aos. By default, install.UnixAos installs start script /usr/bin/aos. The aos script adjusts the operating system environment before starting aos.{solaris,linux,darwin}. As noted in Readme.txt, UnixAos can be started with these two commands.[2]
cd <myWorkingDirectory> aos
<myWorkingDirectory> must be replaced with a specific directory name.
Release 10272
editThe default directory for the system is /usr/local/A2 and the default start script is /usr/local/bin/a2. A2 can be started with these commands.
cd <myWorkingDirectory> a2
As for earlier releases, <myWorkingDirectory> represents a specific directory name.
User and Machine Specific Configuration of UnixAOS
editUnixAos is configured by Configuration.XML. The Oberon subsystem is configured by Oberon.Text; refer to the ETH Oberon page and the original betadocu page.
If the working directory is on a removable store, the myaos script allows the storage device to be used in multiple machines with differing configurations. When the store is not already mounted, e2fsck is applied as a precaution.[3] In case the filesystem has been corrupted, e2fsck will usually complete repairs. A reasonable location for the myaos script is the home directory of the user. For each host, create in the working directory, files Configuration.<host>.XML. To use the Oberon subsystem, create Oberon.<host>.Text. This can be done by copying the installed files and editing the copies. For example, a host named blunder requires Configuration.blunder.XML for A2 and Oberon.blunder.Text for the Oberon subsystem. The XML file contains ASCII text and can be edited with Geany, gedit or mousepad in Linux or with Edit > Text in A2. The installed Oberon.Text contains some binary information.[4] In ETH Oberon it would usually be edited with Edit or ET. Nevertheless plain text will also work. After storing Oberon.Text with ET.StoreChar, it can be edited with Mousepad or Gedit in Linux, with Notepad in MS Windows and with Atom in MacOS. This can resolve the difficulty of a file name, Oberon.<Host>.Text, exceeding the 32 character limit of the Oberon system. myaos copies Configuration.blunder.XML to Configuration.XML and Oberon.blunder.Text to Oberon.Text before starting UnixAos.
The A2 Repositories
editThe original repository for sources and executables for several platforms was Apache Subversion (SVN) based. The contemporary Git based repository began with files from SVN revision 10270. While the Git archive is current, the notes for SVN remain available.
The repository provides the latest version and allows ongoing updates. From the viewpoint of a user, the method is based upon a local copy of the repository. The local copy is created by cloning from ETHZ. WIthin the local copy, an A2 executable can be built for a targeted platform including a bare PC. Executables in subdirectories for Windows, Linux (Intel 32 and 64 bit) and ARM are available. The repository will occupy 0.5+ GB depending upon inclusion of executables.
A user not affiliated with ETHZ can obtain a Github account. Github login will allow access to facilities including Issues.
Git in a Unix-like System
editThe Wikipedia article provides a useful overview. Official documentation is available as a Reference Manual, comprising manual pages, and the Pro Git book. git-lfs is documented separately.
Each Linux has an installation procedure for Git with the various procedures summarized in the Git Web site. Release specific information is also available. For Debian Linux, refer to the UsingGit wiki page. If apt is available these commands suffice.
# apt install git # apt install git-lfs
The name of the repository directory is arbitrary. "A2" serves for this example. The ls command allows avoidance of name conflict.
# ls -ld A2 drwxr-xr-x 12 me mygroup 4096 Dec 5 09:22 A2
Create the local repository.
# git clone https://gitlab.inf.ethz.ch/felixf/oberon.git A2
Update the local repository from the origin, main branch.
# git pull origin main
In MS Windows check what you have.
dir /ad *
In Linux check what you have.
ls -d *
Output should be similar to this.
AosVM LanguageReport Linux32 source UnixAos Win64 ARM license.txt Linux64 tools Win32 WinAos
Use git-lfs to track some zip archives.
# cd A2 # git lfs track "Linux*.zip" # git add .gitattributes
Check which large files are tracked.
# git lfs track Listing tracked patterns ARM/ARM.A2/*.bin (ARM/ARM.A2/.gitattributes) Linux32.zip (.gitattributes) Linux64.zip (.gitattributes) LinuxARM.zip (.gitattributes) Win32.zip (.gitattributes) Win64.zip (.gitattributes) *.bin (.gitattributes) Linux*.zip (.gitattributes) Listing excluded patterns
Retrieve a specific archive file.
# git lfs fetch Linux64.zip fetch: Fetching reference refs/heads/main
Verify existence of the zip archive.
# ls -ld Linux64* -rw-r--r-- 1 root root 23712521 Dec 5 09:19 Linux64.zip
Unzip.
# unzip Linux64 Archive: Linux64.zip creating: Linux64/ creating: Linux64/work/ inflating: Linux64/oberon.ini creating: Linux64/bin/ inflating: Linux64/Kernel.GofU inflating: Linux64/OpenTypeScan.SymU inflating: ...
Execute the start script.
# Linux64/a2.sh
or
# cd Linux64 ; ./a2.sh
The content of a2.sh can be displayed by "cat a2.sh" or with an editor. The script performs two actions. "cd `dirname $0`" changes to the directory where a2.sh resides; ~/A2/Linux64 for example. Then "./oberon run a2.txt" executes Linux command "oberon" with arguments "run" and "a2.txt". a2.txt contains A2 commands and can be displayed by cat and by an editor. The first command executes commands in oberon.ini including two referring to the working directory.
Git in MS Windows
editGit is available directly from the official Web site.
Working Directory
editoberon.ini has two A2 commands referring to the working directory.
Files.AddSearchPath work~ ... Files.SetWorkPath work~
For a different working directory edit oberon.ini.
Files.AddSearchPath /home/me/myWorkingDirectory~ ... Files.SetWorkPath /home/me/myWorkingDirectory~
Alternatively, oberon.ini can be unchanged and work can be replaced with a soft link. In the freshly installed system, work is empty. In case content has been added, move for preservation.
cd <A2repository>/<hardware> ls -ld work
Then, for example, either
mv work /home/me/savedWork
or
rmdir work
Then create the link.
ln -s /home/me/myPreferredWorkingDirectory work
Module Naming
editContext and Aliasing
editIn a source in A2, the distinction between the system and the Oberon subsystem is referred to as context. In Text of a source module, context is identified according to Oberon (2019) Language Report, section "5 Modules".
Module := 'MODULE' [TemplateParameters] Identifier 'IN' Identifier ';' ...
Within the scope of a module, the name of an imported module can be aliased with this syntax also in the section referred to above.
Import = Identifier [':=' Identifier] ...
Unix.Oberon.NetSystem.Mod illustrates context and aliasing.
MODULE NetSystem IN Oberon; IMPORT S := SYSTEM, IP IN A2, DNS := DNS IN A2, TCP := TCP IN A2, UDP := UDP IN A2, Texts, Oberon, Input, Fonts, Strings, Out;
Target Systems and File Name Extensions
editCompilation, loading, linking and associated terminology is discussed in https://people.inf.ethz.ch/felixf/pdfs/2011_UnifiedStaticDynamicLoading.pdf. As in all Oberon systems, the name of a file specifying a module can differ from the name of the module. These file name extensions are conventional in A2.
Target System | Generic[5] Object File Name Extension | Symbol File Name Extension |
---|---|---|
Unix, x86, 32 bit | .GofU | .SymU |
Unix, AMD64, 64 bit | .GofUu | .SymUu |
Windows, x86, 32 bit | .GofW | .SymW |
Windows, AMD64, 64 bit | .GofWw | .SymWw |
ARM, 32 bit[6] | .GofA | .SymA |
ARM, 64 bit | .GofAa | .SymAa |
Object and Symbol File Names
editObject and symbol file names contain the context separated from the module name by a Minus-Sign. The Minus-Sign prevents use as a proper name in Oberon. Hence the object and symbol files for the Oberon System module are named Oberon-System.GofU and Oberon-System.SymU.
Startup from the Repository
editWith the A2 repository in place according to the instructions above, A2 can run.
Identify supported architectures.
cd <somewhere>/A2/
In MS Windows.
dir /ad *
In Linux.
ls -d *
The output should be similar to this.
AosVM LanguageReport Linux32 source UnixAos Win64 ARM license.txt Linux64 tools Win32 WinAos
Review the startup process. In MS Windows.
dir /ad Win32/*
In Linux 64.
ls -ld Linux64/*
The file oberon must be executable. Execute start script. This for a 32 bit machine running MS Windows.
./Win32/a2.bat
For a 64 bit machine running Linux.
./Linux64/a2.sh
or
cd Linux64 ; ./a2.sh
A window as at the right should appear.
User Level Applications
editVarious documents and applications are available via the menu at the lower left of the A2 display. Note Demos and Docu > Program Demos.
Secure Shell Console
editIn the target system, localhost or an external system, install a SSH server. This is one possibility.
sudo apt install openssh-server
In the A2 menu invoke Tools > Secure Shell. For Host specify "localhost" or "127.0.0.1" (without the quote marks) or the name or address of the external machine. Specify your user id. Click on Connect. Provide your password when prompted.
A mail client using IMAP is at Apps > MailClient. The Oberon subsystem has Mail.Panel supporting POP, POP3 and SMTP with description and instructions for ETH Oberon being applicable.
Oberon Subsystem
editAt the lower left of the A2 screen, menu Tools > Oberon and Develop > Oberon FullScreen allow interactive startup of an Oberon subsystem.
The subsystem can also be opened with a command or commands in the Autostart section of Configuration.XML. In UnixAos, revision 4929, these lines in Configuration.XML.
<Section name="Autostart"> ... <Setting name="OberonDisplay" value="OberonDisplay.Install Oberon 1100x704 0 74 ~"/> <Setting name="OberonStart" value="Oberon.Call System.Init Oberon"/>
This in more recent revisions[7].
<Section name="Autostart"> ... <Setting name="Start an Oberon" value="Oberon.Start Oberon 1100x704 0 74 ~"/>
The dimensions, 1100x704, can be adjusted for satisfactory proportioning of text in a viewer. If the Oberon window is stretched, by grabbing the lower right corner with the mouse, the proportionality of text to viewer is preserved.
Mouse usage is unusual but efficient. Definitely worth the small effort to learn. A mouse with three buttons or two buttons and a wheel is almost essential. The <Esc> key is used to interrupt a task. For example it can interrupt a long running FTP.GetFiles. <F1> sets the * marker. <F2> clears all marks. If a mouse button is pressed unintentionally, all mouse buttons pressed together before releasing any will have no effect. Comprehensive details of mouse and keyboard input and usage are in Mouse support, Mouse tutorial and Keyboard support pages.
Telnet Console in Oberon
editTelnet is an insecure protocol but provides a host console within the Oberon sub-system. The instructions for ETH Oberon are applicable in the Oberon subsystem.
News Reader in Oberon
editAs with mail servers, news servers now require authentication. Therefore revisions of the NetSystem and News modules are required to support authentication. Compile the revised modules.
Text
editTextDesc is an extension of Objects.ObjDesc. The fields added to make TextDesc are distinguished from the fields inherited from ObjDesc by differing background colors.
Type | Fields of TextDesc |
Types of Fields | Notes |
---|---|---|---|
Texts.Text, a pointer to a Texts.TextDesc | stamp | LONGINT | Integer |
dlink | Objects.Object | Pointer | |
slink | Objects.Object | Pointer | |
lib | Objects.Library | Pointer | |
ref | INTEGER | ||
handle | Objects.Handler | Pointer | |
len | LONGINT | Length of text. | |
obs | Objects.Library | Pointer | |
trailer | Texts.Piece | Pointer to Sentinel node in list of pieces. | |
org | LONGINT | Offset in [0,len) of first character in last found piece. | |
pce | Texts.Piece | Last found piece. |
Type | Fields of LibDesc | Types of Fields | Notes |
---|---|---|---|
Objects.Library, a pointer to a LibDesc | next | Objects.Library | Pointer |
ind | Objects.Index | Pointer | |
f | Files.File | Pointer | |
R | Files.Rider | Pointer | |
name | Objects.Name | ||
dict | Objects.Dictionary | Pointer | |
maxref | INTEGER | ||
GName | POINTER |
Type | Fields of PieceDesc | Types of Fields | Notes |
---|---|---|---|
Texts.Piece, a pointer to a Texts.PieceDesc | f | Files.File | Pointer |
off | LONGINT | Integer | |
len | LONGINT | ||
obj | Objects.Object | Pointer | |
lib | Objects.Library | Pointer | |
ref | INTEGER | ||
col | SHORTINT | ||
voff | SHORTINT | ||
prev | Piece | Pointer | |
next | Piece | Pointer |
Module Sources, Tools and Configuration Texts
editA tiny sample of the approximately 2000 sources in A2.
A contemporary Firefox browser attempts to infer "Content type" from the name extension. By default Firefox infers wrongly that source file *.Mod contains "Amiga SoundTracker audio" and fails to open it. This difficulty is resolved by adjusting the "Action" Firefox associates with "Content Type". Open hamburger menu > Settings > General > Applications. For "Amiga SoundTracker audio" choose an editor such as /usr/bin/mousepad or /usr/bin/gedit. Most sources in A2 have been converted to plain ASCII text; some remain as Oberon Text. Gedit will open all of these. Mousepad and several other editors will not open Oberon Text. Content type "plain text document" should also be set to the chosen editor. With these adjustments Firefox should open most of the files in the repository.
In some contexts the user may fail to find a configuration of a browser to open files in the repository. In any case a browser should open the Wikibook copy.
ETHZ Repository | Wikibook[8] | Notes |
---|---|---|
BIOS.V24.Mod | BIOS.V24.Mod | |
BootManager.Asm | BootManager.Asm | BootManager source written in Network Assembler by André Fischer. |
BootManager.Mod | BootManager.Mod | Module containing one command Split.[9] |
BootManager.Text | BootManager | Instructional document written by André Fischer. In the repository and in MediaWiki representation. |
BootManager.Tool | BootManager.Tool | Tool file summarizing the instructional document. |
Oberon.Configuration.Mod | ||
Configuration.XML | ||
Oberon.Desktops.Mod | ||
Oberon.Documents.Mod | Oberon.Documents.Mod | |
Oberon.ET.Mod | ||
Oberon.Files.Mod | ||
Oberon.Gadgets.Mod | Oberon.Gadgets.Mod | |
Oberon.HTML.Mod | Oberon.HTML.Mod | Revisions for conformance to HTML5. |
HTML.Tool | No "preview" in the ETH Repository. | |
Oberon.HTMLDocs.Mod | Oberon.HTMLDocs.Mod | InitEntities() expanded to support more characters. |
Oberon.ISO9660Files.Mod | ||
Oberon.ISO9660Volumes.Mod | ||
Oberon.MIME.Mod | Oberon.MIME.Mod | |
Oberon.Mail.Mod | Oberon.Mail.Mod | Deviation from SMTP corrected. Wrap() added. Names of types revised. Show() revised. Calculation of cont.len corrected. |
Oberon.MultiMail.Mod | Oberon.MultiMail.Mod | |
Oberon.News.Mod | Oberon.News.Mod | Authentication added to allow access to contemporary servers. |
Oberon.MediaWiki.Mod | Not in A2 repository. | |
Oberon.Objects.Mod | ||
Oberon.Out.Mod | Oberon.Out.Mod | Allow delay of execution of Append, using a flag variable. |
Oberon.Out1.Mod | Allow delay of execution of Append, using a procedure variable. | |
Oberon.OutStub.Mod | Oberon.OutStub.Mod | |
Oberon.QuotedPrintable.Mod | Oberon.QuotedPrintable.Mod | Variant from LinuxA2 Gen. 32-bit, rev.9527. |
Oberon.RFC3986.Mod | Percent encoding and decoding of URL. Not in A2 repository. | |
Oberon.Sort.Mod | Oberon.Sort.Mod | Better presentation of output. Revisions incomplete. |
Oberon.Streams.Mod | ||
Oberon.Strings.Mod | ||
Oberon.TFTPTool.Mod | Oberon.TFTPTool.Mod | |
Oberon.TextDocs.Mod | ||
Oberon.TextFrames.Mod | Oberon.TextFrames.Mod | LOOPs removed. |
Oberon.Texts.Mod | ||
Oberon.V24.Mod | Oberon.V24.Mod | |
Release.Oberon.Text | Oberon.Text | Usually Oberon.Text is customized to a user. |
TFTP.Mod | TFTP.Mod | |
Unix.Machine.Mod | ||
Unix.Oberon.NetSystem.Mod | Unix.Oberon.NetSystem.Mod | Terminology improved. Local procedures moved out of SetUser. RETURN usage updated. Flag "ok" eliminated. Flag "verbose" added to simplify password debugging. Numerous comments clarified. |
myaos | Start script allowing use of a removable working store on multiple machines. Adaptable to requirements of user. Not in A2 repository. |
Potential Developments
edit- A TUI similar to ETH Oberon.
- Improved HTML support. Support for styling and tables, for example.
- Touchscreen support.
Footnotes
edit- ↑ The Git repository, described subsequently, is a more recent method of installation and release tracking.
- ↑ The command line prefix in a Unix-like system is user configurable and can be configured to the empty string. For simplicity, the prefix is omitted in most of the commands shown here.
- ↑ A filesystem can become corrupted if not unmounted before the system is shut down. The directory can also be damaged by natural degradation of the storage media. If the filesystem is intact, the execution time for e2fsck is negligible.
- ↑ See Oberon/Text.
- ↑ "Generic" refers to applicability of the loader and linker to all target systems, independent of change in language and runtime system.
- ↑ Allowing A2 on the Raspberry Pi.
- ↑ The Oberon subsystem is invoked with MenuPage30.XML. The change from two commands to one is reported by
svn diff -r 5253:5254 .../MenuPage30.XML
- ↑ In some cases the Wikibook copy differs from the latest file in the ETHZ repository. For an exact comparison, use a file comparator; Diff.Do in Oberon, comm in Linux. Some sources have a discussion page. Oberon.Mail.Mod discussion for example.
- ↑
BootManager.Split BootManager.Bin
is executed to divide BootManager.Bin into BootManagerMBR.Bin and BootManagerTail.Bin. For additional details, refer to the instructional document of André Fischer.