ETH PC Native Oberon, Alpha Release 05.01.2003, Usage Notes

This page is a personal collection of notes. For authoritative documentation, refer to http://www.ethoberon.ethz.ch/ and to http://www.oberon.ethz.ch/. Project Oberon by Wirth and Gutnecht and the Ph.D. thesis of P. J. Muller are available via the bibliography page.

Installation and Configuration

Among the PC Native Oberon releases, my preference is the Alpha available at ftp://ftp.ethoberon.ethz.ch/ETHOberon/Native/Update/Alpha/ . Installation proceeds in two phases. First the base system, Oberon0, is installed. Then additional modules can be installed from nine archives, Apps1.zip ... Source3.zip. Refer to http://www.ocp.inf.ethz.ch/wiki/Documentation/Installation#toc23 .

Usage Tips, Mouse and Keyboard

Mouse usage in this system is unusual but efficient. Definitely worth the small effort to learn. A mouse with three buttons or two buttons and a wheel is essential. If a wrong mouse button is pressed, press all mouse keys before releasing any. All mouse keys together have no effect.

Inadvertent selection of a frame can be disconcerting. Press F2 on the keyboard to clear all selections.

Sample Files, Adjustments, Modifications and Repairs


Manifold.Vinci is an example of a simple engineering drawing written in Vinci.
HyperDocTools.Fetch
"http://easthope.ca/Manifold.Vinci" => Manifold.Vinci ~

A few of the source files for the Oberon System, PC Native 05.01.2003, with small adjustments, modifications and "repairs" follow. These files reside entirely under the copyright and license of the ETH Zurich.

ftp://ftp.ethoberon.ethz.ch/ETHOberon/license.txt

ETH Oberon Copyright (c) 1990-2003, Computer Systems Institute, ETH Zurich All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

o Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

o Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

o Neither the name of the ETH Zurich nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ETH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Before compiling any modified file, compare with the file in your SYS volume using Diff.Do. The modifications are described below. Use AT YOUR OWN RISK.

Assuming you are at an Oberon workstation with a network connection and want to retrieve the modified files, middle click here
vvvvvvvv.
HyperDocTools.Fetch
"http://easthope.ca/pe.ATADisks.Mod" => pe.ATADisks.Mod
"http://easthope.ca/pe.Dialer.Mod" => pe.Dialer.Mod
"http://easthope.ca/pe.FTP.Mod" => pe.FTP.Mod
"http://easthope.ca/pe.FTPDocs.Mod" => pe.FTPDocs.Mod
"http://easthope.ca/pe.HTML.Mod" => pe.HTML.Mod
"http://easthope.ca/pe.HTMLDocs.Mod" => pe.HTMLDocs.Mod
"http://easthope.ca/pe.Mail.Mod" => pe.Mail.Mod
"http://easthope.ca/pe.Native.Tool" => pe.Native.Tool
"http://easthope.ca/pe.NetSystem.Mod" => pe.NetSystem.Mod
"http://easthope.ca/pe.PSPrinter.Mod" => pe.PSPrinter.Mod
"http://easthope.ca/pe.PPPFSM.Mod" => pe.PPPFSM.Mod
"http://easthope.ca/pe.PPPHDLC.Mod" => pe.PPPHDLC.Mod
"http://easthope.ca/pe.PPPIPCP.Mod" => pe.PPPIPCP.Mod
"http://easthope.ca/pe.PPPLCP.Mod" => pe.PPPLCP.Mod
"http://easthope.ca/pe.PPPMain.Mod" => pe.PPPMain.Mod
"http://easthope.ca/pe.PPPTools.Mod" => pe.PPPTools.Mod
"http://easthope.ca/pe.URI.Mod" => pe.URI.Mod
"http://easthope.ca/pe.RingbackDialScript" => pe.RingbackDialScript
"http://easthope.ca/pe.SSHTransport.Mod" => pe.SSHTransport.Mod
~

In PC Native Oberon, the modifications can be displayed by clicking here
vvvvvvvv.
Diff.Do pe.ATADisks.Mod SYS:ATADisks.Mod
Diff.Do pe.Dialer.Mod SYS:Dialer.Mod
Diff.Do pe.FTP.Mod SYS:FTP.Mod
Diff.Do pe.FTPDocs.Mod SYS:FTPDocs.Mod
Diff.Do pe.HTML.Mod SYS:HTML.Mod
Diff.Do pe.HTMLDocs.Mod SYS:HTMLDocs.Mod
Diff.Do pe.Mail.Mod SYS:Mail.Mod
Diff.Do pe.NetSystem.Mod SYS:NetSystem.Mod
Diff.Do pe.PSPrinter.Mod SYS:PSPrinter.Mod
Diff.Do pe.PPPFSM.Mod SYS:PPPFSM.Mod
Diff.Do pe.PPPHDLC.Mod SYS:PPPHDLC.Mod
Diff.Do pe.PPPIPCP.Mod SYS:PPPIPCP.Mod
Diff.Do pe.PPPLCP.Mod SYS:PPPLCP.Mod
Diff.Do pe.PPPMain.Mod SYS:PPPMain.Mod
Diff.Do pe.PPPTools.Mod SYS:PPPTools.Mod
Diff.Do pe.SSHTransport.Mod SYS:SSHTransport.Mod

