Oberon/ETH Oberon/newfaq

This document was originally hosted at the ETHZ. It remains under the ETH license and is in the WayBack archive.

FAQ on ETH Oberon - alpha/beta releases

From: ftp://ftp.ethoberon.ethz.ch/ETHOberon/Native/Update/Beta/ [expired]

Currently last: beta00120


Fixed errors

  1. When are files effectively deleted from a FS?
  2. Windows 2000 problem in conflict with Oberon
  3. Copying a file of a specific length causes the system to freeze
  4. The Buttons in System3.Tool have a wrong color

Known error

  1. Adaptec AIC-7861AHA-2940AU SCSI Controller hangs
  2. TRAP -7 during installation

Seemingly a problem, but not one

  1. Booting Oberon-0 on machine with 1024 Kb of extended memory
  2. "Incompatible version" error
  3. Boot virus on the Oberon-0 diskette
  4. Intel Pentium F0 0F bug

General questions

  1. Give an advice to a newbie on how to start with Oberon
  2. Explain the numbering schema of Oberon
  3. What is the historical background of the ETH Oberon System?
  4. Where do I find information about Oberon-0?
  5. How could one characterize Native Oberon in terms of multitasking?
  6. Is a new release of ETH Oberon planned?
  7. Is a version of ETH Oberon with an integrated development environment (IDE) more like CodeWarrior, Visual C++ or Visual Basic planned?
  8. How is Aos different from Native Oberon?

Hardware support

  1. Is a Native Oberon demo on a floppy diskette available?
  2. What hardware is supported?
  3. Is there an SDK for the purpose of writing drivers?
  4. Can I use ... Intel clone / non-US keyboard / 2-button mouse / AGP / USB / dot matrix printer ?
  5. Can I use ... EIDE and SCSI combined / ZIP / SCSI CD-ROM / recordable CD drive?
  6. Can I use ... Disk On Module / Disk On Chip?
  7. Can I install Oberon in flash memory?
  8. Is power management supported?
  9. Which of the devices installed in an older machine might work?


  1. How much time shall I have to invest to get a Native Oberon system running?
  2. How do I have to set up the BIOS on my machine?
  3. Can I boot Oberon from any partitition on a disk larger than 8GB?
  4. Can I install Oberon without repartitioning?
  5. Can I install Oberon from a hard disk?
  6. System hangs when selecting a HD driver
  7. Partitions.Show indicates read error on hard disk
  8. How does Oberon assign drive letters in Partitions.Show?
  9. How do I access a network service with user name, password, domain name?
  10. How do I install Oberon on a Sony VAIO?
  11. What does the strange, morse code-like beeping during startup mean?

Boot diskette

  1. Why does the creation an Oberon0 boot diskette end with an error?
  2. How to create a boot diskette for an existing Oberon
  3. How to create an image file of an existing Oberon (partition)

System start

  1. System hangs after displaying "OBE"
  2. System hangs after displaying "OBE" when booting from LILO
  3. How special is configuration file Oberon.Text?
  4. After customizing Oberon.Text the system fails to restart
  5. Oberon.Text errors at start-up
  6. System hangs with black screen when booting

System shutdown

  1. System locks after shutdown

Compiler (General)

  1. Can I get a disassembly of an object file?
  2. Is there an Oberon compiler for other development environments?
  3. How to write a back-end for a new architecture: ETH Oberon Compilers

File system

  1. How to organize a system with a minimum of two partitions
  2. Will a file search slow down with an increasing number of files?
  3. When does file garbage collection take place?
  4. How to direct a file to the proper FS
  5. How to mount a FAT16 partition
  6. How to access a backup diskette
  7. What is the maximum length of filenames?
  8. How to cache data in temporary files
  9. Can I process a *.zip archive in Oberon?

Software development

  1. What is the grammar of a module definition ( .Def) obtained with Watson?
  2. Where is the definition of module SYSTEM?
  3. Does Oberon expose enough system functionality in SYSTEM?
  4. How to force Oberon into "input mode"
  5. How to output a real value with the desired precision
  6. How to compare procedure variables

PCI detection

  1. How to interprete the values obtained with PCI.Mod

Oberon text

  1. How to distinguish an underscore from a hyphen
  2. Can the underscore be patched?
  3. How to use the cursor movement keys
  4. How to write Oberon source text using lower case characters only

2D graphics with Gfx

  1. How can I speed up text drawing in Leonardo?

Hypertext documents

  1. How to save the source text of a browsed document
  2. How to clear the cache

Postscript files

  1. How to print out a postscript file
  2. Is there something like a viewer for postscript file?

I/O port control

  1. How to control a serial port
  2. How to control a sound card
  3. How to control a parallel port: Serial and parallel port support
  4. How to control an USB port: USB support
  5. How to make a simple sound on the loudspeaker: Speaker support


  1. How to break the 64 charaters limit in a gadget TextField
  2. How to insert images in a user interface
  3. How to add items to a drop-down menu in System3.Tool
  4. How to create a drop-down menu like the ones in System3.Tool

Linux Native Oberon

  1. TRAP when using the opcode OUT
  2. How to use the Linux sound drivers
  3. How can I reduce the screen size from the current 1024x768 pixels

Oberon for Linux (x86)

  1. How can I reduce the screen size from the current 1024x768 pixels

VNC client

  1. Alt-key does not work
  2. Arrow down key does not work
Fixed errors
  1. When I delete files from an AosFS volume, this space is not made available until the volume is unmounted and then remounted. For example, if I have an AosFS formatted floppy that is full; I mount the volume and delete all its files, then I attempt to copy a file to this "empty" floppy - the result is a trap stating that the volume is full. If I unmount the floppy and then remount it, I can then copy to the volume. Is this an oversight, or done for good reason?
    A: This was inherited from the Ceres file system published in Project Oberon. That file system only does garbage collection at boot time, when we are sure there are no open files. This simplifies the garbage collector significantly. The old Native file system was the same. The current beta release does garbage collect anonymous files on-the-fly.
  2. Windows 2000 problem. If W2 is installed after one (or several) Native Oberon, it thinks it found a corrupted FAT32 partition and proceeds to fix it by writing in the first sectors and a bit later W2 hangs. Good bye Oberon partitions! This happens indifferently of the partition type, whether 76 (new) or 79 (old). If Oberon is installed after W2, at the next start W2 crashes with a "unhandled exception". No W2, no Oberon left intact.
    A: Partitions.Format is now fixed to work around the Windows 2000 Setup bug which causes it to "recognize" Native Oberon partitions as FAT partitions.
  3. Curious bug: Create a text file, call it "c11936", containing exactly 11936 bytes, and execute;
    DOS.CopyTo "c:/" c11936 ~
    The system freezes but there is no trap. Ctrl-Break recovers. There is no problem if the file contains 11935 or 11937 characters. DOS.CopyTo has never failed with any other file.
    A: The problem is actually in the normal file system. It has existed from the very first Oberon system published in Project Oberon. When Files.ReadBytes reads past the end of a file that has size n*2048-352 (for any integer n > 0), then the .res field in the rider is set incorrectly. This causes DOS.Copy to loop endlessly. The same error occurs with the new AosFS, but with files of size n*4096-568. Both errors are fixed now.
  4. The Buttons in System3.Tool are sort of green with my new Voodoo card using the Vesa2 driver. Is this a new feature or a bug?
    A: It was a driver bug (until beta000526) which is fixed now.
