<html><head></head><body><div style="color:#000; background-color:#fff; font-family:Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:13px"><div id="yiv9134721548"><div id="yui_3_16_0_ym19_1_1491581101272_28228"><div style="color:#000;background-color:#fff;font-family:Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:13px;" id="yui_3_16_0_ym19_1_1491581101272_28227"><div id="yiv9134721548"><div id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_25797"><div style="color:#000;background-color:#fff;font-family:Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:13px;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_25796" dir="ltr"><h1 id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23713"><pre style="font-size:13px;font-weight:normal;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23977">Alternatively, you can implement an allocation procedure that accepts a 'size' argument as follows:</pre><pre style="font-size:13px;font-weight:normal;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23977"><br></pre><pre style="font-size:13px;font-weight:normal;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23977">PROCEDURE New*(VAR ptr: LONGINT; size: LONGINT);</pre><pre style="font-size:13px;font-weight:normal;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23977"><br></pre><pre style="font-size:13px;font-weight:normal;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23977">1. Create a type descriptor 'td', persist and initialize it (e.g., td.size := size..)</pre><pre style="font-size:13px;font-weight:normal;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23977"><br></pre><pre style="font-size:13px;font-weight:normal;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23977">2. Set tag := ADR(td)</pre><pre style="font-size:13px;font-weight:normal;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23977"><br></pre><pre style="font-size:13px;font-weight:normal;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23977">3. Call Kernel.New(ptr, tag)</pre><pre style="font-size:13px;font-weight:normal;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23977">  </pre><pre style="text-align:right;font-size:13px;font-weight:normal;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23977"><br></pre></h1><div id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23927"><font face="Courier New" size="2"><span style="font-weight:normal;white-space:pre-wrap;"><br></span></font></div><h1 style="font-family:-webkit-standard;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23713"><b id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23715" style="font-size:13px;"><span style="font-family:'Courier New';white-space:pre-wrap;font-weight:400;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23876">- - - - - - - - - - - - - - - - - - - - - - - - </span></b><br></h1><div id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23714" dir="ltr"><b style="font-family:-webkit-standard;"><br></b></div><div id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23714" dir="ltr"><b style="font-family:-webkit-standard;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23877">Tomas Kral</b><span style="font-family:-webkit-standard;font-size:medium;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23716"> </span><a rel="nofollow" ymailto="mailto:oberon%40lists.inf.ethz.ch?Subject=Re:%20Re%3A%20%5BOberon%5D%20FPGA%20-%20Bitmaps.Mod&In-Reply-To=%3C20170407190023.38783d1b%40raspberrypi%3E" target="_blank" href="mailto:oberon%40lists.inf.ethz.ch?Subject=Re:%20Re%3A%20%5BOberon%5D%20FPGA%20-%20Bitmaps.Mod&In-Reply-To=%3C20170407190023.38783d1b%40raspberrypi%3E" title="[Oberon] FPGA - Bitmaps.Mod" style="font-family:-webkit-standard;background-color:rgb(255, 255, 255);" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23717">thomas.kral at email.cz </a> <i style="font-family:-webkit-standard;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23719">Fri Apr 7 19:00:23 CEST 2017</i></div><hr style="font-family:-webkit-standard;" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23733"><pre id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23734">Hi Joerg, Andreas, All,

Yes I made a mistake, corrected a while ago.

But, how about implementing Bitmaps -> Bitmaps/PictureFrames trough
FileRiders, so the allocation will occur in chunks of 1024 disk
sectors.

This will be on analogy with Texts/Frames and Files.

