<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div>By writing MODULE* you disable run time checking :-)</div><div>Compile it as MODULE and you will get your trap.</div><div>Br, Jörg</div><div><br>Am 15.05.2015 um 01:06 schrieb David Hunter &lt;<a href="mailto:drhunter@frontiernet.net">drhunter@frontiernet.net</a>&gt;:<br><br></div><blockquote type="cite"><div>
  
    <meta content="text/html; charset=windows-1252" http-equiv="Content-Type">
  
  
    It was a good article.<br>
    <br>
    I concur that system integrity can definitely be violated.&nbsp;&nbsp; I did a
    quick example of an array overflow.&nbsp;&nbsp; (see the code at the end of
    this post)&nbsp; &nbsp; I ran it on a Spartan FPGA and it printed all 12
    characters without a problem.&nbsp;&nbsp; From what I can tell looking at the
    disassembled code, the RISC5 compiler does not add "run time
    checking."&nbsp; <br>
    <br>
    Dave<br>
    <br>
    <div class="moz-cite-prefix">On 5/14/2015 6:00 AM,
      <a class="moz-txt-link-abbreviated" href="mailto:oberon-request@lists.inf.ethz.ch">oberon-request@lists.inf.ethz.ch</a> wrote:<br>
    </div>
    <blockquote cite="mid:mailman.27.1431597605.24712.oberon@lists.inf.ethz.ch" type="cite">
      <pre wrap="">------------------------------

Message: 4
Date: Wed, 13 May 2015 19:47:49 +0200
From: Michael Schierl <a moz-do-not-send="true" class="moz-txt-link-rfc2396E" href="mailto:schierlm@gmx.de">&lt;schierlm@gmx.de&gt;</a>
Subject: Re: [Oberon] FPGA Oberon Article in Xilinx Xcell Journal
        (Issue 91)
To: <a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:oberon@lists.inf.ethz.ch">oberon@lists.inf.ethz.ch</a>
Message-ID: <a moz-do-not-send="true" class="moz-txt-link-rfc2396E" href="mailto:55538E45.5020303@gmx.de">&lt;55538E45.5020303@gmx.de&gt;</a>
Content-Type: text/plain; charset=windows-1252

Am 13.05.2015 um 15:15 schrieb Srinivas Nayak:

</pre>
      <blockquote type="cite" style="color: #000000;">
        <pre wrap=""><span class="moz-txt-citetags">&gt; </span>Good to see the article.
<span class="moz-txt-citetags">&gt; </span>Here is the pdf.
<span class="moz-txt-citetags">&gt; </span><a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="http://www.xilinx.com/publications/archives/xcell/Xcell91.pdf">www.xilinx.com/publications/archives/xcell/Xcell91.pdf</a>
</pre>
      </blockquote>
      <pre wrap="">Quoted from the article:

"In fact, system integrity can be violated only by the use of operations
in the pseudo-module SYSTEM, namely PUT and COPY"


That's wishful thinking... System integrity can easily be violated by
accessing uninitialized variables on the stack (it is left as an
exercise to the reader to abuse this for implementing SYSTEM.PUT for the
RISC processor in pure Oberon without importing the SYSTEM module). And
there is no easy way of fixing this that does not impact performance
(like initializing all variables on the stack), as the Oberon language
neither has a notion of uninitialized variables, nor of "out" parameters.

I think the bug in System.Clear that sometimes overwrites some random
piece of memory due to accessing an uninitialized pointer has not been
fixed yet in the source published on Project Oberon, either.


But apart from that, I like the article, too <span class="moz-smiley-s1" title=":)"><span>:)</span></span>


Regards,


Michael

