|
|||||||||||
Download by anonymous FTP
From: ftp://ftp.inf.ethz.ch/pub/ETHOberon/Native/Update/Beta/
Currently last: beta001208
Links
Fixed errors
Known error
Seemingly a problem, but not one
General questions
Hardware support
Installation
Boot diskette
System start
System shutdown
Compiler (General)
File system
Software development
PCI detection
Oberon text
2D graphics with Gfx
Hypertext documents
Postscript files
I/O port control
Gadgets
Linux Native Oberon
Oberon for Linux (x86)
VNC client
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.
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.
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?
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.
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: ftp://ftp.inf.ethz.ch/pub/ETHOberon/
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.
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:
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.
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:
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.
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.
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.
Later the beta version will also support installing from non-floppy media.
Now, execute the NetSystem.SetUser command and enter the password after the prompt. Finally, open the 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.
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 .
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: ftp://ftp.inf.ethz.ch/pub/ETHOberon/Native/Update/Alpha/
If you boot loader does not support "chaining" to boot a partition from the second drive, you can try this:
"Patch" 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.
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 if all { and } characters are matched.
If the OBL> prompt appeared, try "Init=9090" before "c" to see if some useful error message appears on the display.
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).
Also look at the BlackBox and POW! systems.
File system
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 :-)
MODULE Prompt; (* inspired from NetSystem.SetUser *)
IMPORT Input, Texts, Oberon;
VAR
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;
BEGIN
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 # 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);
DEC(i)
END
ELSE
IF show THEN Texts.Write(W, ch) ELSE Texts.Write(W, "*") END;
Texts.Append(Oberon.Log, W.buf);
str[i] := ch; INC(i)
END;
Input.Read(ch)
END;
str[i] := 0X;
Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
END InputMode;
PROCEDURE Prompt*;
BEGIN
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;
BEGIN
Texts.OpenWriter(W)
END Prompt.Prompt
MODULE Temp; VAR p, q: PROCEDURE; PROCEDURE P; END P; BEGIN p := P; q := P; (*IF p = P THEN END;*) (* does not compile *) IF p = q THEN END (* but this works *) END Temp.
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.
1. Make a procedure "Check"
PROCEDURE Check(ident, keyword: ARRAY OF CHAR): BOOLEAN;
BEGIN
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
END
to
| "B", "b": Identifier(s);
IF Check(name, "BEGIN") THEN s := begin
ELSIF Check(name, "BY") THEN s := by
END
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
MODULE XYZ;
....
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.
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^);
Gfx.End(msg.ctxt);
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.End(msg.ctxt);
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.
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 .
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
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*;
VAR
cmd, cmdN: ARRAY 1024 OF CHAR; cmdName: ARRAY 8 OF CHAR;
BEGIN
cmd := ""; cmdName := "Cmd0";
LOOP
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);
END;
Gadgets.Execute(cmd, Gadgets.executorObj, Gadgets.context, NIL, NIL);
END ExecAttrCmds;
Example
LayLa.OpenAsDoc
{ Example of drop-down menu Iconizer à la System3.Tool. }
(CONFIG
(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))
)
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;
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 );
END;
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 );
23 jan 2003 - Copyright © 2003 ETH Zürich. All rights reserved.
E-Mail: oberon-web at inf.ethz.ch
Homepage: www.oberon.ethz.ch/
Wichtiger Hinweis:
Diese Website wird in älteren Versionen von Netscape ohne
graphische Elemente dargestellt. Die Funktionalität der
Website ist aber trotzdem gewährleistet. Wenn Sie diese
Website regelmässig benutzen, empfehlen wir Ihnen, auf
Ihrem Computer einen aktuellen Browser zu installieren. Weitere
Informationen finden Sie auf
folgender
Seite.
Important Note:
The content in this site is accessible to any browser or
Internet device, however, some graphics will display correctly
only in the newer versions of Netscape. To get the most out of
our site we suggest you upgrade to a newer browser.
More
information