Known error
  1. My computer equipped with an Adaptec AIC-7861AHA-2940AU SCSI Controller hangs. Can you help? - Alan Freed
    A: No clue at this time. The problem is being investigated.
  2. TRAP -7 during installation.
    A: TRAP -7 is the "device not available" exception of the processor. It means a floating-point instruction was encountered, and floating-point is not implemented in the processor. The Cyrix Cy486SLC, mentioned, does not have floating-point.

    This is actually a bug in Native since we switched to the zip format for the boot disk compression. Previously it was possible to boot the system without using floating-point, and the floating-point emulator was loaded by the System module. To fix it, the floating-point operations have to be removed from the Zip module procedures used during booting, or the floating-point emulation module has to be linked with the boot file.
Seemingly a problem, but not one
1. Booting my 486 laptop, which has 1024 Kb of extended memory, from the Oberon-0 diskette ends with:
     TRAP 14 
     Kernel PC=9860, Kernel PC=9808, Kernel PC=10565, OFSRAMVolumes PC=461, ...
A: A 2Mb RAM disk is created by default by Oberon-0. That means at least 3Mb or so are needed for the installation. Technically, Oberon can run with less, but it would require a bit of effort to update the installation program to use less memory.
2. Execution of Diff.Do Empty.Display.Mod GD54xx.Display.Mod ~ ends with:
     Call error: Disk imports incompatible version of Kernel 
          GetConfig incompatible 
          WriteString incompatible
Also happens with other files.
A: Looks like you have an old version of Diff running on a new system. The new object files have keys incompatible with the old system. The difference is related to open arrays, which seems to be confirmed by the two procedures listed above.
==> Did you reinstall the apps package on the new system?
3. I found a parity.b boot virus on the boot diskette created from beta000320 version. Is this a potential thread?
A: This is a false alarm. Virus checkers often use heuristics to "detect" viruses. In this case the boot sector does not look like a normal DOS boot sector, so the virus checker assumes that it was infected by a virus. The diskette image file is not touched by a non-Oberon machine during its production. Some checkers will detect a Bloodhound.Boot virus.
4. When I ran dmesg under Linux to help trace down my SCSI problem, I noticed the following line:
     Intel Pentium with F0 0F bug - workaround enabled.
It seems as if my computer has the Pentium bug. I don't know if the kernel detects this, and if found, imposes a workaround like that of Linux?
A: It is probably not necessary to fix the Pentium bug in Oberon. From the description of the bug at https://en.wikipedia.org/wiki/Pentium_F00F_bug it seems that the only effect of the bug is to hang the machine. This is serious in multiuser operating systems, because any non-privileged user can hang the machine (and not just the root or administrator user).
In Oberon it is not a problem, because it is a cooperative single-user environment. If you do not stick to the safe part of the Oberon language, there are many other ways to hang the machine.
General questions
  1. Give an advice to a newbie on how to start with Oberon
    A: Assuming that you are interested in programming in Oberon, start with the book "Programming in Oberon" by N. Wirth and M. Reiser, to learn the language proper. Depending on your background this could take you little time, especially if you have some experience with Pascal. Have a try at these tutorials:
    • An Introduction to Oberon by Günther Sawitzki - http://www.statlab.uni-heidelberg.de/projects/oberon/Ito/ A german version Einführung in die Programmiersprache Oberon is also available. Both tutorials include an appendix entitled "Oberon for Pascal Programmers".
    • Pedro G. Gonnet's quick-and-dirty tutorial written (in German) for first year computer science students.
  2. Explain the numbering schema of Oberon.
    A: Historically, there has been two independently maintained "branches" of Oberon: V4 and System 3. System 3 is the ETH branch, which is still actively maintained by Prof. Gutknecht's group and external collaborators like Günter Feldmann at the University of Bremen. V4 was maintained by the University of Linz in Austria.
    To try and reduce the confusion, we have renamed "Oberon System 3" to "ETH Oberon" a couple of years ago.
    The latest official release of ETH Oberon for various platforms is always available by anonymous ftp at Sourceforge. Formerly at ftp://ftp.ethoberon.ethz.ch/ETHOberon/.
  3. What is the historical background of the ETH Oberon System?
    A: Read the ETH Oberon System White Paper.
  4. Where do I find information about Oberon-0?
    A: Oberon-0 can refer to one of three things:
    1. The subset of the Oberon programming language presented in Wirth's most recent book Compiler Construction. German version. Oberon-0 comprises a minimal set of necessary programming language features such as value assignment, statement sequences, if and while constructs as well as the concept of procedures. Hence, the language is simple to learn and expressive enough for specifying application processes. Further, the simplicity of the language keeps the compiler small and efficient which is important with respect to runtime compilation and evaluation.
    2. The subset of the classic Oberon system, in object-oriented style presented in Prof. Mössenböck's Object-Oriented Programming in Oberon-2 book. German version
    3. The minimal Oberon system used to boot an Intel machine for the purpose of installing Native Oberon. Produced from Oberon0.Dsk.
    Finally, the Oberon-00 programming language is a subset of Oberon, which is translated to a Lola data structure with programs written by Niklaus Wirth.
  5. How can one characterize Native Oberon in terms of multitasking?
    A: Native Oberon is a single-threaded multitasking system. It has two kinds of tasks: interactive and background. Interactive tasks consist of short-running "commands" initiated with the mouse by the user and background tasks consist of "handlers" that are called periodically by the system's idle loop.

    In a conventional operating system sense, the Oberon system has only one thread of execution residing in a single process. The procedure call in Oberon is the indivisible unit of execution (excepting procedures installed as interrupt handlers).

    The system-wide central loop (the Oberon.Loop) cycles between:
    1. farming out events to on-screen viewers by broadcasting message records to the viewers on screen. Such a broadcast is nothing more than calling the installed handler procedure in each display frame with a record (passed by reference) containing information about the event that occured.
    2. Invoking background tasks, which are nothing more than objects (on the heap) containing a procedure pointer. The object can hold local state for the procedure between invocations. It is up to the installed task not to hog the processor (i.e. to return control to the Oberon.Loop promptly) so that the responsiveness of the system can be maintained.
    The original Oberon system has been extended in various ways to allow more tasks run with equal priority. See Wirth's "Tasks vs. Threads" paper, Concurrent Oberon, ETHOS, Aos.
  6. Is a new release of the current alpha ETH Oberon planned?
    A: The system is being maintained by volunteers. The ETH developers are now working on the Bluebottle system, so there is no fixed release schedule. A new release is planned for the end of 2002. It will mostly be a bugfix and consolidation release.
  7. Is a version of ETH Oberon with an integrated development environment (IDE) more like CodeWarrior, Visual C++ or Visual Basic planned?
    A: The Oberon operating system was originally developed in the late eighties, and predates all the integrated development environments mentioned. It was intended as a minimalist OS that could be studied and used at all levels of detail. For a rationale, refer to the "Project Oberon" book by Wirth and Gutknecht. The Oberon operating system is much more than an IDE!

    Other groups have made Oberon-like environments that integrate closely with Windows, and might work more like conventional Windows-based development environments. The following can be cited:
    • The BlackBox system from Oberon Microsystems in Switzerland. Free educational version available at: www.oberon.ch
    • The POW! system from the University of Linz in Austria. http://www.fim.uni-linz.ac.at/pow/pow.htm
    At the ETH, the preference is given to the system's original textual-user interface for teaching, not the GUI desktop or Windows embeddings. If presented correctly as a minimalist system without distractions, this can be very successful in teaching programming. The operation of the TUI (edit, compile, test) can be taught in one tutorial session.
  8. How is Aos different from Native Oberon?
    A: In Aos, activities are mapped to active objects, which are scheduled preemptively on multiple processors.