</pre>
    </blockquote>
    <br>
    <br>
    <small>=================================================================================================<br>
      Source:<br>
      <br>
      (* Overflow.Mod<br>
      *&nbsp;&nbsp;&nbsp; <br>
      *&nbsp;&nbsp;&nbsp; (c) SkuTek Instrumentation<br>
      *&nbsp;&nbsp;&nbsp; D. Hunter<br>
      *&nbsp;&nbsp;&nbsp; This program tests if array bounds checking is done<br>
      *&nbsp;&nbsp;&nbsp; Versions:<br>
      *&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 0.1&nbsp;&nbsp;&nbsp; 05/14/15&nbsp;&nbsp;&nbsp; DH&nbsp;&nbsp;&nbsp; - initial version<br>
      *)<br>
      <br>
      MODULE* Overflow;&nbsp;&nbsp;&nbsp; (* embedded module *)<br>
      &nbsp;&nbsp;&nbsp; IMPORT SYSTEM;<br>
      &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; CONST<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* ASCII characters *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LF = 0AX;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CR = 0DX;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* CR / LF characters *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SPC = 20X;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* space character *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PRMPT = 23X;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* prompt character = # *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DOT = 2EX;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* period or decimal point *)<br>
      <br>
      &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* I/O addresses at top of memory map, <br>
      &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; NOTE: the values need to be negative to generate the
      correct instructions *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; UDATA = -56;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* UART data *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; USTAT = -52;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* UART status *)<br>
      <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* UART status flags *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; RXF = 0;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* receive ready flag is in bit 0
      *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TXF = 1;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* transmit ready flag is in bit 1
      *)<br>
      <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* test parameters *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SIZE = 10;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* array size *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; STOP = 12;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* stop index *)<br>
      <br>
      <br>
      &nbsp;&nbsp;&nbsp; VAR<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i : INTEGER;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; test: ARRAY SIZE OF CHAR;<br>
      &nbsp;&nbsp;&nbsp; (* ========================================= *)<br>
      &nbsp;&nbsp;&nbsp; (* UART transmit procedures *)<br>
      &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; (* send a character to the UART <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; NOTE: the extra time converting to a set helps slow down<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; the polling, which is desired with such a fast processor
      *)<br>
      &nbsp;&nbsp;&nbsp; PROCEDURE PutChar(c: CHAR);&nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; VAR <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s: SET;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* status bit field *)&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; stat: INTEGER;&nbsp;&nbsp;&nbsp; (* integer status *)<br>
      &nbsp;&nbsp;&nbsp; BEGIN<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; REPEAT&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* wait for a transmitter ready
      *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SYSTEM.GET(USTAT,stat);&nbsp;&nbsp;&nbsp; (* get UART status *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s := SYSTEM.VAL(SET,stat)&nbsp;&nbsp;&nbsp; (* convert to set *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; UNTIL (TXF IN s);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* loop until transmit ready is
      set *)&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SYSTEM.PUT(UDATA,ORD(c))&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* send character *)<br>
      &nbsp;&nbsp;&nbsp; END PutChar;<br>
      <br>
      &nbsp;&nbsp;&nbsp; (* ========================================= *)<br>
      &nbsp;&nbsp;&nbsp; (* send a CR/LF to the UART *)<br>
      &nbsp;&nbsp;&nbsp; PROCEDURE WriteLn;&nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; BEGIN<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PutChar(CR);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PutChar(LF)<br>
      &nbsp;&nbsp;&nbsp; END WriteLn;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
      <br>
      &nbsp;&nbsp;&nbsp; (* main program *)<br>
      <br>
      &nbsp;&nbsp;&nbsp; BEGIN<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; REPEAT<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LED(0);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PutChar(PRMPT); PutChar(SPC); <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FOR i := 0 TO STOP DO;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; test[i] := CHR(41H + i);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (* store character
      into the array *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PutChar(test[i])&nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; END;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PutChar(DOT); WriteLn;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LED(2);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FOR i := 0 TO 100000 DO;&nbsp;&nbsp;&nbsp; (* pause *)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; END;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; UNTIL FALSE;<br>
      <br>
      END Overflow.<br>
      <br>
=================================================================================================<br>
      Compiled code with Oberon module added:<br>
      <br>
      ORTool 29.10.2014<br>
      decode Overflow.rsc<br>
      Overflow E9D4E4B5&nbsp;&nbsp; 0&nbsp;&nbsp; 340<br>
      imports:<br>
      type descriptors<br>
      <br>
      data&nbsp;&nbsp;&nbsp; 16<br>
      strings<br>
      <br>
      code<br>
      &nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; &nbsp;E7000021&nbsp;&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ; branch start<br>
      &nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; &nbsp;00000000&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp; R0<br>
      &nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; &nbsp;00000000&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp; R0<br>
      &nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp; &nbsp;00000000&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp; R0<br>
      &nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; &nbsp;00000000&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp; R0<br>
      &nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp; &nbsp;00000000&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp; R0<br>
      &nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp; &nbsp;00000000&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp; R0<br>
      &nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp; &nbsp;00000000&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp; R0<br>
      &nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp; &nbsp;4EE90010&nbsp;&nbsp;&nbsp; SUB SP SP&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PROCEDURE
      PutChar(c);&nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp; &nbsp;AFE00000&nbsp;&nbsp;&nbsp; STR&nbsp; LNK SP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BEGIN<br>
      &nbsp; 10&nbsp;&nbsp;&nbsp; &nbsp;A0E00004&nbsp;&nbsp;&nbsp; STR&nbsp;&nbsp; R0 SP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [ save c
      on stack ]<br>
      &nbsp; 11&nbsp;&nbsp;&nbsp; &nbsp;5000FFCC&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp; -52&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; REPEAT<br>
      &nbsp; 12&nbsp;&nbsp;&nbsp; &nbsp;80000000&nbsp;&nbsp;&nbsp; LDR&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
      SYSTEM.GET(USTAT,stat);<br>
      &nbsp; 13&nbsp;&nbsp;&nbsp; &nbsp;A0E0000C&nbsp;&nbsp;&nbsp; STR&nbsp;&nbsp; R0 SP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
      &nbsp; 14&nbsp;&nbsp;&nbsp; &nbsp;80E0000C&nbsp;&nbsp;&nbsp; LDR&nbsp; R0 SP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12<br>
      &nbsp; 15&nbsp;&nbsp;&nbsp; &nbsp;A0E00008&nbsp;&nbsp;&nbsp; STR&nbsp;&nbsp; R0 SP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s :=
      SYSTEM.VAL(SET, stat)<br>
      &nbsp; 16&nbsp;&nbsp;&nbsp; &nbsp;80E00008&nbsp;&nbsp;&nbsp; LDR&nbsp; R0 SP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
      &nbsp; 17&nbsp;&nbsp;&nbsp; &nbsp;40030002&nbsp;&nbsp;&nbsp; ROR&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br>
      &nbsp; 18&nbsp;&nbsp;&nbsp; &nbsp;E8FFFFF8&nbsp;&nbsp;&nbsp; BPL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -8&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; UNTIL (TXF
      in s);<br>
      &nbsp; 19&nbsp;&nbsp;&nbsp; &nbsp;90E00004&nbsp;&nbsp;&nbsp; LDR&nbsp; R0 SP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4<br>
      &nbsp; 20&nbsp;&nbsp;&nbsp; &nbsp;5100FFC8&nbsp;&nbsp;&nbsp; MOV&nbsp; R1&nbsp; R0&nbsp;&nbsp;&nbsp; -56<br>
      &nbsp; 21&nbsp;&nbsp;&nbsp; &nbsp;A0100000&nbsp;&nbsp;&nbsp; STR&nbsp;&nbsp; R0&nbsp; R1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
      SYSTEM.PUT(UDATA,ORD(c))<br>
      &nbsp; 22&nbsp;&nbsp;&nbsp; &nbsp;8FE00000&nbsp;&nbsp;&nbsp; LDR LNK SP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>
      &nbsp; 23&nbsp;&nbsp;&nbsp; &nbsp;4EE80010&nbsp;&nbsp;&nbsp; ADD SP SP&nbsp;&nbsp;&nbsp;&nbsp; 16<br>
      &nbsp; 24&nbsp;&nbsp;&nbsp; &nbsp;C700000F&nbsp;&nbsp;&nbsp; B LNK&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; END PutChar;<br>
      &nbsp; 25&nbsp;&nbsp;&nbsp; &nbsp;4EE90004&nbsp;&nbsp;&nbsp; SUB SP SP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PROCEDURE WriteLn;<br>
      &nbsp; 26&nbsp;&nbsp;&nbsp; &nbsp;AFE00000&nbsp;&nbsp;&nbsp; STR&nbsp; LNK SP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BEGIN<br>
      &nbsp; 27&nbsp;&nbsp;&nbsp; &nbsp;4000000D&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp; 13<br>
      &nbsp; 28&nbsp;&nbsp;&nbsp; &nbsp;F7FFFFEB&nbsp;&nbsp;&nbsp; BL&nbsp;&nbsp;&nbsp;&nbsp; -21&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PutChar(CR);<br>
      &nbsp; 29&nbsp;&nbsp;&nbsp; &nbsp;4000000A&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp; 10<br>
      &nbsp; 30&nbsp;&nbsp;&nbsp; &nbsp;F7FFFFE9&nbsp;&nbsp;&nbsp; BL&nbsp;&nbsp;&nbsp;&nbsp; -23&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PutChar(LF);<br>
      &nbsp; 31&nbsp;&nbsp;&nbsp; &nbsp;8FE00000&nbsp;&nbsp;&nbsp; LDR LNK SP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; <br>
      &nbsp; 32&nbsp;&nbsp;&nbsp; &nbsp;4EE80004&nbsp;&nbsp;&nbsp; ADD SP SP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4<br>
      &nbsp; 33&nbsp;&nbsp;&nbsp; &nbsp;C700000F&nbsp;&nbsp;&nbsp; B LNK&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; END WriteLn;<br>
      &nbsp; 34&nbsp;&nbsp;&nbsp; &nbsp;4D000010&nbsp;&nbsp;&nbsp; MOV SB&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Entry:&nbsp;&nbsp;&nbsp; set SB =
      16<br>
      &nbsp; 35&nbsp;&nbsp;&nbsp; &nbsp;4E008000&nbsp;&nbsp;&nbsp; MOV SP&nbsp; R0 -32768&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; set SP =
      8000H<br>
      &nbsp; 36&nbsp;&nbsp;&nbsp; &nbsp;40000000&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BEGIN REPEAT<br>
      &nbsp; 37&nbsp;&nbsp;&nbsp; &nbsp;5100FFC4&nbsp;&nbsp;&nbsp; MOV&nbsp; R1&nbsp; R0&nbsp;&nbsp;&nbsp; -60<br>
      &nbsp; 38&nbsp;&nbsp;&nbsp; &nbsp;A0100000&nbsp;&nbsp;&nbsp; STR&nbsp;&nbsp; R0&nbsp; R1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LED(0);<br>
      &nbsp; 39&nbsp;&nbsp;&nbsp; &nbsp;40000023&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp; 35<br>
      &nbsp; 40&nbsp;&nbsp;&nbsp; &nbsp;F7FFFFDF&nbsp;&nbsp;&nbsp; BL&nbsp;&nbsp;&nbsp;&nbsp; -33&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
      PutChar(PRMPT);<br>
      &nbsp; 41&nbsp;&nbsp;&nbsp; &nbsp;40000020&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp; 32<br>
      &nbsp; 42&nbsp;&nbsp;&nbsp; &nbsp;F7FFFFDD&nbsp;&nbsp;&nbsp; BL&nbsp;&nbsp;&nbsp;&nbsp; -35&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
      PutChar(SPC);<br>
      &nbsp; 43&nbsp;&nbsp;&nbsp; &nbsp;40000000&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FOR i := 0
      TO STOP DO;<br>
      &nbsp; 44&nbsp;&nbsp;&nbsp; &nbsp;4109000C&nbsp;&nbsp;&nbsp; SUB&nbsp; R1&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp; 12<br>
      &nbsp; 45&nbsp;&nbsp;&nbsp; &nbsp;EE00000E&nbsp;&nbsp;&nbsp; BGT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14<br>
      &nbsp; 46&nbsp;&nbsp;&nbsp; &nbsp;A0D00000&nbsp;&nbsp;&nbsp; STR&nbsp;&nbsp; R0 SB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>
      &nbsp; 47&nbsp;&nbsp;&nbsp; &nbsp;80D00000&nbsp;&nbsp;&nbsp; LDR&nbsp; R0 SB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>
      &nbsp; 48&nbsp;&nbsp;&nbsp; &nbsp;00D80000&nbsp;&nbsp;&nbsp; ADD&nbsp; R0 SB&nbsp; R0<br>
      &nbsp; 49&nbsp;&nbsp;&nbsp; &nbsp;41000041&nbsp;&nbsp;&nbsp; MOV&nbsp; R1&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp; 65&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
      &nbsp; 50&nbsp;&nbsp;&nbsp; &nbsp;82D00000&nbsp;&nbsp;&nbsp; LDR&nbsp; R2 SB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>
      &nbsp; 51&nbsp;&nbsp;&nbsp; &nbsp;01180002&nbsp;&nbsp;&nbsp; ADD&nbsp; R1&nbsp; R1&nbsp; R2<br>
      &nbsp; 52&nbsp;&nbsp;&nbsp; &nbsp;B1000004&nbsp;&nbsp;&nbsp; STR&nbsp;&nbsp; R1&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; test[i]
      := CHR(41H + 1);<br>
      &nbsp; 53&nbsp;&nbsp;&nbsp; &nbsp;80D00000&nbsp;&nbsp;&nbsp; LDR&nbsp; R0 SB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>
      &nbsp; 54&nbsp;&nbsp;&nbsp; &nbsp;00D80000&nbsp;&nbsp;&nbsp; ADD&nbsp; R0 SB&nbsp; R0<br>
      &nbsp; 55&nbsp;&nbsp;&nbsp; &nbsp;90000004&nbsp;&nbsp;&nbsp; LDR&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; <br>
      &nbsp; 56&nbsp;&nbsp;&nbsp; &nbsp;F7FFFFCF&nbsp;&nbsp;&nbsp; BL&nbsp;&nbsp;&nbsp;&nbsp; -49&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
      PutChar(test[i]);<br>
      &nbsp; 57&nbsp;&nbsp;&nbsp; &nbsp;80D00000&nbsp;&nbsp;&nbsp; LDR&nbsp; R0 SB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>
      &nbsp; 58&nbsp;&nbsp;&nbsp; &nbsp;40080001&nbsp;&nbsp;&nbsp; ADD&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br>
      &nbsp; 59&nbsp;&nbsp;&nbsp; &nbsp;E7FFFFF0&nbsp;&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp; -16&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; END;<br>
      &nbsp; 60&nbsp;&nbsp;&nbsp; &nbsp;4000002E&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp; 46<br>
      &nbsp; 61&nbsp;&nbsp;&nbsp; &nbsp;F7FFFFCA&nbsp;&nbsp;&nbsp; BL&nbsp;&nbsp;&nbsp;&nbsp; -54&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
      PutChar(DOT);<br>
      &nbsp; 62&nbsp;&nbsp;&nbsp; &nbsp;F7FFFFDA&nbsp;&nbsp;&nbsp; BL&nbsp;&nbsp;&nbsp;&nbsp; -38&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WriteLn;<br>
      &nbsp; 63&nbsp;&nbsp;&nbsp; &nbsp;40000002&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br>
      &nbsp; 64&nbsp;&nbsp;&nbsp; &nbsp;5100FFC4&nbsp;&nbsp;&nbsp; MOV&nbsp; R1&nbsp; R0&nbsp;&nbsp;&nbsp; -60<br>
      &nbsp; 65&nbsp;&nbsp;&nbsp; &nbsp;A0100000&nbsp;&nbsp;&nbsp; STR&nbsp;&nbsp; R0&nbsp; R1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LED(2);<br>
      &nbsp; 66&nbsp;&nbsp;&nbsp; &nbsp;40000000&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FOR i := 0
      TO 100000 DO;<br>
      &nbsp; 67&nbsp;&nbsp;&nbsp; &nbsp;61000001&nbsp;&nbsp;&nbsp; MOV'&nbsp; R1&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br>
      &nbsp; 68&nbsp;&nbsp;&nbsp; &nbsp;411686A0&nbsp;&nbsp;&nbsp; IOR&nbsp; R1&nbsp; R1 -31072<br>
      &nbsp; 69&nbsp;&nbsp;&nbsp; &nbsp;01090001&nbsp;&nbsp;&nbsp; SUB&nbsp; R1&nbsp; R0&nbsp; R1<br>
      &nbsp; 70&nbsp;&nbsp;&nbsp; &nbsp;EE000004&nbsp;&nbsp;&nbsp; BGT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4<br>
      &nbsp; 71&nbsp;&nbsp;&nbsp; &nbsp;A0D00000&nbsp;&nbsp;&nbsp; STR&nbsp;&nbsp; R0 SB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>
      &nbsp; 72&nbsp;&nbsp;&nbsp; &nbsp;80D00000&nbsp;&nbsp;&nbsp; LDR&nbsp; R0 SB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>
      &nbsp; 73&nbsp;&nbsp;&nbsp; &nbsp;40080001&nbsp;&nbsp;&nbsp; ADD&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br>
      &nbsp; 74&nbsp;&nbsp;&nbsp; &nbsp;E7FFFFF8&nbsp;&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -8&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; END;<br>
      &nbsp; 75&nbsp;&nbsp;&nbsp; &nbsp;E7FFFFD8&nbsp;&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp; -40&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; UNTIL FALSE;<br>
      &nbsp; 76&nbsp;&nbsp;&nbsp; &nbsp;40000000&nbsp;&nbsp;&nbsp; MOV&nbsp; R0&nbsp; R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>
      &nbsp; 77&nbsp;&nbsp;&nbsp; &nbsp;C7000000&nbsp;&nbsp;&nbsp; B&nbsp; R0&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Branch to 00000H
      [never executed]</small><br>
  
<br><br>
<hr style="border:none; color:#909090; background-color:#B0B0B0; height: 1px; width: 99%;">
<table style="border-collapse:collapse;border:none;">
        <tbody><tr>
                <td style="border:none;padding:0px 15px 0px 8px">
                        <a href="http://www.avast.com/">
                                <img border="0" src="http://static.avast.com/emails/avast-mail-stamp.png">
                        </a>
                </td>
                <td>
                        <p style="color:#3d4d5a; font-family:&quot;Calibri&quot;,&quot;Verdana&quot;,&quot;Arial&quot;,&quot;Helvetica&quot;; font-size:12pt;">
                                This email has been checked for viruses by Avast antivirus software.
                                <br><a href="http://www.avast.com/">www.avast.com</a>
                        </p>
                </td>
        </tr>
</tbody></table>
<br>


</div></blockquote><blockquote type="cite"><div><span>--</span><br><span><a href="mailto:Oberon@lists.inf.ethz.ch">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems</span><br><span><a href="https://lists.inf.ethz.ch/mailman/listinfo/oberon">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a></span><br></div></blockquote></body></html>