In PC Native Oberon, compile the modifications into the working volume by clicking here
vvvvvvvv.
Compiler.Compile
pe.ATADisks.Mod
pe.Dialer.Mod
pe.FTP.Mod
pe.FTPDocs.Mod
pe.HTML.Mod
pe.HTMLDocs.Mod
pe.PSPrinter.Mod
pe.PPPFSM.Mod
pe.PPPHDLC.Mod
pe.PPPIPCP.Mod
pe.PPPLCP.Mod
pe.PPPMain.Mod
pe.PPPTools.Mod
pe.URI.Mod
pe.SSHTransport.Mod ~
Also,
Compiler.Compile pe.URI.Mod ~
Compiler.Compile pe.NetSystem.Mod ~
Compiler.Compile pe.Mail.Mod ~

In the Oberon subsystem of UnixAos the Fox compiler is used. One way is Files > Files > Module Sources, click twice in the file name to open with PET and click on "Compile".

Compilation must respect import order; an imported module must be compiled before the module which imports it. For example, NetSystem imports URI and Mail imports NetSystem and the modules must be compiled in the order listed. If the \OSYS: parameter is added to the Compile command, the new object files will be written over files in SYS. Without the parameter the new files will be in the volume with first precedence; usually the working volume.

TextFrames.Mod, (mouse middle)+(mouse right interclick)

This invokes the command specified by MODULE TextFrames; ... OpenCmd = ... . After changing the constant, recompile and reload the module.
ET.Open TextFrames.Mod ~ Compiler.Compile * ~

ATADisks.Mod

Thanks to Josef Sedlacek, the changes in ATADisks allow use of a CF card. For this to work you need to recompile ATADisks as above. Then use BootLinker.Link to incorporate the new ATADisks.Obj into a new inner core.
BootLinker.Link my.bin \refs \integrate 1000H
Kernel Disks PCI ATADisks OFS Files Modules OFSDiskVolumes OFSCacheVolumes Unicode OFSFATVolumes OFSFATFiles OFSFileBasedDevices OFSAosFiles OFSBoot ~
Then install the new inner core so that the system will boot from it. Replace dev#part according to your context.
Partitions.UpdateBootFile dev#part my.bin ~
This example is for booting from the second part of a hard drive.
Partitions.UpdateBootFile IDE0#2 my.bin ~
An Oberon0 diskette can also be updated.
Partitions.UpdateBootFile Diskette0#0 my.bin ~
The updated diskette can be used to install a CF capable system.

A more comprehensive integration of CF support is to use Native.Tool from Build.zip to incorporate the revision into System.zip, Source1.zip and Oberon0. Then a revised installation diskette can be created. Additional information is in http://www.ethoberon.ethz.ch/native/WebBoot.html .

HTMLDocs.Mod, Character Reference

Strings.ISOToOberon is an array of 256 characters whereas HTML can refer to any of 65536 characters, � .. . HTMLDocs.WriteCharRef and HTMLDocs.CharRefStr were trapping on most characters above ÿ. A check of i was added before evaluation of ISOToOberon[i].

HTML.Mod, Character Encoding and Document Type Declaration

The constant CharEncoding was added to HTML.Mod so that the name of the encoding would not be hidden in the body of the module. The Alpha release contains "iso-8859-1" whereas "UTF-8" is becoming predominant. More explanation is in http://en.wikipedia.org/wiki/Character_encoding .

The encoding specified in the header of a Web document should match the encoding specified in the HTTP header. Some users maintain documents for more than one http server. Specification of the encoding at the top of the parameter text for HTML.Compile would be more efficient than recompiling HTML each time the encoding is changed.

The constant DTD was added to specify Document Type Declaration. In HTML5 BGCOLOR is not allowed in the body element.

Dialer.Mod

Dialer.Dial can be used to establish a modem connection from "home" to "office" for PPP. The office computer runs mgetty in Linux and answers the connection according to the ringback protocol. For Dialer to support ringback, the syntax of the Dial script was extended so that an empty string will invoke a pause; 11 "" is the 11 s pause in this script. Refer to pe.Dialer.Mod above for the syntax extension. This extension would be unneccesary if the pause could be invoked with modem commands but I've never found a way to achieve it. The script belongs in the SYS:Oberon.Text configuration file.