Hardware support
  1. Is a Native Oberon demo on a floppy diskette (or 2 floppies or a CD image) available, like the QNX demo diskette, for testing Oberon out and checking how good my hardware is supported?
    A: Download Oberon0.Dsk and rawrite.exe at ftp://ftp.ethoberon.ethz.ch/ETHOberon/Native/Update/Alpha/ Write Oberon0.Dsk to a formatted 1.44MB diskette using rawrite.exe and boot it.
  2. What hardware is supported? From looking at some of the documentation there needs to be more hardware support. Is something in the pipeline?
    A: Consult the Hardware Compatibility List, which contains indications on how to writer drivers for disk and graphic controllers in particular. For display controllers, we have a couple of accelerated drivers with truecolor support (Permedia 2, S3Trio64) and some without truecolor (S3C805, W32, GD54xx) and then some generic drivers (VGA, VESA 2.0, VESA 3.0) that work on many cards. More display drivers are added all the time.
  3. Is there an SDK for the purpose of writing drivers?
    A: No. The best source of information is the source code of existing "model" drivers. The intention is to identify the best among the drivers, and let those be examples.
  4. Can I use ...?
  5. Can I use ...?
  6. Can I use ...?
    • a Disk On Module - DOM: yes - Disk support

      Michael A. McGaw reports the following on this subject:
      I have been using Disk On Modules, model DOM-4-40V by ADLink Technology, Inc. These modules have an IDE connector as part of the module itself, and therefore are plugged directly into the motherboard IDE connector (no IDE cable required, nor any special mounting hardware/location). There is a Molex power connector that must be connected to one of the PC supply Molex connectors. That's all. They work fine; I have a great many in use with Tyan and DFI motherboards (these are used for DOS-based applications at this time). They also appear to work well with Oberon. I have the stable Native release (not beta nor alpha; I have not tried these, although I suspect they will be fine as well) running on a 4 MB version of this module. For this system, I have a very compact and efficient complexion of modules, enabling me to do development even though this is intended as a run-time only target environment, remotely controlled by a Windows application communicating with the target via UDP over ethernet. Your recommendation of using an 8 MB module is well taken.

    • a Disk On Chip - DOC: no - Disk support
  7. Can I install Oberon in flash memory?
    A: No, not with the downloadable version. But Radiar has developed a custom solution for an Intel DA28F640JS flash PROM memory used on their C2 board, including an OBL. This board was built for the Colortronic company. In that industrial system, the lower level application without Gadgets uses a file system with 1.3 MB. A simple application with Gadgets use less then 4 MB.
  8. Is power management supported? With reference to notebooks.
    A: Simple power management is supported. During the idle loop, Oberon executes the HLT instruction, which stops the processor until the next interrupt (e.g. timer, mouse or keyboard interrupt). This saves a significant amount of power. Native Oberon uses the Advanced Power Mangement (APM) specifications already to switch off the machine during shutdown. In the future, we might look at ACPI.
  9. Which of the devices installed in an older machine might work? I am thinking in terms of making it a dedicated Native Oberon machine.
    A: The machine has:
    • two IDE hard drives: the Standard ATA/EIDE driver might be used successfully. Otherwise, the standard IDE driver included in earlier versions might be revived/refreshed for a real old controller. Only one drive could be used though.
    • an Adaptec AVA-1505: will probably not work. An AHA-1520 is supported.
    • an ATI Mach 64 graphic card: will not work in 1024 x 768 x 8 mode as one would like to have it. vesainfo.exe informs:
    VESA 1.2 512kb ATI MACH64
    100 C000:4DC9 A000 W A000 R 64K 64K 640x400x8
    101 C000:4DC9 A000 W A000 R 64K 64K 640x480x8
    But even so, read on Display Support.
    More generally, consult the Hardware Compatibility List.
  1. How much time shall I have to invest to get a Native Oberon system running?
    A: The time it takes to:
    • optional: organize your machine to accept Oberon to coexist in a dedicated partition with the already installed operating system(s). Consider to purchase commercial software to complete this step. Among others, PartitionMagic is a good investment.
    • download the files of the implementation of your choice. A minimum of 3 MB and a maximum of 10 MB.
    • unpack the software on your platform, sometimes it requires creating a boot diskette. This is the effective installation procedure which should take approximately 10 minutes.
    • customize the Oberon system by editing the Oberon.Text, following the instructions in System.Text.
    • optional: install Oberon packages above the already fully functional programming environment. Each package requires no more than a fraction of a minute to install.
  2. How do I have to set up the BIOS on my machine?
    A: How to set up the BIOS.
  3. Can I boot Oberon from any partition on a disk larger than 8GB?
    A: 8.4GB hard disk capacity barrier.
  4. Can I install Oberon without repartitioning?
    A: Yes, in these cases:
    1. The Native Oberon version for Dummies can be installed in a FAT16 partition having 40Mb and more free space. FAT32 support is being implemented. Documentation.
    2. Linux Native Oberon can be installed in an existing ext2 partition.
    3. An existing and totally free partition of at least 40MB can be dedicated to Oberon.
  5. Is it possible to boot and install Oberon from a hdd? I have a laptop here, I would like to put Oberon on, but it does not have a floppy drive, and I don't have an ide<->mini-ide cable (can't find suppliers).
    A: Yes, but only with the last release version, not with the new beta version. See:
    ftp://ftp.ethoberon.ethz.ch/ETHOberon/Native/DosBased/ [expired]
    Later the beta version will also support installing from non-floppy media.
  6. When I attempt to choose the Adaptec driver from within Oberon-0 the system freezes.
    A: Sometimes initializing the driver can take quite long, as the SCSI bus is scanned. Try waiting up to a minute for this to finish.
  7. I tried installing the new beta and when I boot up from Oberon-0 and use Partitions.Show, my first IDE hard drive reads with read error 2, the second drive reads ok, but I had freed up space using Partition Magic 4.0 on the first drive to install it. Why isn't it being read correctly?
    A: Do System.OpenKernelLog in Oberon-0, before configuring the disk driver. After configuring it and running Partitions.Show, store the Kernel.Log and transfer it to a diskette (see Appendix C of Install.Tool), and mail the text to me. ATA disks errors are documented at the end of the ATADisks.Mod module.
  8. How does Oberon assign drive letters in Partitions.Show?
    A: Since the introduction of the mountable file systems, drive letters are not used anymore. In a version predating the current Alpha / Beta version, drive letters are assigned to FAT partitions by starting at C: and sequentially scanning all partition tables for partitions of type 1, 4 or 6. If multiple disks are available, IDE disks are scanned first, in the order primary master, primary slave, secondary master and then secondary slave. Then all Adaptec SCSI disks are scanned, in the bus order, and then USB devices are scanned, in initialization order.
  9. How do I access a network service with user name, password, domain name?
    A: The communication adapter must be configured in the NetSystem section of Oberon.Text. The NetSystem.SetUser command is used to access a service. There are many ways to customize the access procedure: from occasional access to a more permanent set up. In the following explanations, we assume that the password is always entered in an invisible mode under the control of a system prompt.
    1. Specify a document by its URL and open it - e.g. ftp://user@server.domain.tld ~
      The following will appear in the System log:
      NetSystem.SetUser ftp:user@server ~
      - no password or username specified
      ftp://user@server.domain.tld loading document failed
      Now, execute the NetSystem.SetUser command and enter the password after the prompt. Finally, open the document.
    2. Execute a NetSystem.SetUser prior to attempting to open a document by its URL. Here also, a prompt message asking for the password will appear in the log. Now, open the desired document.
      One can specify a list of URLs after the SetUser command to set several passwords in one go. Delimit the passwords with at least one blank. If the number of URLs exceeds the number of passwords, the last password applies to the remaining URLs.
      Execute NetSystem.Show to show the state of NetSystem including for which users a password was entered. The password is never revealed.
      Execute NetSystem.ClearUser to clear all the passwords.
    3. Edit Oberon.Text, adding a NetSystem.SetUser command in the System.InitCommands section. Here also, one can specify a list of URLs after the SetUser command.For all the procedures presented up to now, the password may be included in the URL (e.g. ftp://user:password@server), but be conscious of the dreadful security breach!!! Additional information on the command syntax is found in NetSystem.Tool .
  10. How do I install Oberon on a Sony VAIO?
    A: The difficulty comes from the fact that PCMCIA is not supported by Oberon yet. Assuming that a free partition and a FAT167FAT32 partition under Windows exist, the difficulty can be circumvented.
    1. In Windows, install Oberon Dummy (from the VIS CD-ROM or downloading it) and produce a bootable diskette with a diskette drive attached via USB.
    2. Copy the Aos installation files, obtained by ftp, to a directory in the FAT partition.
    3. Boot Oberon from the diskette just created. It may be necessary to deactivate the Plug'n'Play option of the VAIO BIOS, in order that Oberon recognizes the USB disktte drive.
    4. Mount the FAT partition containing the Aos installation files.
    5. Open AosInst.Tool (found among these installation files).
    6. Follow the instructions in AosInst.Tool.
  11. What does the strange, morse code-like beeping during startup mean?
    A: Older versions of Native Oberon generate the morse code when an unrecoverable error occurs during booting. The morse can actually provide useful information on the location of the error, but in later versions this acoustic signal was removed, since very few people can decypher the code, and most people seem to be startled by it. The problem might be related to the lack of a coprocessor, as in the reported case of an i486SX on-board of an old laptop Compaq Conture 4/25CX. Some versions of Native do not include the floating point emulator in the boot file. Please try with the latest Alpha version downloadable at Sourceforge.
Boot diskette
  1. Why does the creation an Oberon0 boot diskette end with an error? The last block cannot be written. The diskette capacity is exceeded.
    A: Make sure to transfer the Oberon0.Dsk file in BINARY mode. Some FTP clients default to ASCII mode, which converts CR to CR-LF's. Compare the size of the downloaded file with that of the file on the server. If you have an Oberon system running, use it. The ftp viewer clearly distinguishes between "binary" and "ascii".
  2. How do I create a boot diskette for an existing Oberon system.?
    A: If a bootable diskette was not created during the installation, you must boot the Oberon-0 system and execute a small selection of commands listed in the .Tool texts.
    1. Execute the Config.Disk command corresponding to your disk controller
    2. Execute: Partitions.Show and select the partition in question
    3. Mount that partition by executing: OFSTools.Mount DST AosFS ^
    4. Open Configure.Tool to configure the system (display card and keyboard at least)
    5. Create the diskette by executing: Config.BootDiskette
  3. How to create an image file of an existing Oberon (partition).
    A: An image file of an Oberon partition, including a partition on a diskette, is created with the command Partitions.PartitionToFile as described in the Introduction to the ETH Oberon. The partition is restored using the counterpart command Partitions.FileToPartition. Example: the Oberon0.Dsk diskette image file which is at the base of the installation is created and restored to diskette in this way.
System start
  1. My boot manager was set up to start Oberon but at start-up my system freezes after displaying the characters "OBE". What is wrong?
    A: That means the second block of the OBL boot loader did not load correctly.
  2. I installed the latest beta successfully in a logical partition of a hard disk installed as MASTER on the IDE controller 2. Under Linux, I have then updated /etc/lilo.conf and invoked lilo which confirms added linux * oberon. But when I want to boot from LILO, all I get is "OBE" and my system hangs. What is causing that?
    A: Booting Native from the second hard disk is only possible:
    • using a boot manager supporting chaining (e.g. LILO)
    • using a BIOS supporting this
    • using a Native boot diskette
    • using noboot.exe
    If your boot loader does not support "chaining" to boot a partition from the second drive, you can try "patching" the boot sector of the Oberon partition using a sector editor like Norton Disk Editor. The byte at offset 24h in the boot sector should be set to 81h instead of 80h, to boot from the second hard disk. To make sure you are modifying the correct sector, check that the string "OBERON" appears at offset 3 in the sector.
  3. Is Oberon.Text, which must be customized to a user's requirements, an abnormal / special / spooky file?
    A: No, it is a quite normal text, but embedding gadgets in it, will induce the system to load many more system resources than expected, right from the start of Oberon. It must be customized during the installation and only occasionally later on. The InitCommands section, at the top, is the most likely part which might need some editing, e.g. to add a command which should be executed automatically at system start.
  4. I have customized the InitCommands section of Oberon.Text and now when I restart my system no viewer appears. How do I recover?
    A: You have made a typo error in the text. Press Ctrl-Break to get a Trap viewer. Now, you can type commands to open Oberon.Text again and to fix the error. Check if all { and } characters are matched.
  5. After bootup my System.Log looks like
    System.Time 21.03.2000 16:14:52
    ETH Oberon / PC Native 20.03.2000
    Oberon.Text - Gadgets.Aliases not found
    Oberon.Text - Gadgets.Documents not found
    Oberon.Text - Gadgets.DocumentServices not found
    A: This looks like a syntax error in Oberon.Text . Here also, check that all { and } characters are matched.
  6. I tried to install the new beta on my old 386SX. It has an IDE disk and an additional old Adaptec SCSI controller with a disk and a CD. The black screen with the white frame appeared but then nothing happened, the system hangs.
    A: Did it say "OBERON loading..."? Did the OBL> prompt appear? Did the diskette light go on? If the OBL> prompt appeared, try "Init=9090" before "c" to see if some useful error message appears on the display.
System shutdown
  1. I have noticed that when I quit by Shutdown, the system locks. Ctrl-Brk and Ctrl-Alt-Del do nothing.
    A: This could be a problem with the APM code used to shut down the computer. Try setting the configuration string "APM=0" to disable it.
Compiler (General)
  1. Can I get a disassembly of an object file? I am interested in looking at the code that is generated by the Oberon compiler. In particular, I am interested in the PowerPC and the Intel code generators.
    A: Use the Decoder tool to disassemble Native Oberon or Linux Native Oberon object files. Syntax: Decoder.Decode some.Obj opens a text viewer "Decoder.Dec" presenting the disassembled code. You can call the command from the "Browser" popup menu in System3.Tool.
    The Native Oberon Object File Format (OFF) is an evolution of the Windows Oberon OFF with only minor differences. The Symbol File information, which had the file extension .Sym, is now included in the object file and has been extended to include the Active Oberon and OberonX language extensions. Documentation (html, pdf, ps available).
  2. Is there an Oberon compiler for other development environments?
    A: The Oberon-2 compiler from the Oxford University in UK can be cited:
    Also look at the BlackBox and POW! systems.
File system
  1. I would like to create, as a minimum, two separate partitions: SYS and USR. It would be useful to also have an APPS partition. How would I go about doing this?
    A: Read the Multiple Oberon partitions on a machine section in the "Introduction to ETH Oberon".
  2. What happens to an Oberon system when very many (>10000) files are created in a file system? Will a file search become too slow, so a user will have to wait opening a file? If not, why?
    A: No. Read the detailed explanation in the File directory section in the "Introduction to ETH Oberon".
  3. I know that the Native Oberon garbage collector is mark-and-sweep, not copying, but does it ever move objects, for instance to compact memory if it becomes excessively fragmented?
    A: No, objects are never moved by the Mark/Sweep collector. To avoid fragmentation with a program that continuously allocates memory, call the Garbage collector (Oberon.Collect) from time to time to free unused memory. Avoid calling it too much though, because it does take some milliseconds to run, depending on the number of reachable objects on the heap.
  4. I have a large number of .Arc files to port over. I've placed them in the volumes I want, but when I extract them they write to the SYS: volume.
    A: Use OFSTools.SetDefault.
  5. How do I mount a FAT16 partition?
    A: Starting from the beta release of Dec. 8, 2000, it is possible to embed an Oberon system in a FAT16 file system. This makes it possible to install an Oberon system without creating a dedicated Oberon partition. This facility, which existed in earlier releases, was abandoned temporarily and is now revived. Full support for mounting a FAT12, FAT16 or FAT32 partition is now available.
  6. I have a lot of floppies initialized as Native Oberon floppies. When I put one in drive A and execute
    OFSTools.Mount A NatFS Diskette0 ~
    the System.Log reads "A: OFSDiskVolumes: Device Diskette0 not found". What am I doing wrong?
    A: The Backup.Format is not compatible with Partitions.Format. Use the Backup tool to access Backup-format floppies. Perhaps someone could integrate the Backup tool as a file system.
  7. What is the maximum length of filenames and what characters are allowed?
    A: It depends on the specific file system mounted. The original Oberon file system has the following: 31 characters maximum per name (excluding the trailing 0X). The name must start with an alphabetic character, and may contain only alphanumeric characters and ".".
  8. How to cache data in temporary files.
    A: In Native Oberon, we use the convention that all temporary files start with "Temp". If one needs a lot of temporary files, we suggest calling temporary files TempApplicNNNNNNNN, where Applic identifies the application uniquely and NNNNNNNN is a unique number in hexadecimal (perhaps initialized to the date/time at startup and then incremented sequentially). Of course, you will have to check if a file exists before overwriting it. Using anonymous files (Files.New("")) is preferable though, if practicable.
  9. Can I process a *.zip archive in Oberon?
    A: An extensive support for opening zip archives and extracting the files is in preparation. The Unzip tool which existed for some time was removed since it showed intermittent problems. Traditional Oberon *.Arc files will be replaced by space saving zip archives. Documented in ZIP.Tool.
Software development
  1. What is the grammar of a module definition ( .Def) obtained with Watson?
    A: See the EBNF definition of the language.
  2. I have tried Watson.ShowDef SYSTEM, but that fails with the error message 'no info available' -- where is the complete description on all functions exported by SYSTEM?
    A: See SYSTEM
  3. Does Oberon expose enough system functionality in SYSTEM to allow the kind of memory manipulation I want?
    A: Yes. Be careful to make the distinction between the modules SYSTEM and System. SYSTEM is a pseudo-module whose calls are compiled in-line by the compiler. System is a system "toolbox" module providing basic system functions like Directory, ShowModules, etc.The module SYSTEM exposes the complete memory, and allows unsafe type-casts to be made. It should be used with care, because if misused it can easily crash the whole system. It is a bit like programming in C :-)
