> net#arf:$.a500.RiscOS+.doc.ResourceFS Author: Neil Raine
Status: Draft proposal, not agreed yet
History:
6-Feb-90 0.01 First draft.
20-Feb-90 0.02 Aasm164 included

 22-Feb-90 0.03 Name changed from DeskFS to ResourceFS

Issues (ignore on first reading)


There is work still to be done on getting C modules to include files.

Overview

This document describes the interface to the ResourceFS module, which provides the hooks necessary for modules to include files in the Resources: filing system.

This facility is useful because it allows the resource files associated with a particular module to be included in the same file as the binary image, which helps with release control.

It also has an important application for podule modules, since it allows them to *IconSprites a sprite file which they put into Resources:. This is important as there is no other way to introduce a sprite into the Wimp's free pool other than from a file.

Another application is for certain resource files to be replaced on a selective basis, which is an additional technique to the path mechanism already in use (eg. Wimp$Path can be set up to reference a resource directory).

Directory structure

In order to avoid possible name clashes, it is important that a well-defined directory structure is adhered to by all concerned. This is:

 $.Apps.!<appname> ; the ROM-resident applications
 $.Fonts ; the ROM-resident fonts
 $.Resources.<modulename> ; resources for ADFSFiler etc.
 $.Resources.<appname> ; resources for PrinterDM etc.
 $.ThirdParty.<appname> ; resources for 3rd parties

where <appname> is the name of the application concerned, without the "!" on the front (eg. Draw, Paint, Edit).

The above all indicate directories, which normally contain files called "!Sprites", "Templates", "Messages" and so on.

Where third party software is involved, the actual <appname> used must be registered with Acorn, to avoid clashes.

Software interface

In order to register a group of files with ResourceFS, a module must have the files included in their image, with appopriate header information, and then call SWIs to register and de-register this area as appropriate.

SWI ResourceFS_RegisterFiles

 In: R0 -> area of memory containing files (see below for format)
 This SWI should be called when the module is initialised. 
 ResourceFS will link the file(s) into its structure, and then issue
 a Service_ResourceFSStarted (not to be confused with
 Service_ResourceFSStarting - see below), which tells any programs
 relying on ResourceFS files that the structure has changed. The
 Wimp responds to this service call by looking for its default sprite
 pool again.

SWI ResourceFS_DeregisterFiles

 In: R0 -> area of memory containing files
 This SWI should be called when the area of memory containing the
 files is about to be deallocated (eg. when the module containing
 them is killed).
 Note that it is not necessary to call this SWI on receipt of a
 Service_ResourceFSDying, since the ResourceFS module 'loses' all
 references to ResourceFS files when it dies anyway.

Service_ResourceFSStarting (&60)

 In: R2 -> code address to call
 R3 = workspace pointer for ResourceFS module
 Out: all registers preserved (do not claim the service)
 When the ResourceFS module is reloaded or re-initialised, it issues
 this service call so that modules that provide ResourceFS files can
 put them back into the structure.
 Unfortunately the ResourceFS module is not linked into the module
 chain at this point, so it is not possible to call
 ResourceFS_RegisterFiles. Instead, the application should execute
 the following code:
 STMFD SP!, {R0, LR}
 ADR R0, ResourceFSfiles ; R0 -> ResourceFS file structure
 MOV LR, PC ; LR -> return address
 MOV PC, R2 ; call ResourceFS routine
 LDMFD SP!, {R0, PC}^
 Note that the value of R3 passed in the service call must be given
 to the ResourceFS routine intact, so it can find its workspace.
 This call is subtly different from SWI ResourceFS_RegisterFiles, in
 that it will not cause a Service_ResourceFSStarted to be issued. 
 This is because the ResourceFS module waits until all modules have
 received the Service_ResourceFSStarting before issuing a
 Service_ResourceFSStarted to let the "clients" of Resources: know
 about it.

The format of the (word-aligned) file data is as follows:

 Offset Size Meaning
 ------ ---- -------
 0 4 offset from here to the next file (contiguous),
 or 0 => end of list (no data follows)
 4 4 load address of file )
 8 4 exec address of file ) as returned by OS_File (5)
 12 4 size of file )
 16 4 attributes of file )
 20 n full filename, excluding "$.", terminated by 0
 20+n 0..3 padded with 0s until word-aligned
 4 size of file + 4
 s file data
 0..3 padded with 0s until word-aligned
 followed by more data in the same format
 (last entry must be a single 0 word)

The file data must be contiguous - if this is not possible, then ResourceFS_RegisterFiles should be called once for each of the areas to be used (and an equivalent set of ResourceFS_DeRegisterFiles's later on). Note that each area must be terminated by a single word containing 0.

There are no directory objects, since the directory structure can be determined from the full filenames supplied.

Note that where name clashes occur, the first occurrence of the filename in the most recently registered area will be used.

Constructing the modules

In net#arf:$.a500.Aasm164, you will find two files:

 Aasm
 ObjAsm

which are the C versions of Aasm 1.64 and ObjAsm 1.64 respectively. They require the C shared library (with or without RISC_OSLib extensions) to run.

Version 1.64 has the following additional features:

 BIN "<filename>" ; include binary file in output
 DCD :FLOAD:"<filename>" ; get load address of file
 DCD :FEXEC:"<filename>" ; get exec address of file
 DCD :FSIZE:"<filename>" ; get size (length) of file
 DCD :FATTR:"<filename>" ; get attributes of file

These are used in net#arf:$.a500.Hdr.ResourceFS in a macro called "ResourceFile", which takes two arguments: the name of the file to include, and the name it will have under Resources:. You can put a series of calls to this macro in sequence, followed by " DCD 0" to terminate the list, eg:

 ResourceFSfiles
 ResourceFile Sources.Messages, Resources.MyProg.Messages
 ResourceFile Sources.Templates, Resources.MyProg.Templates
 DCD 0

AltStyle によって変換されたページ (->オリジナル) /