{* This is for a USR Sportster modem on an Oberon system 
calling a USR Sportster on a Linux system. *} 
Ringback = { 
     Init = { COM1 19200 }     {* modem port and speed *} 
     Dial = { 
         "ATZS0=0&F1&B1&C1" 
         10 "OK" 
         "ATDT16041234567,,;H0" 
         10 "OK" 
         11 "" 
         "ATDT16041234567" 
          40 "LAPM)"  
          CALL "PPPMain.StartInst Ringback peter" 
    } 
}

Dialer for voice calls. It saves time for numbers called frequently. This is such a script, invoked with Dialer.Dial NuvoSomeone Device0 ~ You might need Device1 or another. Init specifies the COM port; so why should Dial specify the device? A better syntax would allow Dialer.Dial Nuvo 6041234567 ~. That would work with various access protocols and destination numbers. Another problem to work on!

{* This is for the USR Sportster modem. *} 
NuvoSomeone = { 
     Init = { COM1 19200 }     {* modem port and speed *} 
     Dial = { 
          "ATZS0=0&F1&B1&C1"  
          2 "OK" 
          "ATDT<CardAccessNumber>,,;DT<LanguageSelector>,,,;" 
          20 "OK" 
          "ATDT<CardPINNumber>,,,,,,;" 
          20 "OK" 
          "ATDT<DestinationNumber>,,,,,,,;H0" 
          20 "OK" 
     } 
}

Dot Matrix Printer Usage

Most dot matrix printers can be configured with escape codes. Web based documentation for these is limited and can be difficult to find. In addition to references in the Wikipedia page, site specific search can help. For example, Google "site:okidata.com ESC P".

A frequently used sequence of codes should be stored in a file which is conveniently sent to the printer by Miscellaneous.PrintFiles. For example, a file named EpsonCourier12 can contain the nine characters "1B 6B 32 1B 4D 0D 0A". The first 3 characters, ESC k 2, select the Courier font. The next two characters, ESC M, select 12 characters per inch. The last two characters, 0D 0A, are carriage return and line feed. The file can be created and modified with Hex.Open EpsonCourier12 ~. To apply these settings, Miscellaneous.PrintFiles LPT1 EpsonCourier12 ~.

Similarly, a file named EpsonCourier17 can contain the nine characters "1B 6B 32 1B 78 30 0F 0D 0A". Again, ESC k 2 selects the Courier font. The four characters, ESC x 0 0F, select 17 characters per inch.

URI.Mod, Encoding of characters in a URI

My ISP requires the UserID, [email protected] but the @ character is not interpreted properly by NetSystem.SetUser. This is addressed by percent-encoding in URI.Mod. In NetSystem.SetUser, URI.UnESC is applied to the user and passwd. In NetSystem.Show, URI.ESC is applied. The parameters are set correctly with this command.
NetSystem.SetUser pop:peasthope%40cable.net:<password>@mail.cable.net ~

For more convenient use, a command version of URI.ESC is needed.

FTP.Mod and FTPDocs.Mod, Reports to System.Log

If a file name is long, the report of completion of a transfer by FTP and by FTPDocs can be off screen on the right. WriteLn is added to left-justify a report from Get and from Put.

FTP.Dir and Hidden files

A simple way to include the hidden files, such as .config, in the result from FTP.Dir is to set an option on the server. In /etc/vsftpd.conf for example, include the line "force_dot_files=YES". A more involved solution is to add the capability of the -a option for the LIST command to Oberon. Not yet tackled.

Mail.Mod, Conformance to Protocols

According to RFC 5321, Section 4.1.2 and RFC 5322, Section 3 the local-part of the address can not end with a ".". The erroneous Strings.AppendCh(id, ".") has been removed from Mail.SendMsgId.

In the POP3 protocol, RFC 1939, Section 3 states "Keywords and arguments are each[sic] separated by a single SPACE character." The extra blank appended to the front of the argument by Mail.NrToArg when converting a single digit is erroneous. Worse, the Zimbra POP3 server reports "-ERR unable to parse msg" and refuses to cooperate. The extra blank is not present in pe.Mail.NrToArg.

MultiMail.Panel Usage

When MultiMail.Panel is opened, check that the viewer is scrolled to the top. If the panel is saved with a recipient address, while the viewer is not scrolled to the top, that state will exist when the panel is opened again. Consequently a new message can be inadvertently sent to an old address.

PSPrinter.Mod, End Of Transmission

Added a statement to send an EOT character, 4X, also called control-D, at the end of a PostScript print job. The requirement is documented in PostScript Cartridge User's Guide, Hewlett-Packard Part No. 33439-90901, page 5-7. Probably in many other H-P manuals also.

PPP

Numerous small changes to the PPP sources are described in PPPnotes.

SSHTransport.Mod, System Freeze

A small change to SSHTransport.Mod to prevent the system from freezing when the remote system refuses su. Thanks to Guenter Feldmann, author of SSH.

