<div dir="ltr">My understanding is that it is a 2018 addition to the SYSTEM package (e.g. system dependent) and was included in the ORG module of the compiler at that time as a procedural wrapping of the STI/CLI RISC5 machine instructions.<div><br></div><div>The RTI/CLI macine instructions are described in <a href="https://people.inf.ethz.ch/wirth/FPGA-relatedWork/RISC-Arch.pdf">https://people.inf.ethz.ch/wirth/FPGA-relatedWork/RISC-Arch.pdf</a> section 5 -- Interrupts. </div><div><br></div><div>At the same time the compiler gained the ability to recognize an interrupt procedure marked by an asterisk, compiled with a different prologue and with an epilogue ending in the RTI machine instruction instead of the usual RTS.</div><div><br></div><div>An architecture other than RISC5 (RISCV for example, or ARM, or X86) may include different mechanisms for enabling or disabling interrupts and for setting and updating interrupt vectors, if interrupts are to be supported at all, so I think SYSTEM is the right place for LDPSR (or an equivalent) rather than the language report.</div><div><br></div><div>Best Regards, </div><div>Chuck</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Mar 30, 2021 at 8:52 PM Skulski, Wojciech <<a href="mailto:skulski@pas.rochester.edu">skulski@pas.rochester.edu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Joerg:<br>
<br>
what is SYSTEM.LDPSR? It does not seem to be present in the language report dated Revision 1.10.2013 / 3.5.2016, which I just downloaded from Paul's website.<br>
<br>
Wojtek<br>
<br>
<br>
________________________________________<br>
From: Oberon [<a href="mailto:oberon-bounces@lists.inf.ethz.ch" target="_blank">oberon-bounces@lists.inf.ethz.ch</a>] on behalf of Jörg [<a href="mailto:joerg.straube@iaeth.ch" target="_blank">joerg.straube@iaeth.ch</a>]<br>
Sent: Tuesday, March 30, 2021 8:45 PM<br>
To: ETH Oberon and related systems<br>
Subject: [EXT] Re: [Oberon] Emulating interrupts in oberon-risc-emu as in the RISC5 specification<br>
<br>
Although TestInt is low-level, it should use Kernel.Install (SYSTEM.ADR(Int), 4) to make it a little bit less low-level😀<br>
<br>
This little wrapper makes interrupts a little bit better consumable:<br>
MODULE Interrupts; (* jr/31mar21 *)<br>
IMPORT S := SYSTEM, Kernel;<br>
PROCEDURE Install*(handler: PROCEDURE);<br>
  BEGIN Kernel.Install(S.ADR(handler), 4) END Install;<br>
PROCEDURE Set*(on: BOOLEAN);<br>
  BEGIN S.LDPSR(ORD(on)) END Set;<br>
END Interrupts.<br>
<br>
With it TestInt.Mod gets<br>
MODULE TestInt;<br>
IMPORT Interrupts;<br>
VAR led, cnt: INTEGER;<br>
PROCEDURE* MyInterrupt;<br>
  BEGIN<br>
    INC(cnt); IF cnt = 500 THEN led := 3-led; LED(led); cnt := 0 END<br>
  END MyInterrupt;<br>
PROCEDURE On*; BEGIN Interrupts.Set(TRUE) END On;<br>
PROCEDURE Off*; BEGIN Interrupts.Set(FALSE) END Off;<br>
BEGIN<br>
  led := 1; cnt := 0; Interrupts.Install(MyInterrupt)<br>
END<br>
TestInt.On<br>
TestInt.Off<br>
<br>
Interrupts.Mod could be enhanced servicing multiple interrupt handlers. Comparable to the background tasks in Oberon.Mod. This enhancement would install its own interrupt handler doing the scheduling, and the user‘s „interrupt handlers“ are normal procedures without * marking of the procedure. You would then install your handler like this<br>
PROCEDURE MyTask; BEGIN led := 3 - led; LED(led) END MyTask;<br>
BEGIN led := 1; Interrupts.Install(MyTask, 500) END TestInt.<br>
<br>
br, Jörg<br>
<br>
--<br>
<a href="mailto:Oberon@lists.inf.ethz.ch" target="_blank">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems<br>
<a href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" rel="noreferrer" target="_blank">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a><br>
</blockquote></div>