home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / misc / tornado / tndemo1 / _Kernel next >
Text File  |  1996-01-09  |  18KB  |  436 lines

  1. Tornado kernel
  2. -=-=-=-=-=-=-=
  3.  
  4. This is cursory documentation covering the tornado kernel v0.10 (29-12-1995).
  5.  
  6. The Tornado kernel extends the RISC-OS kernel by providing:
  7.  * Management of tornado code
  8.     - Its own service call handler
  9.     - Its own vector handler
  10.     - Function and procedure calls to interface with RISC-OS
  11.     - Tornado_Register
  12.     - Tornado_Function
  13.  * Extended memory and heap management facilites
  14.     - Tornado_Initheap
  15.     - Tornado_Getblk
  16.     - Tornado_Freeblk
  17.     - Tornado_Extblk
  18.     - Tornado_HeapInfo
  19.     - Tornado_ExtHeap
  20.     - Tornado_Getaddr
  21.     - Tornado_GarbageHeap
  22.  * Extended sprite (bitmap) facilities
  23.     - Tornado_SpriteOp (#001)
  24.  * Miscellaneous extensions
  25.     - Tornado_Hourglass (#002)
  26.  
  27.    ... and general control of TShell and TLib running under the kernel.
  28.  
  29. The tornado kernel is loaded in as a RISC-OS module, and during initiation
  30. claims workspace:
  31.  +00: reserved
  32.  +04: Tornado version * 100
  33.  +08: RISC-OS kernel version * 100
  34.  +12: handle of list of clients
  35.  +16: handle of function vector list
  36.  +256: start of tornado shared system heap
  37.  
  38. The only facilities at present contained within the kernel are the heap
  39. management SWIs. All other facilties are vectored out of the kernel into
  40. subsiduary modules which link themselves into tornado during initiation.
  41.  
  42. *Note* that tornado extension modules do NOT usually participate in RISC-OS
  43. operations unless it is through the tornado kernel. In other words, they do
  44. not provide their own SWIs, listen in on RISC-OS service calls etc - however,
  45. they can, will and do use RISC-OS facilities as vectoring these through the
  46. tornado kernel (which would only pass them onto RISC-OS anyway) is
  47. resource-wasteful.
  48.  
  49. You will notice tornado has undergone quite a change since you previously
  50. heard from me last summer (1995). It has been hacked down into a much more
  51. modular form, made much more streamlined and flexible. I am not a great
  52. believer in monolithic operating systems, and tornado I felt was becoming a
  53. little monolithic in nature. Thus, I broke the hourglass handling routines
  54. etc into seperate modules which now register their presence with tornado when
  55. they load in.
  56.  
  57. These docs aren't hugely detailed. Below is simply a list of SWIs, data
  58. structures and various other bits and pieces currently defined.
  59.  
  60.  Niall Douglas.
  61.  5th January 1996.
  62.  
  63.  
  64.  
  65.  
  66.  
  67. The current format of tornado extended heaps:
  68.    +00:&70616548 = "Heap", like with OS_Heap    |
  69.    +04:Offset to free list            | Note this is the standard
  70.    +08:Offset to heap base            | OS_Heap header
  71.    +12:Offset to heap end            |
  72.    +16:&20 = the Heap+ identifier - also to OS_Heap indicates a block length
  73.    +20:offset within heap to the list of non-relocatable blocks
  74.       +0: length of list in bytes (beginning=0)
  75.       +4: offset within heap to an allocated block descriptor
  76.    +24:offset within heap to the list of relocatable blocks
  77.       +0: length of list in bytes (beginning=0)
  78.       +4: offset within heap to an allocated block descriptor
  79.           This is negative if block is locked
  80.    +28:flags
  81.       bit 0: this heap is auto-extending using Wimp_SlotSize
  82.       bit 1: this heap is auto-extending using OS_Module
  83.       bit 2: this heap is auto-extending using Tornado_Extblk
  84.       bit 30:this heap is auto-extending as the Tornado system heap
  85.       bit 31:disable garbage collection if bit 30 set (ie; is negative)
  86.    +32: base of heap+ heap containing this heap+ heap if bit 2 of +28 is set
  87.         MUST be physical address OR special address eg; 0,1,-1,-2,-3 etc
  88.    +36: block within above heap that holds this heap
  89.    +40: Reserved for future use
  90.  
  91. Also, the format of each allocated blk:
  92.  ___
  93. /    -36: Filetype of file
  94. |    -32: First block of file
  95. |    -28: Total length of file contained in these blocks (higher word)
  96. |    -24: Total length of file contained in these blocks (lower word)
  97. |    -20: reloc ptr of linked block before this one (=0 if first)
  98. |    -16: reloc ptr of linked block after this one (=0 if last)
  99. |    -12: normally nothing before this, but when the block is one of a
  100. |         linked list (denoted by bit 29 in the flags) then this word is the
  101. |         fragment length of the block (max len this block can be before it
  102. \___      spawns another block)
  103.  /|\
  104.   |
  105. **  Note this may be replaced with a far simple approach later  **
  106.  
  107.    -08: Flags
  108.         bit 30: clear=nonreloc, set=reloc
  109.         bit 29: set means this block is one of a linked list
  110.    -04: length of data (not including this header). Negative if the data is
  111.         on disc and not in memory.
  112.    +00: start of data if data is in memory, or end of block if data is on
  113.         disc. Blocks are stored in the format (for example)
  114.         "<Tornado$MemoryCache>.F.F.F.F.F.F.F.F" for block -1.
  115.  
  116.  
  117.  
  118.  
  119. Tornado_Register                    (SWI &78000)
  120. On entry:
  121.    R0=flags
  122.       bit 0: clear to register, set to deregister
  123.    R1=addr of module name (same as RO)
  124.    R2=ptr to entry vectors
  125. On exit:
  126.    R0=corrupted
  127.    R1=ptr to heap base
  128.    All registers preserved
  129. Interrupts: IRQ's enabled
  130. Processor mode: SVC
  131. Re-entrancy: Full
  132. Use:
  133.    Used to register an extension module with the tornado kernel. The entry
  134. vectors is in the following format:
  135.  +00: B initialise
  136.  +04: B finalise
  137.  +08: B service
  138.    The initialise and finalise entries should be seperate from your module's
  139. initialise and finalise entries in that tornado may call your module through
  140. finalise then initialise to restart your module should it get into
  141. difficulties. Your module's initialise and finalise entries should merely
  142. register and deregister itself using this SWI.
  143.  
  144. Tornado_Function                    (SWI &78001)
  145. On entry:
  146.    R0=flags
  147. On exit:
  148.    All registers preserved
  149. Interrupts: IRQ's enabled
  150. Processor mode: SVC
  151. Re-entrancy: Full
  152. Use:
  153.  
  154. Tornado_Initheap                    (SWI &) On entry:
  155.    R0=flags
  156.       bit 0: This heap is a Wimp postslot heap
  157.       bit 1: This heap is a heap within an OS_Module block in RMA
  158.       bit 2: This heap is a heap within a Heap+ block
  159.       bit 30: This heap being initialised is the proposed Tornado system heap
  160.    R1=ptr to proposed heap base
  161.    R2=ptr to addr of heap base if bit 2 set
  162.    R3=length of proposed heap (must be >1024 bytes)
  163.    R4=handle of block within heap pointed to by R1 if bit 2 set
  164. On exit:
  165.    R0=corrupted
  166.    R1=ptr to heap base
  167.    All registers preserved
  168. Interrupts: IRQ's enabled
  169. Processor mode: SVC
  170. Re-entrancy: Full
  171. Use:
  172.    Used to initialise a Tornado Heap+ type heap. This heap format is based on
  173. OS_Heap style heaps, and offers complete internal format compatibility with
  174. OS_Heap style heaps, and thus relies on the current structure of OS_Heap
  175. heaps. It will complain if OS_Heap uses a format it does not know about.
  176.    The area of memory you intend to initialise will be verified, and header
  177. and other information written into it. Note minimum size is 1024 bytes, and
  178. the base must begin on a word-aligned address. The length must be a multiple
  179. of 4 bytes.
  180.    Note that if bit 0 is set then the task's wimpslot is automatically
  181. extended by an appropriate amount and the heap set up at the previous
  182. environment end address which should be passed in R1 on entry. From now on,
  183. any extensions to the heap needed will be done automatically, extending the
  184. wimpslot as necessary. Bit 1 will extend it using OS_Module; bit 2 will
  185. extend it using Tornado_Extblk, which may cause a cascade extension down
  186. through blocks in heaps below the heap being extended.
  187.    Note also that the heap+ structure itself is relocatable - this means all
  188. heap+ heaps can also be stored in a Heap+ or otherwise relocatable block.
  189.  
  190. Tornado_Getblk                        (SWI &)
  191. On entry:
  192.    R0=flags
  193.       bit 0: this block is relocatable
  194.       bit 1: Don't return address of block in R2
  195.       bit 2: don't do a garbage collection after this call
  196.       bit 29:(internal) this is the subtask heap
  197.       bit 30:(internal) this is the system heap
  198.    R1=heap+ ptr, 0 if system heap, 1 if subtask heap
  199.       -1,-2 refers to task heaps (NOT IMPLEMENTED YET!)
  200.    R3=size of block wanted
  201.    Other registers not used as yet
  202. On exit:
  203.    R0=corrupted
  204.    R1=updated heap+ ptr if R1<>magic heap no on entry
  205.    R2=addr of block, otherwise preserved if bit 1 is set
  206.    R3=handle of block
  207.    All other registers preserved
  208. Interrupts: IRQ's enabled
  209. Processor mode: SVC
  210. Re-entrancy: Full
  211. Use:
  212.    Used to claim a block from a Heap+ heap. As in other tornado heap calls,
  213. R1 may either point to an actual heap, or may be a 'magic' heap number. These
  214. are currently defined as:
  215.   0: Tornado shared system heap (stored in RMA)
  216.   1: Tornado subtask shared heap (undefined location currently)
  217.  -1: Private heap of first tornado task
  218.  -2: Private heap of second tornado task
  219.  -3: etc
  220.    If you ask for a relocatable block (by setting bit 0), which is _strongly_
  221. recommended, then you will be given a handle which from hence you can use to
  222. reference the block by. It will always be a negative number, and any data
  223. contained within the block must be able to be relocated at arbitrary times.
  224. You will not know if/when/how/why the block has been moved. To get the
  225. _current_ address of the block, use Tornado_Getaddr. Read its entry for
  226. further details of use. You are guaranteed that your block will NOT move
  227. between calls concerning your heap to tornado, except for shared heaps which
  228. may be accessed by another party without your knowledge. Thus, you should
  229. take measures to prevent your block moving while you use it.
  230.    If you ask for a non-relocatable block, the handle will be equal to the
  231. start of the block. However, it is good programming practice to also call
  232. Tornado_Getaddr for this handle, just to be sure you are getting the address
  233. of the block (also makes sure if you change it later you won't have to change
  234. too much of your code).
  235.    Unless you specifically ask otherwise, an automatic garbage collection
  236. will be performed after this call, unless it has been disabled (only for
  237. system heap). Also, for your convenience the current position of the block is
  238. returned in R2.
  239.    Note that if you have specified auto-extending in Tornado_Initheap call,
  240. then this call will only return an error if the entire heap couldn't be
  241. extended, otherwise it's because the heap is full.
  242.    Note also that recursion is possible here: this heap being extended by
  243. this call may cause the heap it's in to extend which may cause the heap it's
  244. in to also extend. Failure of any one of these will return an error from this
  245. command. Also, this command thus may take a while having to garbage and
  246. extend multiple heaps.
  247.  
  248. Tornado_Freeblk                        (SWI &)
  249. On entry:
  250.    R0=flags
  251.       bit 2: don't do a garbage collection after this call
  252.       bit 29:(internal) this is the subtask heap
  253.       bit 30:(internal) this is the system heap
  254.    R1=heap+ ptr, or 'magic' heap no
  255.    R3=handle of block
  256. On exit:
  257.    R0=corrupted
  258.    R1=updated heap+ ptr if R1<>'magic' heap no
  259.    All other registers preserved
  260. Interrupts: IRQ's enabled
  261. Processor mode: SVC
  262. Re-entrancy: Full
  263. Use:
  264.    Used to free a claimed block.
  265.    Unless you specifically ask otherwise, an automatic garbage collection
  266. will be performed after this call, and if auto-extending is set, then the
  267. heap will be automatically shrunk if possible. This, as above, may lead to
  268. all heaps in the tree above to shrink as well. Thus, this command may take a
  269. while having to garbage and shrink multiple heaps.
  270.  
  271. Tornado_Extblk                        (SWI &)
  272. On entry:
  273.    R0=flags
  274.       bit 0: don't bother returning new size
  275.       bit 1: don't bother returning current address
  276.       bit 2: don't do a garbage collection after this call
  277.       bit 29:(internal) this is the subtask heap
  278.       bit 30:(internal) this is the system heap
  279.    R1=heap+ ptr, or 'magic' heap no
  280.    R2=signed change in bytes
  281.    R3=handle of block
  282. On exit:
  283.    R0=corrupted
  284.    R1=updated heap+ ptr if R1<>'magic' heap no
  285.    R2=current addr of block
  286.    R3=new handle of block
  287.    R4=new size of block
  288.    All other registers preserved
  289. Interrupts: IRQ's enabled
  290. Processor mode: SVC
  291. Re-entrancy: Full
  292. Use:
  293.    Used to change the size of a claimed block. Note that the new size of the
  294. block may be larger than you intended, as it is always rounded up to the
  295. nearest word. This is alright: just take care to redo any future resizing
  296. decisions (ie; if storing the size, don't store previous size changed by the
  297. requested size change, store the size returned by R2 instead). This will
  298. prevent bytes 'appearing' on the end of the block that you will never use.
  299.    The new handle for the block will be the same if the block was
  300. relocatable, but note it is good programming practice if you restore the
  301. handle anyway, in case you may later have to alter the relocatable nature of
  302. the data.
  303.    Unless you specifically ask otherwise, an automatic garbage collection
  304. will be performed after this call, and the repercussions are as for
  305. Tornado_Getblk and Tornado_Freeblk.
  306.  
  307. Tornado_HeapInfo                    (SWI &) On entry:
  308.    R0=flags
  309.       bit 29:(internal) this is the subtask heap
  310.       bit 30:(internal) this is the system heap
  311.    R1=heap+ ptr, 0 if system heap, 1 if subtask heap
  312. On exit:
  313.    R0=size of heap
  314.    R1=heap addr, filled in if R1=0,1 on entry
  315.    R2=largest free block in heap
  316.    R3=amount of free space available
  317.    R4=number of relocatable blocks in heap
  318.    R5=number of non-relocatable blocks in heap
  319.    R6=bytes occupied by relocatable blocks
  320.    R7=bytes occupied by non-relocatable blocks
  321.    All other registers preserved
  322. Interrupts: IRQ's enabled
  323. Processor mode: SVC
  324. Re-entrancy: Full
  325. Use:
  326. Used to determine the current state of a heap+ heap.
  327. Related calls:
  328.    All tornado heap calls;
  329.  
  330. Tornado_ExtHeap                        (SWI &)
  331. On entry:
  332.    R0=flags
  333.       bit 29:(internal) this is the subtask heap
  334.       bit 30:(internal) this is the system heap
  335.    R1=heap+ ptr, 0 if system heap, 1 if subtask heap
  336.    R2=signed change in size
  337. On exit:
  338.    R2=new size
  339.    All other registers preserved
  340. Interrupts: IRQ's enabled
  341. Processor mode: SVC
  342. Re-entrancy: Full
  343. Use:
  344. Used to manually change the size of a Heap+ heap. Usually automated. Note
  345. this may cause auto-extending heaps above this to garbage and also change
  346. size.
  347. Related calls:
  348.    All tornado heap calls;
  349.  
  350. Tornado_Getaddr                        (SWI &)
  351. On entry:
  352.    R0=flags
  353.       bit 0: don't cache block
  354.       bit 1: preserve R4 on exit (ie; don't bother calculating it)
  355.       bit 29:(internal) this is the subtask heap
  356.       bit 30:(internal) this is the system heap
  357.    R1=heap+ ptr, 0 if system heap, 1 if subtask heap
  358.    R2=offset within block you wish to access (if block fragmented)
  359.    R3=handle of block
  360.    R4=number of bytes to be made contiguous (-1=full length)
  361. On exit:
  362.    R2=actual address of block (points to offset given by R2)
  363.    R3=reloc handle of block if bit 0 was set on entry; otherwise preserved
  364.    R4=number of bytes from R2 you can access before you must call this SWI
  365.       again (may be to end of block though)
  366.    All other registers preserved
  367. Interrupts: IRQ's enabled
  368. Processor mode: SVC
  369. Re-entrancy: Full
  370. Use:
  371. Used to determine the actual address of a claimed block. If the handle passed
  372. is non-negative, then the same handle is currently returned in R2.
  373.    The offset contained within R2 is the patch of data within the block you
  374. wish to access. This should be given even if the block isn't fragmented, as
  375. the user may have specified that a cap be placed on requests.
  376.    You can work out what memory can be accessed using R3 ie; you won't need
  377. to call this SWI to access as far as this. You can still do anyway, and this
  378. call is quite quick so little difference in speed will be noticed.
  379.    Note you can only access R4 bytes from where you asked for. This is
  380. because only that much data has been loaded within that block.
  381.    Setting bit 0 on entry means that a new reloc block is created of R4
  382. bytes, and one or more fragmented blocks are loaded into it to make it a
  383. contiguous area of data. Make sure that when you're finished with this block
  384. and the data (ie; before calling Tornado_Getaddr again), free the block. Note
  385. finally that setting bit 0 is quite slow in operation, and having blocks
  386. already in memory doesn't matter - they remain in memory - and thus, quite a
  387. lot of memory can be wasted. Use a routine capable of using fixed size data
  388. blocks to manipulate the data if possible.
  389.    This call also resets the time elapsed since last access to this block, or
  390. fragment of a block. This is used for virtual memory, where when the system
  391. heap becomes full the oldest blocks get dumped to disc. Using this call
  392. indicates that you want to use this block. If the block is currently on disc,
  393. it is reloaded into the heap and its address returned to you. Note no garbage
  394. collection occurs when this happens.
  395.    You can be guaranteed that this address will remain the same until the
  396. next specific call to Tornado_<call>, as all the calls done under
  397. interrupts/vectors etc. by Tornado do not garbage collect the heap.
  398.    PLEASE NOTE: When preempting code and referring to the system heap, you
  399. MUST use Tornado_GarbageHeap to force disabling of garbaging. If you do this,
  400. you must be prepared to regularly do a Tornado_GarbageHeap followed with
  401. another Tornado_Getaddr to ensure fragmentation does not become endemic. This
  402. is because other Tornado apps may cause the heap to be garbaged.
  403. Related calls:
  404.    All tornado heap calls;
  405.  
  406. Tornado_GarbageHeap                    (SWI &)
  407. On entry:
  408.    R0=flags
  409.       bit 0:disable auto-garbaging (if R1=0)
  410.       bit 1:reenable auto-garbaging (if R1=0)
  411.       bit 2:do not garbage heap
  412.       bit 29:(internal) this is the subtask heap
  413.       bit 30:(internal) this is the system heap
  414.    R1=heap+ ptr, 0 if system heap, 1 if subtask heap
  415. On exit:
  416.    R1=updated heap+ ptr if R1<>0 on entry
  417.    All other registers preserved
  418. Interrupts: IRQ's enabled
  419. Processor mode: SVC
  420. Re-entrancy: Full
  421. Use:
  422. Used to disable auto-garbaging on the system heap, and to force a garbage
  423. collection.
  424.    If bit 0 is set, garbaging on the system heap is disabled and it is stored
  425. that it was your task which requested it.
  426.    Note that this call may not garbage the heap if someone else has disabled
  427. it (R1=0, system heap). Also, if reenabling garbaging and no-one else has
  428. disabled it, an immediate garbage is done.
  429.    This call with flags %000 is performed after every Tornado_Getblk,
  430. Tornado_Freeblk and Tornado_Extblk. If the system heap isn't being referred
  431. to then there is nothing the task can do to stop auto-garbaging ie; you
  432. cannot disable garbaging on private Heap+ heaps.
  433.    Note again treed auto-extending heaps may have to garbage and change size.
  434. Related calls:
  435.    All tornado heap calls;
  436.