System.Directory

A "~" appended to a directory listing is useful when it becomes the argument of a command such as FileSystem.GenCopyFiles.

In System.Directory, change the line
          Texts.WriteLn(W); Texts.WriteInt(W, count, 1); Texts.WriteString(W, " files");
to
          Texts.WriteString(W, "~"); Texts.WriteLn(W); Texts.WriteInt(W, count, 1); Texts.WriteString(W, " files");
and recompile; Compiler.Compile * ~ .

Mice

CLIXes, serial, 3-button, Model: Jx Mouse, FCC ID: FSUGMZB6. Works correctly as MS1.

MS Intellimouse 1.2A, PS/2 Compatible. PN X04-72176, Product ID 63618-OEM-2170103-7. As MSI, there is no cursor movement. As PS/2 it appears OK but can freeze when opening a document. Press <Scroll Lock> and use the arrow keys to reboot.

MS Wheel Mouse, Serial and PS/2 compatible. PN X03-53717, Product ID 83351-577-4049495-00000. Works as PS/2. Occasionally the cursor jumps downwards for a few milliseconds; freezes rarely.

In three old model Toshiba laptops, the pointing stick has worked as PS/2 with no failure ever.

Conclusion: for some mice the PS/2 driver might be improved.

Video

Q. My computer lacks a diskette drive. Can the display driver be adjusted?

A. Restart and hold down the shift key. The boot loader will allow config strings to be set. Make these settings to restore the VGA display as used by Oberon0.
Display=VGA.
Init=b81200cd10
DRefresh=""
DWidth=640
DHeight=480
DDepth=4
Press "w" to write the configuration to the part and "c" to continue booting. Another configuration can be set similarly using a string found in Config.Mod or in OberonDrivers.Text.

Q. Can a Toshiba 205CDS be configured to use the full screen rather than just the VGA subset of pixels?

A. Yes. The specifications at http://www.toshiba.com/ mention that the internal resolution is 800 x 600 x 64K/64K colors. 64K = 2^16. According to OberonDrivers.Text this is VESA mode 276(9) = 114H. Configure with the Oberon0 diskette or set these config strings at startup.
Display=Displays.
DDriver=DisplayLinear
Init=b8024fbb1441cd10b8014fb91401cd10268b4d28268b552a
DWidth=800
DHeight=600
DDepth=16

To use Toshiba Virtual Display Mode 1024 x 768 x 64K properly, DisplayLinear needs work.

Q. I am interested to understand the cryptic Init config strings. Is there any alternative to being an expert in Intel machine code and video programming?

A. When the system is installed with Oberon0, the Init string is provided by Config.Mod. The long VESA string above is built up in sections.

To understand a specific string, apply a disassembler. Then google the Web to understand what is done with the video processor.

For example, the VGA string is the five hex bytes b81200cd10. We want a file Init.o containing these bytes. An obvious if not efficient method is to use Edit or ET to put any 5 characters in Init.o. Then Hex.Open Init.o, replace the characters with B8 12 00 CD 10 and Store. Move Init.o to a Linux system. There apply objdump.

objdump -b binary -m i8086 -D Init.o
Init.o: file format binary
Disassembly of section .data:
0000000000000000 <.data>: 0: b8 12 00 mov $0x12,%ax 3: cd 10 int $0x10

Observe that 0x12 is put into register ax and then interrupt 0x10 is invoked. Googling "vga 12 ax 10" or "vga 12h ax 10h" finds several pages explaining that this sets VGA graphics mode 640 x 480 x 24 colors, the default for PC Native Oberon.

Kees C. prefers libdisasm's x86dis tool.

$ echo -e '\xb8\x12\x00\xcd\x10' | x86dis -r 0 5 -s att 
00000000 B8 12 00             mov     $0x0012, %ax 
00000003 CD 10                int     $0x10

The method can be applied to any of the strings.

Einstein's dictum: "Make it as simple as possible, but not simpler."

Violation: The last argument of a command can be ignored if end-of-text is reached rather than a ~ character.
Example: If ImportantArchive.Zip is created with "ZipTool.Add ImportantArchive.Zip blah1 blah2 blah3 <end-of-text>", blah3 is absent from the archive.
Solution: handle arguments with procedures which are used system wide. Allow end-of-text to produce the same effect as "~".

Copyright (c) 2004-2008, Peter Lyall Easthope. All rights reserved.

Valid CSS! HTML5 conformance
Best viewed with a Web browser.

HTML.Compile * ~ Desktops.OpenDoc OberonUsage.html ~ ET.OpenAscii OberonUsage.html ET.OpenAscii Shop.css FTP.Open [email protected] FTP.PutFiles OberonUsage.html => "/public_html/OberonUsage.html" ~ FTP.Close Desktops.OpenDoc "http://easthope.ca/OberonUsage.html"