May be also an ultimate answer to `how to edit a file' (text / bitmap)
that is bigger than the system memory.

But again not sure I am not being silly

Tomas 

On Fri, 7 Apr 2017 18:43:55 +0200
Jörg <<a rel="nofollow" target="_blank" href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23735">joerg.straube at iaeth.ch</a>> wrote:

><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23736"> Hi Tomas
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23737"> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23738"> Kernel.New is really a low level procedure and should not be used. 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23739"> The place where you found it is another low level procedure when a
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23740"> trap is generated.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23741"> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23742"> A challenge with pointer hacking and SYSTEM procedures is that you
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23743"> should know what you are doing. e.g that your code compiled is a nice
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23744"> example to show that pointer hacking is dangerous. You didn’t use
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23745"> SYSTEM.ADR(b.size), so your code will not work although it compiled.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23746"> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23747"> If you want to take the „Dpt“ parameter into account, you should
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23748"> adopt the size calculation.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23749"> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23750"> Jörg
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23751"> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23752"> > Am 07.04.2017 um 16:01 schrieb Tomas Kral <<a rel="nofollow" target="_blank" href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23753">thomas.kral at email.cz</a>>:
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23754"> > 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23755"> > Hi Joerg,
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23756"> > 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23757"> > Having also another thought of Bitmaps implementation.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23758"> > Since a bitmap might have some file disk representation in the end,
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23759"> > I am thinking to have it implemented similarly as Texts(Viewers),
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23760"> > where 1024 byte disk sectors `Files.Mod' are mapped through linked
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23761"> > list text descriptors. So in theory only one sector can be
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23762"> > displayed through a viewer at a time.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23763"> > 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23764"> > When I quickly look at PO.V5 source, Kernel.New is used exactly
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23765"> > once.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23766"> > 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23767"> > <a rel="nofollow" target="_blank" href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23768">pi at raspberrypi</a> /usr/src/oberon/PO.V5.1 $ grep Kernel.New *.Mod.txt
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23769"> > System.Mod.txt:    IF w = 0 THEN Kernel.New(a, b)
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23770"> > 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23771"> > So I do not feel easy breaking this rule, making it a precedence for
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23772"> > more frequent use.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23773"> > 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23774"> > On the analogy, I could have Bitmaps -> BitmapDescr(PictureDescr) ->
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23775"> > PictureFrames
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23776"> > 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23777"> > I am not at all sure if it is a good idea?
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23778"> > 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23779"> > Tomas  
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23780"> > 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23781"> > On Fri, 7 Apr 2017 14:10:31 +0200
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23782"> > Jörg <<a rel="nofollow" target="_blank" href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23783">joerg.straube at iaeth.ch</a>> wrote:
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23784"> > 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23785"> >> No.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23786"> >> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23787"> >> The first parameter is declared VAR, so the address of "b.base" is
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23788"> >> handed over. The second parameter shall be a pointer to a type tag.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23789"> >> The size of a type is stored at offset 0 of the type tag.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23790"> >> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23791"> >> Kernel.New expects the parameter "tag" to be a pointer to type tag.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23792"> >> SYSTEM.ADR(b.size) is interpreted as a pointer to a type tag.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23793"> >> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23794"> >> The code I was providing is not something a beginner in Oberon
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23795"> >> should use! 1) It's dirty pointer hacking, something that normally
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23796"> >> C is famous for :-) 2) it's very low level, as it bases on
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23797"> >> internals of the implementation of the Oberon memory management.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23798"> >> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23799"> >> But there are typos in my code
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23800"> >> - Firstly, you have to IMPORT SYSTEM as well.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23801"> >> - Secondly, we have to compare "b.base" to 0 iso NIL, as "b.base"
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23802"> >> is not a pointer.
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23803"> >> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23804"> >> br
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23805"> >> Jörg
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23806"> >> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23807"> >> -----Original Message-----
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23808"> >> From: Oberon [mailto:<a rel="nofollow" target="_blank" href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23809">oberon-bounces at lists.inf.ethz.ch</a>] On Behalf Of
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23810"> >> Tomas Kral Sent: Freitag, 7. April 2017 12:55
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23811"> >> To: <a rel="nofollow" target="_blank" href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23812">oberon at lists.inf.ethz.ch</a>
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23813"> >> Subject: Re: [Oberon] Fw: FPGA - Bitmaps.Mod
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23814"> >> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23815"> >> Hi Joerg,
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23816"> >> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23817"> >> Should it not be coded rather like this?
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23818"> >> Kernel.New(SYSTEM.ADR(b.base), b.size);
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23819"> >> 
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23820"> >> On Fri, 7 Apr 2017 11:43:45 +0200
</i>><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23821"> >> Jörg <<a rel="nofollow" target="_blank" href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23822">joerg.straube at iaeth.ch</a>> wrote:
</i></pre><div dir="ltr" id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23823"><i id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23824"><br id="yiv9134721548yui_3_16_0_ym19_1_1491581101272_23825"></i></div></div></div></div></div></div></div></div></body></html>