<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Andreas, thanks for your enlightening explanation. That certainly makes this use case the most beautiful Easter Egg!<div class="">I will call it 'standalone MODULE*'.</div><div class=""><br class=""></div><div class="">So now we have found:</div><div class=""><br class=""></div><div class=""><span style="font-family: Menlo-Regular; font-size: 13px;" class="">1. integer multiplication operator</span><br style="font-family: Menlo-Regular; font-size: 13px;" class=""><span style="font-family: Menlo-Regular; font-size: 13px;" class="">2. real multiplication operator</span><br style="font-family: Menlo-Regular; font-size: 13px;" class=""><span style="font-family: Menlo-Regular; font-size: 13px;" class="">3. byte multiplication operator</span><br style="font-family: Menlo-Regular; font-size: 13px;" class=""><span style="font-family: Menlo-Regular; font-size: 13px;" class="">4. set intersection operator</span><br style="font-family: Menlo-Regular; font-size: 13px;" class=""><span style="font-family: Menlo-Regular; font-size: 13px;" class="">5. export mark</span><br style="font-family: Menlo-Regular; font-size: 13px;" class=""><span style="font-family: Menlo-Regular; font-size: 13px;" class="">6. interrupt procedure</span><br style="font-family: Menlo-Regular; font-size: 13px;" class=""><span style="font-family: Menlo-Regular; font-size: 13px;" class="">7. part of comment bracket</span><br style="font-family: Menlo-Regular; font-size: 13px;" class=""><span style="font-family: Menlo-Regular; font-size: 13px;" class="">8. standalone MODULE*</span></div><div class=""><span style="font-family: Menlo-Regular; font-size: 13px;" class=""><br class=""></span></div><div class=""><span style="font-family: Menlo-Regular; font-size: 13px;" class="">Still four to go...</span></div><div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">Op 12 apr. 2020, om 10:26 heeft Andreas Pirklbauer <<a href="mailto:andreas_pirklbauer@yahoo.com" class="">andreas_pirklbauer@yahoo.com</a>> het volgende geschreven:</div><br class="Apple-interchange-newline"><div class=""><div class=""><blockquote type="cite" class="">you mention one that I don't know: boot module: could you give an example and a place where we can find it?<br class=""></blockquote><br class="">This is an undocumented feature and not officially part of the Oberon-07 language. It is however briefly described at the end chapter 14.1. on p.77 of the book Project Oberon 2013 Edition.<br class=""><br class="">In sum, when the programmer compiles a module with the "RISC-0" option of the regular Oberon compiler (which is achieved by inserting an asterisk “*” immediately after the keyword MODULE), the compiler generates a so-called "standalone program” rather than a module that can be loaded by the regular module loader. Standalone programs are completely self-contained, relocatable instruction streams for inclusion directly in the hardware, i.e. they can run on the bare metal even when no module loader is present.<br class=""><br class="">As compared with regular Oberon modules, such standalone programs have different starting and ending sequences: The first location contains an implicit branch instruction to the initialization code of the standalone program, and the last instruction is a branch instruction to absolute memory location 0. In addition, the processor register holding the stack pointer SP (R14) is also initialized to a fixed value in the initialization sequence of a standalone program. These modified starting and ending sequences are generated in ORG.Header and ORG.Close, respectively.<br class=""><br class="">An example of a standalone program is the Oberon boot loader (module BootLoad.Mod) itself:<br class=""><br class=""> MODULE* BootLoad; (*the asterisk (=RISC-0 option) indicates that the compiler will generate a standalone program*)<br class=""> ...<br class=""> END BootLoad.<br class=""><br class="">The Oberon boot loader is typically loaded to a fixed memory location once using proprietary tools provided by the FPGA manufacturer, such as the Xilinx downloader tools. Once the boot loader is started, its task is to load the pre-linked Oberon inner core from a valid boot source to absolute memory location 0 and then to just branch location 0 (where the branch instruction itself is generated by the compiler, not the programmer).<br class=""><br class="">Note that standalone are not allowed to import other modules (as the module loader is not assumed to be present). In Extended Oberon, this rule is somewhat relaxed as follows: standalone programs can import other modules. so long as only constants are imported from them. In the future, pre-linked standalone programs will also be supported, allowing one to write a boot loader consisting of multiple modules.<br class=""><br class="">-ap<br class="">--<br class=""><a href="mailto:Oberon@lists.inf.ethz.ch" class="">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems<br class=""><a href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" class="">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a><br class=""></div></div></blockquote></div><br class=""></div></body></html>