4.  How to force Oberon into "input mode".
A: In essence, Oberon is non-modal. One may want to force it into a mode, but in exceptional situations only. For instance, "input mode" may be required for entering a password or a set of values, as is suggested in the Prompt module below. The commands NetSystem.SetUser and EditKeys.GetKeyCode feature an input mode.

       MODULE Prompt;  (* inspired from NetSystem.SetUser *)
       IMPORT Input, Texts, Oberon; 
          W:  Texts.Writer; entered: ARRAY 64 OF CHAR; 

          (* The parameter "show" controls the appearance of the characters typed, for secrecy purposes. *) 
          PROCEDURE InputMode(prompt: ARRAY OF CHAR; show: BOOLEAN; VAR str: ARRAY OF CHAR); 
          VAR i: LONGINT; ch: CHAR; 
             Texts.SetColor(W, 1); Texts.WriteString(W, prompt); Texts.SetColor(W, 15); 
             Texts.Append(Oberon.Log, W.buf); 
             Input.Read(ch); i := 0; 
             WHILE (ch #; <span id=""></span>0DX) & (ch # 1AX)  DO 
                IF ch = 7FX THEN   (* Use backspace to correct the current input *) 
                   IF i > 0 THEN 
                      Texts.Delete(Oberon.Log, Oberon.Log.len-1, Oberon.Log.len); 
                   IF show THEN Texts.Write(W, ch) ELSE Texts.Write(W, "*") END; 
                   Texts.Append(Oberon.Log, W.buf); 
                   str[i] := ch;  INC(i) 
             str[i] := 0X;
             Texts.WriteLn(W);  Texts.Append(Oberon.Log, W.buf) 
          END InputMode;

          PROCEDURE Prompt*; 
             InputMode("Enter data: ", TRUE, entered); (* use for entering a password *) 
             REPEAT InputMode("Enter data: ", TRUE, entered) UNTIL entered = "q" (* use for a set of values *) 
          END Prompt; 

       END Prompt.

5.   How to output a real value with the desired precision (e.g. not 1.E+03 but 1037).
A: Use the procedure Out.RealFix (x: REAL; n, f: INTEGER); to output a real x in n field positions in fixed point notation with f fraction digits. Also LongRealFix exists. In Oberon for Windows or Linux, one must open a viewer and write the edited value under program control.
6.   How to compare procedure variables. Oberon only allows comparison of a procedure variable to NIL.
A: Procedure variables can be compared in this manner:
       MODULE Temp; 
         VAR p, q: PROCEDURE;
         PROCEDURE P;
         END P;
         p := P; q := P;
         (*IF p = P THEN END;*)  (* does not compile *)
         IF p = q THEN END  (* but this works *)
       END Temp.
PCI detection
  1. I found the PCI.Mod module easy to use. However, when I read the base addresses for the card I have, I found the values were off by 1. Why?
    A: This is correct. The PCI module gives direct access to the PCI BIOS32, without much further interpretation of the results. See section of the PCI Specifications (we have version 2.0). If the low bit of a base address is 1, it indicates an I/O space register, and bit 1 is reserved. If the low bit is 0, it indicates a memory-mapped register, bit 1-2 indicate the location, and bit 3 indicates whether the memory is prefetchable. The rest of the bits are the actual I/O or memory address.
Oberon text
  1. Working with Unix filenames it is really a pain to see the difference between hyphen "-" and underscore "_". Any chance to fix that in a next release? Or give at least a reason why it has to be like that?
    A: It is not known why the short hyphen was mapped to the underscore ASCII character. As a quick workaround for this kind of problem, keep a bit of Courier10 text in your system tool, which you can use to reformat and reveal the underscores in any other text quickly:
    1. Select target text with MR drag
    2. ML-MR interclick on the Courier10 text
  2. If the underscore is here to stay, can somebody give us a tool to patch the font files to give us a real underscore? This should not take more than some hours I suppose.
    A: Try the FontEditor in the Apps package. Documentation; formerly at http://www.ethoberon.ethz.ch/ethoberon/tutorial/FontEditor.htm [expired].

    Perhaps someone can also generate a new set of Oberon fonts mapping the ISO Latin-1 character set. This could be done with a program, and we would suggest renaming the new font to avoid conflicts. See the Fonts.Internalize procedure in Source1.Arc for the font file format.

  3. Native Oberon is running well but the cursor cannot be controlled with the cursor movement keys. What do I need to adjust/setup to enable these keys?
    A: The default text editor only supports positioning using the mouse. To install a more advanced editor, execute ET.ReplaceSystemEditor . You can also place this command in the System.InitCommands section of Oberon.Text, to have it executed automatically. If you have installed the Gadgets package, execute TextDocs.ReplaceSystemEditor command to install an even better editor.
  4. How to write Oberon source text using lower case characters only. Persons affected by RSI may wish that.
    A1: Modify the compiler module OPS (scanner).
    1. Make a procedure "Check"
      PROCEDURE Check(ident, keyword: ARRAY OF CHAR): BOOLEAN; 
          i := 0; 
          WHILE ident[i] # 0X DO ident[i] := CAP(ident[i]) END; 
          RETURN ident = keyword 
      END Check;
    2. In OPS.Get, for each letter change
      | "B": Identifier(s);
          IF name = "BEGIN" THEN s := begin
          ELSIF name = "BY" THEN s := by


      | "B", "b": Identifier(s);
          IF Check(name, "BEGIN") THEN s := begin
          ELSIF Check(name, "BY") THEN s := by

      Recompile OPS.Mod. Note that the built-in types (CHAR, INTEGER, ...) are not defined as keywords. If you want to rename them too, you will find their declaration in OPT.Mod (symbol table). The proposal is to have both uppercase and lowercase versions, so that you still will be able to compiler the release programs.

      In OPT.Mod module body, for every type declaration add an alias like this:

      EnterTyp("CHAR", Char, OPM.CharSize, chartyp, SFtypChar);
      EnterTypAlias("char", chartyp);

    A2: Use the RX regular expressions tool to convert lower case keywords in a source text to upper case ones.
    RX.SetSearch "begin"
    RX.SetReplace "BEGIN"
    RX.ReplaceAll filename | *

    Make a script with an entry for each keyword. Then, execute it with Configuration.DoText scriptname ~

    A3: Use the EditKeys tool, allowing someone to define personal shortcuts. For example, if you type "XYZ:M" and press the Insert key, EditKeys substitutes it with
    END XYZ.

    You may add your own macros to EditKeys.Text, like integer ("INTEGER" write). Pressing "Insert" after "integer" will change it to "INTEGER".

    A final remark: it would be nice if someone would submit such scripts as a contribution.

2D graphics with Gfx
  1. How could I speed up text drawing in Leonardo? Leonardo is a nice vector graphics tool, however, in the current implementation, text drawing is UNBEARABLY slow. When I first opened the example figure Leonardo.Fig, I noticed how the words "Welcome To" were slowly drawn to the screen. I first I thought this was some type of animation "feature". But soon I realized that if you used a large text font (over 20 pts) Leonardo would simply crawl.
    A: A suggested workaround is to edit the file LeoCaptions, replacing the line:
    Gfx.DrawStringAt(msg.ctxt, 0, 0, cap.text^);

    with the lines:

    Gfx.Begin(msg.ctxt, {Gfx.Stroke, Gfx.Fill}); 
    Gfx.ShowAt(msg.ctxt, 0, 0, cap.text^); 

    and text drawing will speed up dramatically. This is how to explain that: by including Gfx.Stroke in the render mode, you force Gfx to append the outlines of the glyphs in the text to the current path and later fill and stroke them. If you only have {Gfx.Fill} in the render mode (as Gfx.DrawStringAt does), Gfx directly copies pre-rendered and cached glyph bitmaps to the screen because this is usually much faster. However, on Windows Oberon this assumption breaks when there is no matching Oberon bitmap font because only those can be rendered quickly. Without Oberon bitmap font, the GfxDisplay driver has to read pixels from screen memory, copy the glyph bitmap over them, and write them back to the screen. Unfortunately, reading pixels from the frame buffer is very slow on Windows. The problem doesn't exist in Native Oberon.

    The above solution strokes characters with the current stroke color and fills them with the current fill color. If current stroke and fill color are not the same, the above workaround results in visible outlines around all characters. To avoid this effect, Gfx must be forced to use outline fonts without actually stroking the outline. This can be done by first recording character outlines in a path and filling this path afterwards, as illustrated in the following algorithm:

    Gfx.Begin(msg.ctxt, {Gfx.Record}); 
    Gfx.ShowAt(msg.ctxt, 0, 0, cap.text^); 
    Gfx.Render(msg.ctxt, {Gfx.Fill});

    This should be at least as fast as what was suggested in the first place. A warning however: text at small sizes will probably look horrible because it is rendered directly from the corresponding font outlines, without any hinting whatsoever.
Hypertext documents
  1. How to save the source text of a browsed document.
    A1: Execute HTMLDocs.ShowHTML * . A text document viewer will be opened showing the HTML source text, which can then be saved with [Store]. The document must be completely downloaded before it can be stored. Cfr. HTTP.Tool
    A2: Select a hyperlink and execute HyperDocsTools.Fetch localname ~ . The document with the selected URL will be fetched and stored in a local file "localname". Cfr. HyperDocs.Tool
    A3: The two commands are found in the GUI HyperDocs.Panel .
  2. How do I clear the hypertext documents cache? If I re-fetch a document without rebooting, the document is not retrieved from the network.
    A: Use either of:
    1. Execute HyperDocs.ClearCache
    2. Open the HyperDocs.Panel and click on the [Clear Cache] Button
    3. Open the document and click on the [Reload] Button
PostScript files
  1. How do I print out a PostScript file?
    A: To send files directly to a PostScript printer use (in Miscellaneous.Tool): Miscellaneous.PrintFiles LPT1 {file} ~
  2. Is there something like a viewer for Postscript files for Oberon (an equivalent of ghostview for windows)?
    A: No.
I/O port control
  1. How to control a serial port RS-232.
    A1: Oberon includes all that is required to control a serial port without further ado. See Applications.Tool -> V24Terminal in Native Oberon. Use the V24.Panel to control a serial port with great ease and without programming. Ideal for exercising AT commands against a modem or to set-up a router, via a serial control port (console port), as explained in the Native Oberon Installation document (Connectivity section).
    The undocumented V24Log.Mod is a little application that copies everything arriving on the serial port to the System.Log. Examples for using it are found at the end of the source text.
    A2: Use the procedures in module V24.Mod in your own program.
    A3: The current V24 module only supports two "standard" fixed ports:
    COM1: 3F8H / IRQ 4 and COM2: 2F8H / IRQ 3. The alpha release was extended to support COM3 and COM4 too. See Serial and parallel port support.
  2. How to control a sound card.
    A: Get some inspiration by looking at the source text of module Sound.Mod in PC Native Oberon. Win.Audio.Arc is the place to look for in ETH Oberon for Windows. Watch this: some of the modules of the Windows implementation are not portable(compile with option \N).
  1. When I define the Command field of a Button, I soon reach the maximum length of 64 characters available in the TextField of Columbus. Would it be possible to increase MaxLen to 96 or to 128?
    A: Whatever number is used, it will always be too small for somebody. Rather solve the problem in another way, e.g. by having the command read your arguments directly from the relevant objects. Use Gadgets.FindObj(Gadgets.context, "ObjName") to find the object and then use Attributes.GetXXX to read the attribute value. Then you have 64 characters per argument, not for all the arguments together.

    If you really need more characters in a command, replace the gadget's Cmd text field by up to 10 fields and insert the following command procedure in one of your modules:

    (** Glue together the attributes Cmd0 to at most Cmd9 of the gadget and 
        execute the resulting string. Macros are expanded. 
        This helps when the Cmd attribute limited to 64 characters is too short.  *)
    PROCEDURE ExecAttrCmds*; 
         cmd, cmdN: ARRAY 1024 OF CHAR; cmdName: ARRAY 8 OF CHAR; 
         cmd := ""; cmdName := "Cmd0"; 
              Attributes.GetString(Gadgets.executorObj, cmdName, cmdN); 
              IF (cmdN = "") OR (cmdName[3] > "9") THEN EXIT; END; 
              Strings.Append(cmd, cmdN); cmdName[3] := CHR(ORD(cmdName[3])+1); 
         Gadgets.Execute(cmd, Gadgets.executorObj, Gadgets.context, NIL, NIL); 
    END ExecAttrCmds;
  2. I am trying to give the user interface in development a good look and would like to import some images to put them into my interface (for example) as a background image. What is the best way to achieve this within Oberon?
    A: If your user interface resides on a Panel, you need to set the "Picture" link of the Panel to a picture. here is a concrete example:
    1. Open Clown.Pict and select the frame
    2. Columbus.Inspect ~ (you should see a Rembrandt.New generator)
    3. Press the Link button to see the "Model" link.
    4. Select your panel and do another Columbus.Inspect ~ (Panels.NewPanel generator)
    5. Press the Link button to see the "Picture" link (with a cross in it).
    6. MM-MR interclick on the "Model" link of the Rembrandt.New and drag and drop it on the "Picture" link of the Panels.NewPanel. The cross should turn to a box with a little circle.
    7. Press the Apply button. Your Panel should now have a Clown backdrop.
  3. How to add items to a drop-down menu in System3.Tool.
    1. Make a deep copy of the Iconizer with the drop-down menu in question to a work area.
    2. Select the copied Iconizer and set the caret in the work area.
    3. Execute Icon.Break to break the Iconizer apart. The two sides are inserted at the caret.
    4. Using Columbus, edit the "Open" side, adding new entries. The list container is usually locked.
    5. Reconstruct the Iconizer by dropping the "Close" component in it, then flip the Iconizer and finally drop the "Open" component in it.
    6. Copy the finished Iconizer to System3.Tool .
  4. How to create a drop-down menu like the ones in System3.Tool.
    1. Interactively, in a work area, with the combined use of Columbus and of Gadgets.Panel.
    2. Writing a LayLa description of the Iconizer and its components. Cfr. Chapter 6 in The Oberon Companion - Chapter6.Text in Oberon.


    { Example of drop-down menu Iconizer à la System3.Tool. } 
      (DEF width 60) 
      (DEF height 24) 
      (DEF ClosedSide 
        (VLIST Panel (w=width h=height hjustify=CENTER vjustify=CENTER) 
            (ATTR Locked=TRUE) 
          (NEW Caption (ATTR Value="Menu")) 
      (DEF OpenSide 
        (VLIST Panel (w=width h=100 border=1 dist=1) (ATTR Locked=TRUE) 
          (NEW Button (w=[] h=height) (ATTR Caption="Text1" Cmd="...")) 
          (NEW Button (w=[] h=height) (ATTR Caption="Text2" Cmd="...")) 
          (NEW Button (w=[] h=height) (ATTR Caption="Text3" Cmd="...")) 
          (NEW Button (w=[] h=height) (ATTR Caption="Text4" Cmd="...")) 
      (NEW Iconizer (w=60 h=24) (ATTR Popup=TRUE Menu=TRUE) 
        (LINKS Closed=ClosedSide Open=OpenSide)) 
Linux Native Oberon
  1. I get trapped everytime I use the opcode OUT in Oberon for Linux. Why?
    A: To use the IN and OUT assembler commands in Linux you need the permissions to do that. As root, your program can set the permissions with ioperm or iopl.
    Try levels from 1 to 3. The default level is 0. On success, zero is returned.
            PROCEDURE iopl( level: LONGINT): LONGINT; 
            CONST IOPL= 110; 
            CODE {SYSTEM.i386} 
                 MOV     EAX, IOPL 
                 MOV     EBX, level[ EBP] 
                 INT     80H 
            END iopl;
  1. How do I use the Linux sound drivers?
    A: Sound is currently not implemented. Volunteers are welcome.
  2. How can I reduce the screen size from the current 1024x768 pixels?
    A: Edit the width and height in oberon.cnf.
Oberon for Linux (x86)
  1. How can I reduce the screen size from the current 1024x768 pixels?
    A: Though designed to operate in full-screen mode, you can create a smaller Oberon desktop by editing X11.Mod and recompling it.
    In the procedure X11.OpenDisp, find these lines:
            (* adjust to physical window size *) 
            GetGeometry( display, primary, gRoot, gX, gY, gW, gH, gBW, gD );   
            IF gW MOD 8 # 0 THEN  
                 DEC( gW, gW MOD 8 );   
            ResizeWindow( display, primary, gW, gH );   
and replace them by:
            (* gW MOD 8 should be 0 for efficiency! *)
            GetGeometry( display, primary, gRoot, gX, gY, gW, gH, gBW, gD ); 
            gW := <your desired witdh> 
            gH := <your desired height> 
            ResizeWindow( display, primary, gW, gH );
VNC client
  1. Some of the more important keys, like left Alt, do not seem to work. Why?
    A: The Input module does not return all possible key combinations. E.g. in Oberon, Alt-a generates the german "ä". But the VNC client has a workaround for this. If you press and release Alt, VNC remembers it and adds "Alt" to the next key. E.g. to switch my virtual X desktop I press and release Alt and then press Ctrl-Left/Right/Up/Down. The VNC viewer must have focus first, so you must left click somewhere in the viewer first. We hope to fix the Input module later.
  2. The arrow down key doesn't work reliably. This is not a mechanical issue, as I have tested it with three different keyboards. However, it seems to be "fixed" when closing the VNC client window and opening a new one.
    A: Perhaps this is because the focus is lost. Unfortunately, there is no visual indication when the viewer has focus. Try pressing the left mouse button in the viewer to give it focus.

23 jan 2003 - Copyright © 2003 ETH Zürich. All rights reserved.
E-Mail: oberon-web at inf.ethz.ch [expired]
Homepage: www.ethoberon.ethz.ch/ [expired]