Proposed .Asm change (was: Re: Couple of bugs)

John Tytgat John.Tytgat at aaug.net
Sat Feb 9 16:53:28 GMT 2008


In message <916954264f.christian at venice.lab>
          Christian Ludlam <christian at recoil.org> wrote:

> On 21 Sep Tom Hughes wrote:
> 
> > The problem is that DefMod doesn't have a syntax to fully describe
> > functions and their arguments so it can't spit out a proper prototype
> > and instead the function type in DefMod is just mapped to void * in
> > the C output I think.
> > 
> > A lot of the function points taken by SWIs are not very amenable to
> > being represented as C prototypes anyway I suspect...
> 
> I don't think it would need to describe the prototype fully - currently you
> need to cast your function, but even with an EXPLICIT cast Norcroft gives you
> a "cast between function and non-function types" warning.
> 
> If it was prototyped as "void (*)(void)" then you'd still need the cast, but
> you'd get rid of the warning.
> 
> I did this when I modified DefMod to generate veneers to let me build Zap
> modes in C. The code changed (in cheader.c)
> 
>       case def_TYPE_ASM:
>          if ((rc = fprintf (file, "void %s", v)) < 0)
>             goto finish; /*v != NULL*/
>       break;
> 
> into this:
> 
>       case def_TYPE_ASM:
>          if ((rc = fprintf (file, "void (*%s)(void)", v)) < 0)
>             goto finish; /*v != NULL*/
>       break;
> 
> We'd probably need to go through all the swi files that use .Asm and check
> that they really do mean function pointers, and not just (void *).

I tried out Christian's suggestion but this DefMod source change alone
results in in e.g.:

  __swi (0x19) void (**os_unused_swi)(void) (void (*const *unused_swi_handler)(void));

while originally it was:

  __swi (0x19) void *os_unused_swi (void const *unused_swi_handler);

But this new protype gives rightfully the error "error: 'os_unused_swi'
declared as function returning a function" using the gcc compiler. :-(

My understanding is that the .Asm type actually means "assembler code"
while we want to have it as "pointer to assembler code" so that a 'myfunc'
in a "void myfunc(void);" prototype can be given as one of the parameters
in an OSLib generated routine without any need to cast or compiler
complaining that there is a type mismatch.

So I propose to change the ".Asm" semantics to "pointer to assembler code"
which pratically means:

1) All "Rx -> .Asm: xyz" are changing to "Rx = .Asm: xyz" and all
   ".Ref .Asm: xyz" into ".Asm: xyz".
2) In oslib/Types.h a new typedef is created:
     typedef void (*asm_routine)(void);
   which represents a pointer to an assembler routine, not necessary
   requiring an APCS interface.
3) And generated C prototypes are changing similar like the following
   example:
   
   From:
     extern os_error *xosclaimprocessorvector_alloc (bits vector,
           void const *routine,
           void **old_routine);
     extern void *osclaimprocessorvector_alloc (bits vector,
           void const *routine);

   To:
     extern os_error *xosclaimprocessorvector_alloc (bits vector,
           asm_routine routine,
           asm_routine *old_routine);
     extern asm_routine osclaimprocessorvector_alloc (bits vector,
           asm_routine routine);

Note that this does not mean a binary API change of OSLib, only C headers
are changed by this.

I tried this out and this seems to work as expected (i.e. no longer a
need for casting nor any compiler warnings).  I've included the following
two patches in order to get feedback on this idea:

1) asmtype_change/patch: contains all the changes I made to implement this
   proposal.
   - The above mentioned .Asm changes in the .swi files.
   - Drop the DragAnObject_Function type and change this to ".Asm"
   - Change the type of PDriver_DeclareDriver's 'reason' parameter from
     ".Int" to ".Asm".
   - DefMod:
     - Changed .Asm definition in Manual.htm from "void *" to "asm_routine".
     - Implemented the proposed .Asm semantic change.
   - oslib/Types.h: added asm_routine typedef + suitable explanation.
   - Some unrelated changes:
     - in oslib/Types.h: put all typedefs in namespace OSLib when
       NAMESPACE_OSLIB is defined.
     - DefMod2/Manual.htm: fixed description of what "->" is translated to
       as input parameter (is "CVT(type) const *", not "CVT(type) *").
2) header_asmtype/patch: resulting differences in the generated C and
   assembler header files (ELF headers, the AOF header changes are similar).

Any objections on checking this in ?

John.
-- 
John Tytgat, in his comfy chair at home                                 BASS
John.Tytgat at aaug.net                             ARM powered, RISC OS driven
-------------- next part --------------
Index: Source/Toolbox/oslib/DragAnObject.swi
===================================================================
--- Source/Toolbox/oslib/DragAnObject.swi	(revision 293)
+++ Source/Toolbox/oslib/DragAnObject.swi	(working copy)
@@ -3,8 +3,6 @@
 
 NEEDS OS;
 
-TYPE DragAnObject_Function;
-
 CONST
    DragAnObject_HPosLeft        = .Bits: 0b00,
    DragAnObject_HPosCentre      = .Bits: 0b01,
@@ -27,7 +25,7 @@
    (  NUMBER 0x49C40 "Takes a copy of an object and starts a Wimp drag",
       ENTRY
       (  R0 = .Bits: flags,
-         R1 = DragAnObject_Function: function,
+         R1 = .Asm: function,
          R2 -> OS_RegisterBlock: register_block,
          R3 -> OS_Box: box,
          R4 -> OS_Box: bbox
Index: Source/Core/oslib/Podule.swi
===================================================================
--- Source/Core/oslib/Podule.swi	(revision 293)
+++ Source/Core/oslib/Podule.swi	(working copy)
@@ -115,11 +115,11 @@
          by ADFS to locate an IDE expansion card",
          R2 = .Ref .Data: controller, R3 = .Ref .Int: status_location,
          R4 = .Bits: status_bits, R5 = .Ref .Int: irq_location,
-         R6 = .Bits: irq_bits, R7 -> .Asm: read_code,
-         R8 -> .Asm: write_code), EXIT (R1! = .Bool: unclaimed,
+         R6 = .Bits: irq_bits, R7 = .Asm: read_code,
+         R8 = .Asm: write_code), EXIT (R1! = .Bool: unclaimed,
          R2 = .Ref .Data: controller_out, R3 =.Ref .Int: status_location_out,
          R4 = .Bits: status_bits_out, R5 = .Ref .Int: irq_location_out,
-         R6 = .Bits: irq_bits_out, R7 -> .Asm: read_code_out,
-         R8 -> .Asm: write_code_out)),
+         R6 = .Bits: irq_bits_out, R7 = .Asm: read_code_out,
+         R8 = .Asm: write_code_out)),
    Service_ADFSPoduleIDEDying = (NUMBER 0x30, ENTRY (R1 # 0x10802 "IDE
          expansion card dying"))
Index: Source/Core/oslib/Sound.swi
===================================================================
--- Source/Core/oslib/Sound.swi	(revision 293)
+++ Source/Core/oslib/Sound.swi	(working copy)
@@ -8,8 +8,8 @@
    Sound_LogScaleTable = .Struct ([256] .Byte: log_scale),
    Sound_ChannelHandler =
       .Struct
-      (  .Ref .Asm: fill_code,
-         .Ref .Asm: overrun_fixup_code,
+      (  .Asm: fill_code,
+         .Asm: overrun_fixup_code,
          .Ref Sound_LogTable: log_table,
          .Ref Sound_LogScaleTable: log_scale_table
       ),
@@ -30,7 +30,7 @@
          [7] .Int: reserved,
          [48] .Int: available
       ),
-   Sound_Scheduler = .Struct (.Ref .Asm: scheduler),
+   Sound_Scheduler = .Struct (.Asm: scheduler),
    Sound_VoiceGenerator =
       .Struct
       (  .Int: fill_code,
@@ -108,8 +108,8 @@
 SWI Sound_LinearHandler = (NUMBER 0x40145 "Reads or installs the 16-bit
       linear stereo sound handler",
    ENTRY (R0 = .Bool: install,
-         R1 -> .Asm: new_handler_code, R2 = .Ref Void: new_workspace),
-   EXIT (R1 -> .Asm: old_handler_code, R2 = .Ref Void: old_workspace));
+         R1 = .Asm: new_handler_code, R2 = .Ref Void: new_workspace),
+   EXIT (R1 = .Asm: old_handler_code, R2 = .Ref Void: old_workspace));
 
 CONST Sound_Hz = .Int: 1024 "1Hz in Sound units";
 
Index: Source/Core/oslib/DMA.swi
===================================================================
--- Source/Core/oslib/DMA.swi	(revision 293)
+++ Source/Core/oslib/DMA.swi	(working copy)
@@ -7,11 +7,11 @@
 
 TYPE DMA_Routines =
    .Struct
-   (  .Ref .Asm: enable,
-      .Ref .Asm: disable,
-      .Ref .Asm: start,
-      .Ref .Asm: completed,
-      .Ref .Asm: sync
+   (  .Asm: enable,
+      .Asm: disable,
+      .Asm: start,
+      .Asm: completed,
+      .Asm: sync
    );
 
 TYPE DMA_Scatter = .Struct (.Ref .Data: address, .Int: size),
Index: Source/Core/oslib/Territory.swi
===================================================================
--- Source/Core/oslib/Territory.swi	(revision 293)
+++ Source/Core/oslib/Territory.swi	(working copy)
@@ -68,7 +68,7 @@
    Error_NoTerritory               = .Bits: &192;
 
 TYPE
-   Territory_Data = .Struct ([43] .Ref .Asm: e);
+   Territory_Data = .Struct ([43] .Asm: e);
 
 TYPE
    Territory_Ordinals =
Index: Source/Core/oslib/OSSpriteOp.swi
===================================================================
--- Source/Core/oslib/OSSpriteOp.swi	(revision 293)
+++ Source/Core/oslib/OSSpriteOp.swi	(working copy)
@@ -12,7 +12,7 @@
    OSSpriteOp_ColourMapping =
    .Struct
    (  .Ref .Data: workspace,
-      .Ref .Asm: function
+      .Asm: function
    ),
 
    OSSpriteOp_Area =
Index: Source/Core/oslib/Buffer.swi
===================================================================
--- Source/Core/oslib/Buffer.swi	(revision 293)
+++ Source/Core/oslib/Buffer.swi	(working copy)
@@ -90,7 +90,7 @@
 
 SWI Buffer_LinkDevice = (NUMBER 0x42945 "Links a set of routines to a
       specified buffer", ENTRY (R0 = Buffer_B: b,
-      R1 -> .Asm: wakeup_code, R2 -> .Asm: owner_change_code,
+      R1 = .Asm: wakeup_code, R2 = .Asm: owner_change_code,
       R3 = .Int: handle, R4 = .Ref Void: workspace));
 
 SWI Buffer_UnlinkDevice = (NUMBER 0x42946 "Unlinks a set of routines from the
@@ -112,7 +112,7 @@
 
 SWI Buffer_InternalInfo = (NUMBER 0x42949 "Converts a buffer handle into a
       buffer manager internal id - RISC O S 3.5+", ENTRY (R0 = Buffer_B: b),
-      EXIT (R0! = Buffer_InternalId: id, R1 -> .Asm: service_routine,
+      EXIT (R0! = Buffer_InternalId: id, R1 = .Asm: service_routine,
       R2 = .Ref Void: workspace));
 
 SWI
Index: Source/Core/oslib/ColourTrans.swi
===================================================================
--- Source/Core/oslib/ColourTrans.swi	(revision 293)
+++ Source/Core/oslib/ColourTrans.swi	(working copy)
@@ -497,7 +497,7 @@
          R4 = .Ref OSSpriteOp_TransTab: trans_tab,
          R5 = ColourTrans_TableFlags: flags,
          R6 = .Ref Void: workspace,
-         R7 -> .Asm: transfer_fn
+         R7 = .Asm: transfer_fn
       ),
       EXIT
       (  R4! = .Int: size
@@ -513,7 +513,7 @@
          R4 = .Ref OSSpriteOp_TransTab: trans_tab,
          R5 = ColourTrans_TableFlags: flags,
          R6 = .Ref Void: workspace,
-         R7 -> .Asm: transfer_fn
+         R7 = .Asm: transfer_fn
       ),
       EXIT
       (  R4! = .Int: size
Index: Source/Core/oslib/OS.swi
===================================================================
--- Source/Core/oslib/OS.swi	(revision 293)
+++ Source/Core/oslib/OS.swi	(working copy)
@@ -747,16 +747,16 @@
 SWI OS_Control =
    (  NUMBER 0xF "Reads/writes handler addresses - prefer OS_ChangeEnvironment",
       ENTRY
-      (  R0 -> .Asm: error_handler,
+      (  R0 = .Asm: error_handler,
          R1 = .Ref OS_Error: error_buffer,
-         R2 -> .Asm: escape_handler,
-         R3 -> .Asm: event_handler
+         R2 = .Asm: escape_handler,
+         R3 = .Asm: event_handler
       ),
       EXIT
-      (  R0 -> .Asm: old_error_handler,
+      (  R0 = .Asm: old_error_handler,
          R1 = .Ref OS_Error: old_error_buffer,
-         R2 -> .Asm: old_escape_handler,
-         R3 -> .Asm: old_event_handler
+         R2 = .Asm: old_escape_handler,
+         R3 = .Asm: old_event_handler
    )  );
 
 SWI OS_GetEnv =
@@ -778,20 +778,20 @@
 SWI OS_SetEnv =
    (  NUMBER 0x12 "Sets environment parameters - prefer OS_ChangeEnvironment",
       ENTRY
-      (  R0 -> .Asm: exit_handler,
+      (  R0 = .Asm: exit_handler,
          R1 = .Ref .Data: ram_limit,
-         R4 -> .Asm: undefined_instruction_handler,
-         R5 -> .Asm: prefetch_abort_handler,
-         R6 -> .Asm: data_abort_handler,
-         R7 -> .Asm: address_exception_handler
+         R4 = .Asm: undefined_instruction_handler,
+         R5 = .Asm: prefetch_abort_handler,
+         R6 = .Asm: data_abort_handler,
+         R7 = .Asm: address_exception_handler
       ),
       EXIT
-      (  R0 -> .Asm: old_exit_handler,
+      (  R0 = .Asm: old_exit_handler,
          R1 = .Ref .Data: old_ram_limit,
-         R4 -> .Asm: old_undefined_instruction_handler,
-         R5 -> .Asm: old_prefetch_abort_handler,
-         R6 -> .Asm: old_data_abort_handler,
-         R7 -> .Asm: old_address_exception_handler
+         R4 = .Asm: old_undefined_instruction_handler,
+         R5 = .Asm: old_prefetch_abort_handler,
+         R6 = .Asm: old_data_abort_handler,
+         R7 = .Asm: old_address_exception_handler
    )  );
 
 // V621 TV - IntOn/IntOff can now be called
@@ -818,11 +818,11 @@
    (  NUMBER 0x15 "Sets up the callback handler - prefer OS_ChangeEnvironment",
       ENTRY
       (  R0 -> OS_RegisterBlock: register_block,
-         R1 -> .Asm: call_back_handler
+         R1 = .Asm: call_back_handler
       ),
       EXIT
       (  R0 -> OS_RegisterBlock: old_register_block,
-         R1 -> .Asm: old_call_back_handler
+         R1 = .Asm: old_call_back_handler
    )  );
 
 SWI OS_EnterOS = (NUMBER 0x16 "Sets the processor to SVC mode - cannot be
@@ -839,18 +839,18 @@
             OS_ChangeEnvironment",
       ENTRY
       (  R0 = .Ref OS_RegisterBlock: register_block,
-         R1 -> .Asm: break_pt_handler
+         R1 = .Asm: break_pt_handler
       ),
       EXIT
       (  R0 = .Ref OS_RegisterBlock: old_register_block,
-         R1 -> .Asm: old_break_pt_handler
+         R1 = .Asm: old_break_pt_handler
    )  );
 
 SWI OS_UnusedSWI =
    (  NUMBER 0x19 "Sets up the handler for unused SWI's - prefer
             OS_ChangeEnvironment",
-      ENTRY (R0 -> .Asm: unused_swi_handler),
-      EXIT  (R0! -> .Asm: old_unused_swi_handler)
+      ENTRY (R0 = .Asm: unused_swi_handler),
+      EXIT  (R0! = .Asm: old_unused_swi_handler)
    );
 
 SWI UKSWIV = (NUMBER 0x34, ENTRY (R9 # &18 "Called when an unknown SWI
@@ -897,7 +897,7 @@
             vector",
       ENTRY
       (  R0 = .Int: vector,
-         R1 -> .Asm: routine,
+         R1 = .Asm: routine,
          R2 = .Ref .Data: handle //should be int, like other handles
       )
    );
@@ -907,7 +907,7 @@
             vector",
       ENTRY
       (  R0 = .Int: vector,
-         R1 -> .Asm: routine,
+         R1 = .Asm: routine,
          R2 = .Ref .Data: handle //should be int, like other handles
       )
    );
@@ -1311,7 +1311,7 @@
    (  NUMBER 0x3B "Calls a specified address after a delay",
       ENTRY
       (  R0 = .Int: delay,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle //should be int, like other handles
    )  );
 
@@ -1319,7 +1319,7 @@
    (  NUMBER 0x3C "Calls a specified address every time a delay elapses",
       ENTRY
       (  R0 = .Int: delay,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle //should be int, like other handles
    )  );
 
@@ -1327,7 +1327,7 @@
    (  NUMBER 0x3D "Removes a given call address and handle value from the
             ticker event list",
       ENTRY
-      (  R0 -> .Asm: code,
+      (  R0 = .Asm: code,
          R1 = .Ref .Data: handle //should be int, like other handles
    )  );
 
@@ -1412,12 +1412,12 @@
    (  NUMBER 0x40 "Installs a handler",
       ENTRY
       (  R0 = OS_HandlerType: handler_type,
-         R1 -> .Asm: handler,
+         R1 = .Asm: handler,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = .Ref .Data: buffer
       ),
       EXIT
-      (  R1! -> .Asm: old_handler,
+      (  R1! = .Asm: old_handler,
          R2 = .Ref .Data: old_handle, //should be int, like other handles
          R3 = .Ref .Data: old_buffer
    )  );
@@ -1427,13 +1427,13 @@
    (  NUMBER 0x34,
       ENTRY
       (  R0 = OS_HandlerType: handler_type,
-         R1 -> .Asm: handler,
+         R1 = .Asm: handler,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = .Ref .Data: buffer,
          R9 # &1E "OS_ChangeEnvironment vector"
       ),
       EXIT
-      (  R1! -> .Asm: old_handler,
+      (  R1! = .Asm: old_handler,
          R2 = .Ref .Data: old_handle, //should be int, like other handles
          R3 = .Ref .Data: old_buffer
    )  );
@@ -1539,7 +1539,7 @@
             vector",
       ENTRY
       (  R0 = .Int: vector,
-         R1 -> .Asm: routine,
+         R1 = .Asm: routine,
          R2 = .Ref .Data: handle //should be int, like other handles
       )
    );
@@ -1600,7 +1600,7 @@
    (  NUMBER 0x4B "Claims a device vector",
       ENTRY
       (  R0 = OS_DeviceType: device,
-         R1 -> .Asm: driver,
+         R1 = .Asm: driver,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = .Ref .Int: status,
          R4 = .Bits: mask
@@ -1611,7 +1611,7 @@
    (  NUMBER 0x4C "Releases a device vector",
       ENTRY
       (  R0 = OS_DeviceType: device,
-         R1 -> .Asm: driver,
+         R1 = .Asm: driver,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = .Ref .Int: status,
          R4 = .Bits: mask
@@ -1635,7 +1635,7 @@
    );
 
 //Types of sort (pass in R2)
-TYPE OS_SortType = .Ref .Asm;
+TYPE OS_SortType = .Asm;
 CONST
    OS_SortCardinal        = OS_SortType: 0,
    OS_SortInteger         = OS_SortType: 1,
@@ -1745,7 +1745,7 @@
 SWI OS_AddCallBack =
    (  NUMBER 0x54 "Adds a transient callback to the list",
       ENTRY
-      (  R0 -> .Asm: call_back,
+      (  R0 = .Asm: call_back,
          R1 = .Ref .Data: handle //should be int, like other handles
    )  );
 
@@ -1755,7 +1755,7 @@
       (  R0 = .Int: handler_type
       ),
       EXIT
-      (  R1! -> .Asm: handler,
+      (  R1! = .Asm: handler,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = .Ref .Data: buffer
    )  );
@@ -1848,7 +1848,7 @@
 SWI OS_RemoveCallBack =
    (  NUMBER 0x5F "Removes a transient callback from the list",
       ENTRY
-      (  R0 -> .Asm: call_back,
+      (  R0 = .Asm: call_back,
          R1 = .Ref .Data: handle //should be int, like other handles
    )  );
 
@@ -1888,7 +1888,7 @@
    (  NUMBER 0x62 "Claims a software interrupt",
       ENTRY
       (  R0 = .Int: swi,
-         R1 -> .Asm: routine,
+         R1 = .Asm: routine,
          R2 = .Ref .Data: handle //should be int, like other handles
       )
    );
@@ -1897,7 +1897,7 @@
    (  NUMBER 0x63 "Release a software interrupt",
       ENTRY
       (  R0 = .Int: swi,
-         R1 -> .Asm: routine,
+         R1 = .Asm: routine,
          R2 = .Ref .Data: handle //should be int, like other handles
       )
    );
@@ -2101,7 +2101,7 @@
          R3 -> .Data: base_address,
          R4 = OS_AreaFlags: flags,
          R5 = .Int: size_limit,
-         R6 -> .Asm: handler,
+         R6 = .Asm: handler,
          R7 = .Ref Void: workspace,
          R8 -> .String: description
       ),
@@ -2129,7 +2129,7 @@
          R3 -> .Data: base_address,
          R4 = OS_AreaFlags: flags,
          R5 = .Int: size_limit,
-         R6 -> .Asm: handler,
+         R6 = .Asm: handler,
          R7 = .Ref Void: workspace,
          R8 -> .String: description
    )  ),
@@ -2350,7 +2350,7 @@
          R1 = OSMemory_ControllerFlags: controller
       ),
       EXIT
-      (  R1 -> .Asm: controller_addr
+      (  R1 = .Asm: controller_addr
    )  ),
    OSMemory_FindContiguous =
    (  NUMBER 0x68,
@@ -2410,12 +2410,12 @@
    OSClaimProcessorVector_Alloc =
          (NUMBER 0x69, ENTRY (R0 # %100000000 "Claims a processor vector
 - RISC O S 3.5+",
-         R0 | .Bits: vector, R1 -> .Asm: routine),
-         EXIT (R1! -> .Asm: old_routine)),
+         R0 | .Bits: vector, R1 = .Asm: routine),
+         EXIT (R1! = .Asm: old_routine)),
    OSClaimProcessorVector_Free =
          (NUMBER 0x69, ENTRY (R0 # 0 "Releases a processor vector - RISC
 O S 3.5+",
-         R0 | .Bits: vector, R2 -> .Asm: old_routine),
+         R0 | .Bits: vector, R2 = .Asm: old_routine),
          EXIT (R1?));
 
 SWI OS_Reset = (NUMBER 0x6A "Performs a hard reset - RISC O S 3.5+");
@@ -2443,7 +2443,7 @@
    (  NUMBER 0x6D,
       ENTRY (R0 # 0 "Reports platform features - RISC O S 3.7+"),
       EXIT (R0! = OS_PlatformFeatureFlags: flags,
-         R1 -> .Asm: predisable_fn)
+         R1 = .Asm: predisable_fn)
    );
 
 
@@ -2453,7 +2453,7 @@
    OS_SynchroniseCodeAreas = //RO3.7+
    (  NUMBER 0x6E "Informs the O S that code has been newly generated or modified
          in memory - RISC O S 3.7+",
-      ENTRY (R0 = .Bits: flags, R1 -> .Asm: start, R2 -> .Asm: end)
+      ENTRY (R0 = .Bits: flags, R1 = .Asm: start, R2 = .Asm: end)
    );
 
 SWI OS_CallASWI = //RO3.7+ Not APCS-compliant
@@ -2619,11 +2619,11 @@
       ENTRY
       (  R0 # 0 "Claims a software interrupt",
          R1 = .Int: swi,
-         R2 -> .Asm: routine,
+         R2 = .Asm: routine,
          R3 = .Ref .Data: handle //should be int, like other handles
       ),
       EXIT
-      (  R2 -> .Asm: old_routine,
+      (  R2 = .Asm: old_routine,
          R3 = .Ref .Data: old_handle
       )
    );
@@ -2633,7 +2633,7 @@
       ENTRY
       (  R0 # 1 "Releases a software interrupt",
          R1 = .Int: swi,
-         R2 -> .Asm: routine,
+         R2 = .Asm: routine,
          R3 = .Ref .Data: handle //should be int, like other handles
       )
    );
@@ -2675,7 +2675,7 @@
          R9 = .Int: call
       ),
       EXIT
-      (  R0! = .Ref .Asm: routine,
+      (  R0! = .Asm: routine,
          R1 = .Int: static_base
    )  );
 
Index: Source/InProgress/MIDI.swi
===================================================================
--- Source/InProgress/MIDI.swi	(revision 293)
+++ Source/InProgress/MIDI.swi	(working copy)
@@ -251,19 +251,19 @@
 
 SWI MIDI_Interface = (NUMBER 0x404E4 "Gets addresses for more efficient
 access to critical SWI's",
-   exit (R0 = .Ref Void: workspace, R1 -> .Asm: swi_code));
+   exit (R0 = .Ref Void: workspace, R1 = .Asm: swi_code));
 
 
 TYPE MIDI_DriverFlags = .Bits;
 CONST etc;
 TYPE MIDI_DriverBlock = .Struct (MIDI_DriverFlags: flags,
-   .Ref .Asm: tx_vector_addr, .Ref .Asm: tx_irq_rdy_vector_addr,
-   .Ref .Asm: rx_vector_addr, .Ref .Asm: clk_vector_addr,
-   .Ref .Asm: feature_vector_addr, .Int: version,
+   .Asm: tx_vector_addr, .Asm: tx_irq_rdy_vector_addr,
+   .Asm: rx_vector_addr, .Asm: clk_vector_addr,
+   .Asm: feature_vector_addr, .Int: version,
    [32] .Char: title);
-TYPE MIDI_CallTable = .Struct (.Ref .Asm: rx_addr,
-   .Ref .Asm: tx_irq__addr, .Ref .Asm: clk_addr,
-   .Ref .Asm: error_addr, .Int: no);
+TYPE MIDI_CallTable = .Struct (.Asm: rx_addr,
+   .Asm: tx_irq__addr, .Asm: clk_addr,
+   .Asm: error_addr, .Int: no);
  SWI
    MIDI_InstallDriver =
    (  NUMBER 0x404E5 "Installs or deinstalls a driver - see separate
Index: Source/InProgress/PCMCIA.swi
===================================================================
--- Source/InProgress/PCMCIA.swi	(revision 293)
+++ Source/InProgress/PCMCIA.swi	(working copy)
@@ -32,7 +32,7 @@
    (  NUMBER 0x47501,
       ENTRY (R0 # 0 "Allows a P?C?M?C?I?A hardware driver to register
             itself with the P?C?M?C?I?A Manager",
-            R1 -> .Asm: handler,
+            R1 = .Asm: handler,
             R2 = .Ref Void: workspace)
    );
 
@@ -40,7 +40,7 @@
    (  NUMBER 0x47501,
       ENTRY (R0 # 1 "Allows a P?C?M?C?I?A hardware driver to deregister
             itself with the P?C?M?C?I?A Manager",
-            R1 -> .Asm: handler,
+            R1 = .Asm: handler,
             R2 = .Ref Void: workspace)
    );
 
@@ -50,11 +50,11 @@
             itself with the P?C?M?C?I?A Manager",
             R1 -> .String: driver_id,
             R2 = .Bits: version_flags,
-            R3 -> .Asm: fn_code,
-            R4 -> .Asm: read_code,
-            R5 -> .Asm: write_code,
-            R6 -> .Asm: erase_code,
-            R7 -> .Asm: irq_code,
+            R3 = .Asm: fn_code,
+            R4 = .Asm: read_code,
+            R5 = .Asm: write_code,
+            R6 = .Asm: erase_code,
+            R7 = .Asm: irq_code,
             R8 = .Ref Void: workspace)
    );
 
@@ -62,7 +62,7 @@
    (  NUMBER 0x47501,
       ENTRY (R0 # 3 "Allows a P C card driver to deregister
             itself with the P?C?M?C?I?A Manager",
-            R1 -> .Asm: handler,
+            R1 = .Asm: handler,
             R2 = .Ref Void: workspace) 
    );
 
Index: Source/Computer/oslib/Free.swi
===================================================================
--- Source/Computer/oslib/Free.swi	(revision 293)
+++ Source/Computer/oslib/Free.swi	(working copy)
@@ -8,7 +8,7 @@
             filing system",
       ENTRY
       (  R0 = FileSwitch_FSNo: fs_no,
-         R1 -> .Asm: fn,
+         R1 = .Asm: fn,
          R2 = .Ref Void: workspace
    )  );
 
@@ -17,6 +17,6 @@
             systems known by the Free module",
       ENTRY
       (  R0 = FileSwitch_FSNo: fs_no,
-         R1 -> .Asm: fn,
+         R1 = .Asm: fn,
          R2 = .Ref Void: workspace
    )  )
Index: Source/Computer/oslib/CD.swi
===================================================================
--- Source/Computer/oslib/CD.swi	(revision 293)
+++ Source/Computer/oslib/CD.swi	(working copy)
@@ -492,14 +492,14 @@
    (  NUMBER &41260 "version 2.20+",
       ENTRY
       (  R0 -> CD_RegisterBlock: info,
-         R1 -> .Asm: driver_code,
+         R1 = .Asm: driver_code,
          R2 = .Ref Void: driver_workspace
    )  ),
    CD_Unregister =
    (  NUMBER &41261 "version 2.20+",
       ENTRY
       (  R0 -> CD_RegisterBlock: info,
-         R1 -> .Asm: driver_code
+         R1 = .Asm: driver_code
    )  ),
    CD_ByteCopy =
    (  NUMBER &41262 "A fast memory copy routine - version 2.20+",
Index: Source/Computer/oslib/FileCore.swi
===================================================================
--- Source/Computer/oslib/FileCore.swi	(revision 293)
+++ Source/Computer/oslib/FileCore.swi	(working copy)
@@ -120,8 +120,8 @@
       FileSwitch_FSNo: fs_no,
       .Ref .Char: title,
       .Ref .Char: boot_text,
-      .Ref .Asm: disc_op,
-      .Ref .Asm: misc_op
+      .Asm: disc_op,
+      .Asm: misc_op
    );
 
 CONST
@@ -224,9 +224,9 @@
       ),
       EXIT
       (  R0 = .Ref Void: instance,
-         R1 -> .Asm: floppy_done,
-         R2 -> .Asm: hard_disc_done,
-         R3 -> .Asm: release_fiq
+         R1 = .Asm: floppy_done,
+         R2 = .Asm: hard_disc_done,
+         R3 = .Asm: release_fiq
    )  );
 
 SWI FileCore_Drives = (NUMBER 0x40542 "Returns information on a filing
Index: Source/Computer/oslib/SCSI.swi
===================================================================
--- Source/Computer/oslib/SCSI.swi	(revision 293)
+++ Source/Computer/oslib/SCSI.swi	(working copy)
@@ -163,7 +163,7 @@
          R3 = .Ref .Data: start_addr,
          R4 = .Int: length,
          R5 = .Int: timeout,
-         R6 -> .Asm: callback_code,
+         R6 = .Asm: callback_code,
          R7 = .Ref Void: workspace,
          R8 = .Int: access_key),
       EXIT (R0 = .Int: op_id,
@@ -192,7 +192,7 @@
    (  NUMBER 0x403c7,
       ENTRY (R0 # 0 "Claims exclusive use of a device",
          R1 = .Int: device_id,
-         R2 -> .Asm: release_code,
+         R2 = .Asm: release_code,
          R3 = .Ref Void: workspace,
          R8 = .Int: access_key)
    );
@@ -203,7 +203,7 @@
             device is already claimed, calls the release code for the
             current claimant",
          R1 = .Int: device_id,
-         R2 -> .Asm: release_code,
+         R2 = .Asm: release_code,
          R3 = .Ref Void: workspace,
          R8 = .Int: access_key)
    );
Index: Source/Computer/oslib/Econet.swi
===================================================================
--- Source/Computer/oslib/Econet.swi	(revision 293)
+++ Source/Computer/oslib/Econet.swi	(working copy)
@@ -60,7 +60,7 @@
    Econet_ImmediateMachinePeek       = Econet_ImmediateOp: 8,
    Econet_ImmediateGetRegisters      = Econet_ImmediateOp: 9;
 
-TYPE Econet_ImmediateOSProcedure = .Ref .Asm;
+TYPE Econet_ImmediateOSProcedure = .Asm;
 CONST
    //For Econet_ImmediateOSProcedureCall
    Econet_OSCharFromNotify    = Econet_ImmediateOSProcedure: 0,
Index: Source/Computer/oslib/ADFS.swi
===================================================================
--- Source/Computer/oslib/ADFS.swi	(revision 293)
+++ Source/Computer/oslib/ADFS.swi	(working copy)
@@ -136,8 +136,8 @@
       R4 = .Bits: status_bits,
       R5 = .Ref .Int: irq_location,
       R6 = .Bits: irq_bits,
-      R7 -> .Asm: read_code,
-      R8 -> .Asm: write_code));
+      R7 = .Asm: read_code,
+      R8 = .Asm: write_code));
 
 SWI ADFS_IDEUserOp = (NUMBER 0x4024B "Direct user interface for low-level
       IDE commands",
Index: Source/Computer/oslib/ResourceFS.swi
===================================================================
--- Source/Computer/oslib/ResourceFS.swi	(revision 293)
+++ Source/Computer/oslib/ResourceFS.swi	(working copy)
@@ -52,4 +52,4 @@
          killed")),
    Service_ResourceFSStarting = (NUMBER 0x30, ENTRY (R1 # 0x60 "ResourceFS
          module is reloaded or reinitialised",
-         R2 -> .Asm: register_files, R3 = .Ref Void: workspace))
+         R2 = .Asm: register_files, R3 = .Ref Void: workspace))
Index: Source/Computer/oslib/DeviceFS.swi
===================================================================
--- Source/Computer/oslib/DeviceFS.swi	(revision 293)
+++ Source/Computer/oslib/DeviceFS.swi	(working copy)
@@ -42,7 +42,7 @@
       ENTRY
       (  R0 = DeviceFS_RegisterFlags: flags,
          R1 -> DeviceFS_DeviceList: devices,
-         R2 -> .Asm: driver,
+         R2 = .Asm: driver,
          R3 = .Int: handle,
          R4 = .Ref Void: workspace,
          R5 -> .String: validation,
Index: Source/Types/oslib/Types.h
===================================================================
--- Source/Types/oslib/Types.h	(revision 293)
+++ Source/Types/oslib/Types.h	(working copy)
@@ -21,12 +21,21 @@
    Foundation, Inc, 675 Mass Ave, Cambridge, MA 02139, U S A.
 */
 
+#if defined NAMESPACE_OSLIB
+  namespace OSLib {
+#endif
+
 /********************
  * Type definitions *
  ********************/
 typedef unsigned int                            bits;
 typedef int                                     osbool;
 typedef unsigned char                           byte;
+/* 'asm_routine' is a pointer to an assembler routine which does not
+   necessary requires an APCS-32 binding. Typically such a routine is called
+   directly from one of the RISC OS modules using a non-uniform calling
+   convention.  */
+typedef void (*asm_routine)(void);
 
 /* for backward compatibility with non C++ and pre-C99 code
 ** we can typedef |bool| as |osbool|. Anyone who wants to provide
@@ -141,4 +150,8 @@
 #define NOT_USED(x) {x = x;}
 #define UNSET(x) {(void) &x;}
 
+#if defined NAMESPACE_OSLIB
+  } 
 #endif
+
+#endif
Index: Source/User/oslib/ImageFileRender.swi
===================================================================
--- Source/User/oslib/ImageFileRender.swi	(revision 293)
+++ Source/User/oslib/ImageFileRender.swi	(working copy)
@@ -97,12 +97,12 @@
       ImageFileRender_Magic: magic,
       .Ref .Char: name,
       .Ref .Data: workspace,
-      .Ref .Asm: start,
-      .Ref .Asm: stop,
-      .Ref .Asm: render,
-      .Ref .Asm: bbox,
-      .Ref .Asm: declare_fonts,
-      .Ref .Asm: info
+      .Asm: start,
+      .Asm: stop,
+      .Asm: render,
+      .Asm: bbox,
+      .Asm: declare_fonts,
+      .Asm: info
    );
 
 TYPE
Index: Source/User/oslib/WimpExtend.swi
===================================================================
--- Source/User/oslib/WimpExtend.swi	(revision 293)
+++ Source/User/oslib/WimpExtend.swi	(working copy)
@@ -35,7 +35,7 @@
 // WimpExtend_LocateWorkspace = ( NUMBER 0x400FB, //undocumented
 //       ENTRY (R0 # 1 "For internal use only; returns address of
 //                the primary block of workspace used by the Wimp"),
-//       EXIT (R0! = .Ref .Asm: workspace)),
+//       EXIT (R0! = .Asm: workspace)),
 
 WimpExtend_GetParent = ( NUMBER 0x400FB,
       ENTRY (R0 # 6 "Finds the window's parent
Index: Source/User/oslib/TaskManager.swi
===================================================================
--- Source/User/oslib/TaskManager.swi	(revision 293)
+++ Source/User/oslib/TaskManager.swi	(working copy)
@@ -87,5 +87,5 @@
    (  NUMBER 0x30,
       ENTRY
       (  R1 # 0x42680 "Notify Task Manager of licence acknowledgements - RISC O S 4 only",
-         R2 = .Ref .Asm: add_message
+         R2 = .Asm: add_message
    )  )
Index: Source/User/oslib/PDriver.swi
===================================================================
--- Source/User/oslib/PDriver.swi	(revision 293)
+++ Source/User/oslib/PDriver.swi	(working copy)
@@ -499,7 +499,7 @@
    (  NUMBER 0x80156 "Registers a printer driver with the PDriver sharer
             module",
       ENTRY
-      (  R0 = .Int: reason,
+      (  R0 = .Asm: reason,
          R1 = .Ref Void: workspace,
          R2 = PDriver_Type: type
    )  );
@@ -570,7 +570,7 @@
          R1 = .Int: pdumper_no,
          R2 = .Int: dp_version_required,
          R3 = .Ref Void: dumper_workspace,
-         R4 -> .Asm: dumper_code,
+         R4 = .Asm: dumper_code,
          R5 = .Bits: supported_calls,
          R6 = .Bits: supported_strips
    )  ),
@@ -644,7 +644,7 @@
          R1 = .Int: pdumper_no,
          R2 = .Int: dp_version_required,
          R3 = .Ref Void: dumper_workspace,
-         R4 -> .Asm: dumper_code,
+         R4 = .Asm: dumper_code,
          R5 = .Bits: supported_calls,
          R6 = .Bits: supported_strips,
          R8 = PDriver_Type: type
Index: Source/User/oslib/Filter.swi
===================================================================
--- Source/User/oslib/Filter.swi	(revision 293)
+++ Source/User/oslib/Filter.swi	(working copy)
@@ -12,7 +12,7 @@
    (  NUMBER 0x42640 "Adds a new pre-filter to the list of pre-filters",
       ENTRY
       (  R0 -> .String: filter_name,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = Wimp_T: task
    )  );
@@ -21,7 +21,7 @@
    (  NUMBER 0x42641 "Adds a new post-filter to the list of post-filters",
       ENTRY
       (  R0 -> .String: filter_name,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = Wimp_T: task,
          R4 = Wimp_PollFlags: mask
@@ -31,7 +31,7 @@
    (  NUMBER 0x42642 "Removes a pre-filter from the list of pre-filters",
       ENTRY
       (  R0 -> .String: filter_name,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = Wimp_T: task
    )  );
@@ -40,7 +40,7 @@
    (  NUMBER 0x42643 "Removes a post-filter from the list of post-filters",
       ENTRY
       (  R0 -> .String: filter_name,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = Wimp_T: task,
          R4 = Wimp_PollFlags: mask
@@ -51,7 +51,7 @@
          get-rectangle filters",
       ENTRY
       (  R0 -> .String: filter_name,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = Wimp_T: task
    )  );
@@ -61,7 +61,7 @@
          get-rectangle filters",
       ENTRY
       (  R0 -> .String: filter_name,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = Wimp_T: task
    )  );
@@ -71,7 +71,7 @@
          rectangle-copy filters",
       ENTRY
       (  R0 -> .String: filter_name,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle //should be int, like other handles
    )  );
 
@@ -80,7 +80,7 @@
          rectangle-copy filters",
       ENTRY
       (  R0 -> .String: filter_name,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle //should be int, like other handles
    )  );
 
@@ -89,7 +89,7 @@
          post-rectangle filters",
       ENTRY
       (  R0 -> .String: filter_name,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = Wimp_T: task
    )  );
@@ -99,7 +99,7 @@
          post-rectangle filters",
       ENTRY
       (  R0 -> .String: filter_name,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = Wimp_T: task
    )  );
@@ -109,7 +109,7 @@
          post-icon filters - requires Wimp 3.86+",
       ENTRY
       (  R0 -> .String: filter_name,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = Wimp_T: task
    )  );
@@ -119,7 +119,7 @@
          post-icon filters - requires Wimp 3.86+",
       ENTRY
       (  R0 -> .String: filter_name,
-         R1 -> .Asm: code,
+         R1 = .Asm: code,
          R2 = .Ref .Data: handle, //should be int, like other handles
          R3 = Wimp_T: task
    )  );
Index: Source/User/oslib/ZapRedraw.swi
===================================================================
--- Source/User/oslib/ZapRedraw.swi	(revision 293)
+++ Source/User/oslib/ZapRedraw.swi	(working copy)
@@ -180,7 +180,7 @@
    (  NUMBER &48480 "Redraws a rectangle of characters on the screen",
       ENTRY
       (  R1 -> ZapRedraw_Block: redraw_block,
-         R2 -> .Asm: extension_fn,
+         R2 = .Asm: extension_fn,
          R3 =  .Ref Void: extension_handle
       ),
       EXIT (R0?)
Index: Source/User/oslib/ColourPicker.swi
===================================================================
--- Source/User/oslib/ColourPicker.swi	(revision 293)
+++ Source/User/oslib/ColourPicker.swi	(working copy)
@@ -70,7 +70,7 @@
       .Ref .String: description,
       .Int: info_size,
       OS_Coord: pane_size,
-      [ColourPicker_EntryLimit] .Ref .Asm: entries
+      [ColourPicker_EntryLimit] .Asm: entries
    );
 
 CONST
@@ -323,6 +323,6 @@
    (  NUMBER 0x30,
       ENTRY
       (  R1 # &93 "For internal use only",
-         R2 -> .Asm: loaded_service,
+         R2 = .Asm: loaded_service,
          R3 = .Ref Void: workspace
    )  )
Index: Source/User/oslib/Wimp.swi
===================================================================
--- Source/User/oslib/Wimp.swi	(revision 293)
+++ Source/User/oslib/Wimp.swi	(working copy)
@@ -691,9 +691,9 @@
       OS_Box: initial,
       OS_Box: bbox,
       .Ref .Data: handle,
-      .Ref .Asm: draw,
-      .Ref .Asm: undraw,
-      .Ref .Asm: redraw
+      .Asm: draw,
+      .Asm: undraw,
+      .Asm: redraw
    );
 
 TYPE Wimp_AutoScrollInfo =
@@ -701,13 +701,13 @@
    (  Wimp_W: w,
       OS_Box: pause_zone_sizes,
       .Int: pause_duration,
-      .Ref .Asm: state_change,
+      .Asm: state_change,
       .Ref .Data: handle
    );
 
 CONST
-   Wimp_AutoScrollNoHandler      = .Ref .Asm: 0,
-   Wimp_AutoScrollDefaultHandler = .Ref .Asm: 1;
+   Wimp_AutoScrollNoHandler      = .Asm: 0,
+   Wimp_AutoScrollDefaultHandler = .Asm: 1;
 
 TYPE Wimp_Caret =
    .Struct
@@ -2204,7 +2204,7 @@
             deregister a filter with the Wimp",
       ENTRY
       (  R0 = Wimp_FilterAction: type,
-         R1 -> .Asm: filter_code,
+         R1 = .Asm: filter_code,
          R2 = .Ref .Data: handle
       ),
       EXIT (R0?)
Index: Tools/DefMod2/Manual.htm,faf
===================================================================
--- Tools/DefMod2/Manual.htm,faf	(revision 293)
+++ Tools/DefMod2/Manual.htm,faf	(working copy)
@@ -623,7 +627,7 @@
    <tr><td><tt>Char</tt></td>       <td><tt>char</tt></td></tr>
    <tr><td><tt>Bits</tt></td>       <td><tt>unsigned int</tt></td></tr>
    <tr><td><tt>String</tt></td>     <td><tt>char</tt></td></tr>
-   <tr><td><tt>Asm</tt></td>        <td><tt>void *</tt></td></tr>
+   <tr><td><tt>Asm</tt></td>        <td><tt>asm_routine</tt></td></tr>
    <tr><td><tt>Data</tt></td>       <td><tt>byte</tt></td></tr>
    <tr>
       <td><tt>Ref </tt><i>type</i></td>
@@ -659,7 +663,7 @@
    <tr>
       <td><tt>-></tt> <i>type</i></td>
       <td>becomes</td>
-      <td><i>CVT(type)</i>&nbsp;<tt>*</tt> on input,
+      <td><i>CVT(type)</i>&nbsp;const&nbsp;<tt>*</tt> on input,
 <i>CVT(type)</i>&nbsp;<tt>**</tt> on output</td>
    </tr>
    <tr>
Index: Tools/DefMod2/hdr.c
===================================================================
--- Tools/DefMod2/hdr.c	(revision 294)
+++ Tools/DefMod2/hdr.c	(working copy)
@@ -256,13 +256,13 @@
             goto finish;
       break;
 
+      case def_TYPE_ASM:
       case def_TYPE_REF:
 	if ((rc =  Emit_Decl1 (file, "Ptr", v, top_level, cs)) < 0)
             goto finish;
       break;
 
       case def_TYPE_STRING:
-      case def_TYPE_ASM:
       case def_TYPE_DATA:
       case def_TYPE_VOID:
          if ((rc = 
@@ -571,7 +571,7 @@
       break;
 
       case def_TYPE_ASM:
-         if ((rc = fprintf (file, "code")) < 0)
+         if ((rc = fprintf (file, "pointer to code")) < 0)
             goto finish;
       break;
 
Index: Tools/DefMod2/cstrong.c
===================================================================
--- Tools/DefMod2/cstrong.c	(revision 294)
+++ Tools/DefMod2/cstrong.c	(working copy)
@@ -480,8 +480,8 @@
       break;
 
       case def_TYPE_ASM:
-         if ((rc = fprintf (file, "void %s", v)) < 0)
-            goto finish; /*v != NULL*/
+         if ((rc = fprintf (file, v == NULL? "asm_routine": "asm_routine %s", v)) < 0)
+            goto finish;
       break;
 
       case def_TYPE_DATA:
Index: Tools/DefMod2/defmod.y
===================================================================
--- Tools/DefMod2/defmod.y	(revision 294)
+++ Tools/DefMod2/defmod.y	(working copy)
@@ -358,7 +358,7 @@
    {$$.tag = def_TYPE_STRING; $$.name = NULL;
          $$.value = def_VALUE_VARIABLE; $$.description = NULL;} |
    ASM
-   {$$.tag = def_TYPE_ASM; $$.name = NULL; $$.value = def_VALUE_VARIABLE;
+   {$$.tag = def_TYPE_ASM; $$.name = NULL; $$.value = def_VALUE_REGISTER;
          $$.description = NULL;} |
    DATA
    {$$.tag = def_TYPE_DATA; $$.name = NULL; $$.value = def_VALUE_VARIABLE;
Index: Tools/DefMod2/chelp.c
===================================================================
--- Tools/DefMod2/chelp.c	(revision 294)
+++ Tools/DefMod2/chelp.c	(working copy)
@@ -120,8 +120,8 @@
       break;
 
       case def_TYPE_ASM:
-         if ((rc = fprintf (file, "void %s", v)) < 0)
-            goto finish; /*v != NULL*/
+         if ((rc = fprintf (file, v == NULL? "asm_routine": "asm_routine %s", v)) < 0)
+            goto finish;
       break;
 
       case def_TYPE_DATA:
Index: Tools/DefMod2/cheader.c
===================================================================
--- Tools/DefMod2/cheader.c	(revision 294)
+++ Tools/DefMod2/cheader.c	(working copy)
@@ -37,10 +37,10 @@
 
 static int strsplen
 (
-   char *s
+   const char *s
 )
 {
-   char *p = s;
+   const char *p = s;
 
    while (*p != '\0' && *p != ' ') p++;
 
@@ -165,8 +165,8 @@
       break;
 
       case def_TYPE_ASM:
-         if ((rc = fprintf (file, "void %s", v)) < 0)
-            goto finish; /*v != NULL*/
+         if ((rc = fprintf (file, v == NULL? "asm_routine": "asm_routine %s", v)) < 0)
+            goto finish;
       break;
 
       case def_TYPE_DATA:
Index: docs/ChangeLog
===================================================================
--- docs/ChangeLog	(revision 293)
+++ docs/ChangeLog	(working copy)
@@ -16,6 +16,12 @@
      (20071119-1, John Tytgat / John-Mark Bell)
    - Add support to Toolbox_ShowObject for showing an object as a
      child window. (20071129-1, Christian Ludlam)
+   - .Asm defmod type is changed from 'void *' to 'asm_routine' with the
+     latter being defined as: "typedef void (*asm_routine)(void)". This
+     should now enable warning free compilations. In all .swi files the
+     "-> .Asm: xzy" parts are changed into "= .Asm: xyz" and
+     ".Ref .Asm: xyz" ones into ".Asm: xyz".
+     (xxx, John Tytgat)
         
 *  Bug Fixes:
    - Macro.h/Macro.Hdr: the macro Bool didn't write its result to first
-------------- next part --------------
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/adfs.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/adfs.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/adfs.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/adfs.h	2008-02-09 16:56:10.000000000 +0100
@@ -753,15 +753,15 @@
       bits status_bits,
       int *irq_location,
       bits irq_bits,
-      void const *read_code,
-      void const *write_code);
+      asm_routine read_code,
+      asm_routine write_code);
 extern void adfs_set_ide_controller (byte *controller,
       int *status_location,
       bits status_bits,
       int *irq_location,
       bits irq_bits,
-      void const *read_code,
-      void const *write_code);
+      asm_routine read_code,
+      asm_routine write_code);
 
 /* ------------------------------------------------------------------------
  * Function:      adfs_ide_user_op()
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/ADFS.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/ADFS.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/ADFS.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/ADFS.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -218,8 +218,8 @@
    @  R4 = status_bits (Bits)
    @  R5 = irq_location (pointer to Int)
    @  R6 = irq_bits (Bits)
-   @  R7 -> read_code (code)
-   @  R8 -> write_code (code)
+   @  R7 = read_code (pointer to code)
+   @  R8 = write_code (pointer to code)
 
 .set XADFS_IDEUserOp,0x6024b
 .set ADFS_IDEUserOp,0x4024b
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/buffer.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/buffer.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/buffer.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/buffer.h	2008-02-09 16:56:10.000000000 +0100
@@ -326,13 +326,13 @@
  */
 
 extern os_error *xbuffer_link_device (buffer_b b,
-      void const *wakeup_code,
-      void const *owner_change_code,
+      asm_routine wakeup_code,
+      asm_routine owner_change_code,
       int handle,
       void *workspace);
 extern void buffer_link_device (buffer_b b,
-      void const *wakeup_code,
-      void const *owner_change_code,
+      asm_routine wakeup_code,
+      asm_routine owner_change_code,
       int handle,
       void *workspace);
 
@@ -424,10 +424,10 @@
 
 extern os_error *xbuffer_internal_info (buffer_b b,
       buffer_internal_id *id,
-      void **service_routine,
+      asm_routine *service_routine,
       void **workspace);
 extern buffer_internal_id buffer_internal_info (buffer_b b,
-      void **service_routine,
+      asm_routine *service_routine,
       void **workspace);
 
 /* ------------------------------------------------------------------------
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/Buffer.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/Buffer.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/Buffer.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/Buffer.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -130,8 +130,8 @@
 .set Buffer_LinkDevice,0x42945
    @Entry
    @  R0 = b (Buffer_B)
-   @  R1 -> wakeup_code (code)
-   @  R2 -> owner_change_code (code)
+   @  R1 = wakeup_code (pointer to code)
+   @  R2 = owner_change_code (pointer to code)
    @  R3 = handle (Int)
    @  R4 = workspace (pointer to Void)
 
@@ -167,7 +167,7 @@
    @  R0 = b (Buffer_B)
    @Exit
    @  R0 = id (Buffer_InternalId)
-   @  R1 -> service_routine (code)
+   @  R1 = service_routine (pointer to code)
    @  R2 = workspace (pointer to Void)
 
 #  define InsV 0x14
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/cd.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/cd.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/cd.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/cd.h	2008-02-09 16:56:10.000000000 +0100
@@ -1030,10 +1030,10 @@
  */
 
 extern os_error *xcd_register (cd_register_block const *info,
-      void const *driver_code,
+      asm_routine driver_code,
       void *driver_workspace);
 __swi (0x41260) void cd_register (cd_register_block const *info,
-      void const *driver_code,
+      asm_routine driver_code,
       void *driver_workspace);
 
 /* ------------------------------------------------------------------------
@@ -1048,9 +1048,9 @@
  */
 
 extern os_error *xcd_unregister (cd_register_block const *info,
-      void const *driver_code);
+      asm_routine driver_code);
 __swi (0x41261) void cd_unregister (cd_register_block const *info,
-      void const *driver_code);
+      asm_routine driver_code);
 
 /* ------------------------------------------------------------------------
  * Function:      cd_byte_copy()
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/CD.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/CD.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/CD.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/CD.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -498,14 +498,14 @@
 .set CD_Register,0x41260
    @Entry
    @  R0 -> info (CD_RegisterBlock)
-   @  R1 -> driver_code (code)
+   @  R1 = driver_code (pointer to code)
    @  R2 = driver_workspace (pointer to Void)
 
 .set XCD_Unregister,0x61261
 .set CD_Unregister,0x41261
    @Entry
    @  R0 -> info (CD_RegisterBlock)
-   @  R1 -> driver_code (code)
+   @  R1 = driver_code (pointer to code)
 
 .set XCD_ByteCopy,0x61262
 .set CD_ByteCopy,0x41262
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/colourpicker.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/colourpicker.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/colourpicker.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/colourpicker.h	2008-02-09 16:56:10.000000000 +0100
@@ -186,7 +186,7 @@
       char *description;
       int info_size;
       os_coord pane_size;
-      void *entries [8];
+      asm_routine entries [8];
    };
 
 typedef bits colourpicker_colour_flags;
@@ -646,9 +646,9 @@
  * Other notes:   Calls SWI 0x30 with R1 = 0x93.
  */
 
-extern os_error *xservice_colour_picker_loaded (void const *loaded_service,
+extern os_error *xservice_colour_picker_loaded (asm_routine loaded_service,
       void *workspace);
-extern void service_colour_picker_loaded (void const *loaded_service,
+extern void service_colour_picker_loaded (asm_routine loaded_service,
       void *workspace);
 
 #ifdef __cplusplus
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/ColourPicker.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/ColourPicker.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/ColourPicker.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/ColourPicker.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -367,7 +367,7 @@
 #  define Service_ColourPickerLoaded 0x93
    @Entry
    @  R1 = &93
-   @  R2 -> loaded_service (code)
+   @  R2 = loaded_service (pointer to code)
    @  R3 = workspace (pointer to Void)
 
 #endif
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/colourtrans.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/colourtrans.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/colourtrans.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/colourtrans.h	2008-02-09 16:56:10.000000000 +0100
@@ -1252,7 +1252,7 @@
       osspriteop_trans_tab *trans_tab,
       colourtrans_table_flags flags,
       void *workspace,
-      void const *transfer_fn,
+      asm_routine transfer_fn,
       int *size);
 extern int colourtrans_generate_table (os_mode source_mode,
       os_palette const *source_palette,
@@ -1261,7 +1261,7 @@
       osspriteop_trans_tab *trans_tab,
       colourtrans_table_flags flags,
       void *workspace,
-      void const *transfer_fn);
+      asm_routine transfer_fn);
 
 /* ------------------------------------------------------------------------
  * Function:      colourtrans_generate_table_for_sprite()
@@ -1291,7 +1291,7 @@
       osspriteop_trans_tab *trans_tab,
       colourtrans_table_flags flags,
       void *workspace,
-      void const *transfer_fn,
+      asm_routine transfer_fn,
       int *size);
 extern int colourtrans_generate_table_for_sprite (osspriteop_area const *source_area,
       osspriteop_id source_id,
@@ -1300,7 +1300,7 @@
       osspriteop_trans_tab *trans_tab,
       colourtrans_table_flags flags,
       void *workspace,
-      void const *transfer_fn);
+      asm_routine transfer_fn);
 
 /* ------------------------------------------------------------------------
  * Function:      service_calibration_changed()
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/ColourTrans.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/ColourTrans.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/ColourTrans.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/ColourTrans.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -461,7 +461,7 @@
    @  R4 = trans_tab (pointer to OSSpriteOp_TransTab)
    @  R5 = flags (ColourTrans_TableFlags)
    @  R6 = workspace (pointer to Void)
-   @  R7 -> transfer_fn (code)
+   @  R7 = transfer_fn (pointer to code)
    @Exit
    @  R4 = size (Int)
 
@@ -475,7 +475,7 @@
    @  R4 = trans_tab (pointer to OSSpriteOp_TransTab)
    @  R5 = flags (ColourTrans_TableFlags)
    @  R6 = workspace (pointer to Void)
-   @  R7 -> transfer_fn (code)
+   @  R7 = transfer_fn (pointer to code)
    @Exit
    @  R4 = size (Int)
 
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/devicefs.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/devicefs.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/devicefs.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/devicefs.h	2008-02-09 16:56:10.000000000 +0100
@@ -221,7 +221,7 @@
 
 extern os_error *xdevicefs_register (devicefs_register_flags flags,
       devicefs_device_list const *devices,
-      void const *driver,
+      asm_routine driver,
       int handle,
       void *workspace,
       char const *validation,
@@ -230,7 +230,7 @@
       devicefs_d *d);
 extern devicefs_d devicefs_register (devicefs_register_flags flags,
       devicefs_device_list const *devices,
-      void const *driver,
+      asm_routine driver,
       int handle,
       void *workspace,
       char const *validation,
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/DeviceFS.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/DeviceFS.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/DeviceFS.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/DeviceFS.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -76,7 +76,7 @@
    @Entry
    @  R0 = flags (DeviceFS_RegisterFlags)
    @  R1 -> devices (DeviceFS_DeviceList)
-   @  R2 -> driver (code)
+   @  R2 = driver (pointer to code)
    @  R3 = handle (Int)
    @  R4 = workspace (pointer to Void)
    @  R5 -> validation (String)
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/dma.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/dma.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/dma.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/dma.h	2008-02-09 16:56:10.000000000 +0100
@@ -84,11 +84,11 @@
  * Type definitions *
  ********************/
 struct dma_routines
-   {  void *enable;
-      void *disable;
-      void *start;
-      void *completed;
-      void *sync;
+   {  asm_routine enable;
+      asm_routine disable;
+      asm_routine start;
+      asm_routine completed;
+      asm_routine sync;
    };
 
 struct dma_scatter
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/draganobject.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/draganobject.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/draganobject.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/draganobject.h	2008-02-09 16:56:10.000000000 +0100
@@ -50,11 +50,6 @@
 #undef  XDragAnObject_Stop
 #define XDragAnObject_Stop                      0x69C41
 
-/************************************
- * Structure and union declarations *
- ************************************/
-typedef struct draganobject_function_           *draganobject_function;
-
 /************************
  * Constant definitions *
  ************************/
@@ -98,12 +93,12 @@
  */
 
 extern os_error *xdraganobject_start (bits flags,
-      draganobject_function function,
+      asm_routine function,
       os_register_block const *register_block,
       os_box const *box,
       os_box const *bbox);
 extern void draganobject_start (bits flags,
-      draganobject_function function,
+      asm_routine function,
       os_register_block const *register_block,
       os_box const *box,
       os_box const *bbox);
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/DragAnObject.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/DragAnObject.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/DragAnObject.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/DragAnObject.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -33,17 +33,12 @@
 #  define DragAnObject_CallFunction 0x10000
 #  define DragAnObject_FunctionSVC 0x20000
 
- at Symbols for structure offsets and sizes
-@ abstract type
-#  define DragAnObject_Function 4
-
-
 @Symbols for SWI's and SWI reason codes
 .set XDragAnObject_Start,0x69c40
 .set DragAnObject_Start,0x49c40
    @Entry
    @  R0 = flags (Bits)
-   @  R1 = function (DragAnObject_Function)
+   @  R1 = function (pointer to code)
    @  R2 -> register_block (OS_RegisterBlock)
    @  R3 -> box (OS_Box)
    @  R4 -> bbox (OS_Box)
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/econet.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/econet.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/econet.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/econet.h	2008-02-09 16:56:10.000000000 +0100
@@ -212,7 +212,7 @@
 
 typedef int econet_immediate_op;
 
-typedef void *econet_immediate_os_procedure;
+typedef asm_routine econet_immediate_os_procedure;
 
 typedef bits econet_protection;
 
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/filecore.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/filecore.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/filecore.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/filecore.h	2008-02-09 16:56:10.000000000 +0100
@@ -328,8 +328,8 @@
       fileswitch_fs_no fs_no;
       char *title;
       char *boot_text;
-      void *disc_op;
-      void *misc_op;
+      asm_routine disc_op;
+      asm_routine misc_op;
    };
 
 typedef bits filecore_feature_flags;
@@ -747,9 +747,9 @@
       int file_cache_buffer_count,
       bits map_sizes,
       void **instance,
-      void **floppy_done,
-      void **hard_disc_done,
-      void **release_fiq);
+      asm_routine *floppy_done,
+      asm_routine *hard_disc_done,
+      asm_routine *release_fiq);
 extern void filecore_create (filecore_descriptor const *descriptor,
       byte const *module_base,
       byte *word,
@@ -758,9 +758,9 @@
       int file_cache_buffer_count,
       bits map_sizes,
       void **instance,
-      void **floppy_done,
-      void **hard_disc_done,
-      void **release_fiq);
+      asm_routine *floppy_done,
+      asm_routine *hard_disc_done,
+      asm_routine *release_fiq);
 
 /* ------------------------------------------------------------------------
  * Function:      filecore_drives()
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/FileCore.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/FileCore.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/FileCore.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/FileCore.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -306,9 +306,9 @@
    @  R6 = map_sizes (Bits)
    @Exit
    @  R0 = instance (pointer to Void)
-   @  R1 -> floppy_done (code)
-   @  R2 -> hard_disc_done (code)
-   @  R3 -> release_fiq (code)
+   @  R1 = floppy_done (pointer to code)
+   @  R2 = hard_disc_done (pointer to code)
+   @  R3 = release_fiq (pointer to code)
 
 .set XFileCore_Drives,0x60542
 .set FileCore_Drives,0x40542
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/filter.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/filter.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/filter.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/filter.h	2008-02-09 16:56:10.000000000 +0100
@@ -126,11 +126,11 @@
  */
 
 extern os_error *xfilter_register_pre_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 __swi (0x42640) void filter_register_pre_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 
@@ -149,12 +149,12 @@
  */
 
 extern os_error *xfilter_register_post_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task,
       wimp_poll_flags mask);
 extern void filter_register_post_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task,
       wimp_poll_flags mask);
@@ -173,11 +173,11 @@
  */
 
 extern os_error *xfilter_de_register_pre_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 __swi (0x42642) void filter_de_register_pre_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 
@@ -196,12 +196,12 @@
  */
 
 extern os_error *xfilter_de_register_post_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task,
       wimp_poll_flags mask);
 extern void filter_de_register_post_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task,
       wimp_poll_flags mask);
@@ -221,11 +221,11 @@
  */
 
 extern os_error *xfilter_register_rect_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 __swi (0x42644) void filter_register_rect_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 
@@ -244,11 +244,11 @@
  */
 
 extern os_error *xfilter_de_register_rect_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 __swi (0x42645) void filter_de_register_rect_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 
@@ -266,10 +266,10 @@
  */
 
 extern os_error *xfilter_register_copy_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle);
 __swi (0x42646) void filter_register_copy_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -286,10 +286,10 @@
  */
 
 extern os_error *xfilter_de_register_copy_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle);
 __swi (0x42647) void filter_de_register_copy_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -307,11 +307,11 @@
  */
 
 extern os_error *xfilter_register_post_rect_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 __swi (0x42648) void filter_register_post_rect_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 
@@ -330,11 +330,11 @@
  */
 
 extern os_error *xfilter_de_register_post_rect_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 __swi (0x42649) void filter_de_register_post_rect_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 
@@ -353,11 +353,11 @@
  */
 
 extern os_error *xfilter_register_post_icon_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 __swi (0x4264A) void filter_register_post_icon_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 
@@ -376,11 +376,11 @@
  */
 
 extern os_error *xfilter_de_register_post_icon_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 __swi (0x4264B) void filter_de_register_post_icon_filter (char const *filter_name,
-      void const *code,
+      asm_routine code,
       byte *handle,
       wimp_t task);
 
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/Filter.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/Filter.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/Filter.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/Filter.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -29,7 +29,7 @@
 .set Filter_RegisterPreFilter,0x42640
    @Entry
    @  R0 -> filter_name (String)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = task (Wimp_T)
 
@@ -37,7 +37,7 @@
 .set Filter_RegisterPostFilter,0x42641
    @Entry
    @  R0 -> filter_name (String)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = task (Wimp_T)
    @  R4 = mask (Wimp_PollFlags)
@@ -46,7 +46,7 @@
 .set Filter_DeRegisterPreFilter,0x42642
    @Entry
    @  R0 -> filter_name (String)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = task (Wimp_T)
 
@@ -54,7 +54,7 @@
 .set Filter_DeRegisterPostFilter,0x42643
    @Entry
    @  R0 -> filter_name (String)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = task (Wimp_T)
    @  R4 = mask (Wimp_PollFlags)
@@ -63,7 +63,7 @@
 .set Filter_RegisterRectFilter,0x42644
    @Entry
    @  R0 -> filter_name (String)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = task (Wimp_T)
 
@@ -71,7 +71,7 @@
 .set Filter_DeRegisterRectFilter,0x42645
    @Entry
    @  R0 -> filter_name (String)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = task (Wimp_T)
 
@@ -79,21 +79,21 @@
 .set Filter_RegisterCopyFilter,0x42646
    @Entry
    @  R0 -> filter_name (String)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
 
 .set XFilter_DeRegisterCopyFilter,0x62647
 .set Filter_DeRegisterCopyFilter,0x42647
    @Entry
    @  R0 -> filter_name (String)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
 
 .set XFilter_RegisterPostRectFilter,0x62648
 .set Filter_RegisterPostRectFilter,0x42648
    @Entry
    @  R0 -> filter_name (String)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = task (Wimp_T)
 
@@ -101,7 +101,7 @@
 .set Filter_DeRegisterPostRectFilter,0x42649
    @Entry
    @  R0 -> filter_name (String)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = task (Wimp_T)
 
@@ -109,7 +109,7 @@
 .set Filter_RegisterPostIconFilter,0x4264a
    @Entry
    @  R0 -> filter_name (String)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = task (Wimp_T)
 
@@ -117,7 +117,7 @@
 .set Filter_DeRegisterPostIconFilter,0x4264b
    @Entry
    @  R0 -> filter_name (String)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = task (Wimp_T)
 
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/free.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/free.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/free.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/free.h	2008-02-09 16:56:10.000000000 +0100
@@ -76,10 +76,10 @@
  */
 
 extern os_error *xfree_register (fileswitch_fs_no fs_no,
-      void const *fn,
+      asm_routine fn,
       void *workspace);
 __swi (0x444C0) void free_register (fileswitch_fs_no fs_no,
-      void const *fn,
+      asm_routine fn,
       void *workspace);
 
 /* ------------------------------------------------------------------------
@@ -96,10 +96,10 @@
  */
 
 extern os_error *xfree_de_register (fileswitch_fs_no fs_no,
-      void const *fn,
+      asm_routine fn,
       void *workspace);
 __swi (0x444C1) void free_de_register (fileswitch_fs_no fs_no,
-      void const *fn,
+      asm_routine fn,
       void *workspace);
 
 #ifdef __cplusplus
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/Free.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/Free.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/Free.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/Free.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -25,14 +25,14 @@
 .set Free_Register,0x444c0
    @Entry
    @  R0 = fs_no (FileSwitch_FSNo)
-   @  R1 -> fn (code)
+   @  R1 = fn (pointer to code)
    @  R2 = workspace (pointer to Void)
 
 .set XFree_DeRegister,0x644c1
 .set Free_DeRegister,0x444c1
    @Entry
    @  R0 = fs_no (FileSwitch_FSNo)
-   @  R1 -> fn (code)
+   @  R1 = fn (pointer to code)
    @  R2 = workspace (pointer to Void)
 
 #endif
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/imagefilerender.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/imagefilerender.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/imagefilerender.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/imagefilerender.h	2008-02-09 16:56:10.000000000 +0100
@@ -145,12 +145,12 @@
       imagefilerender_magic magic;
       char *name;
       byte *workspace;
-      void *start;
-      void *stop;
-      void *render;
-      void *bbox;
-      void *declare_fonts;
-      void *info;
+      asm_routine start;
+      asm_routine stop;
+      asm_routine render;
+      asm_routine bbox;
+      asm_routine declare_fonts;
+      asm_routine info;
    };
 
 struct imagefilerender_image_descriptor
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/os.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/os.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/os.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/os.h	2008-02-09 16:56:10.000000000 +0100
@@ -1290,7 +1290,7 @@
    (offsetof (os_gs, s) + \
          (N)*sizeof ((os_gs *) NULL)->s)
 
-typedef void *os_sort_type;
+typedef asm_routine os_sort_type;
 
 typedef bits os_area_flags;
 
@@ -2651,22 +2651,22 @@
  * Other notes:   Calls SWI 0xF.
  */
 
-extern os_error *xos_control (void const *error_handler,
+extern os_error *xos_control (asm_routine error_handler,
       os_error *error_buffer,
-      void const *escape_handler,
-      void const *event_handler,
-      void **old_error_handler,
+      asm_routine escape_handler,
+      asm_routine event_handler,
+      asm_routine *old_error_handler,
       os_error **old_error_buffer,
-      void **old_escape_handler,
-      void **old_event_handler);
-extern void os_control (void const *error_handler,
+      asm_routine *old_escape_handler,
+      asm_routine *old_event_handler);
+extern void os_control (asm_routine error_handler,
       os_error *error_buffer,
-      void const *escape_handler,
-      void const *event_handler,
-      void **old_error_handler,
+      asm_routine escape_handler,
+      asm_routine event_handler,
+      asm_routine *old_error_handler,
       os_error **old_error_buffer,
-      void **old_escape_handler,
-      void **old_event_handler);
+      asm_routine *old_escape_handler,
+      asm_routine *old_event_handler);
 
 /* ------------------------------------------------------------------------
  * Function:      os_get_env()
@@ -2726,30 +2726,30 @@
  * Other notes:   Calls SWI 0x12.
  */
 
-extern os_error *xos_set_env (void const *exit_handler,
+extern os_error *xos_set_env (asm_routine exit_handler,
       byte *ram_limit,
-      void const *undefined_instruction_handler,
-      void const *prefetch_abort_handler,
-      void const *data_abort_handler,
-      void const *address_exception_handler,
-      void **old_exit_handler,
+      asm_routine undefined_instruction_handler,
+      asm_routine prefetch_abort_handler,
+      asm_routine data_abort_handler,
+      asm_routine address_exception_handler,
+      asm_routine *old_exit_handler,
       byte **old_ram_limit,
-      void **old_undefined_instruction_handler,
-      void **old_prefetch_abort_handler,
-      void **old_data_abort_handler,
-      void **old_address_exception_handler);
-extern void os_set_env (void const *exit_handler,
+      asm_routine *old_undefined_instruction_handler,
+      asm_routine *old_prefetch_abort_handler,
+      asm_routine *old_data_abort_handler,
+      asm_routine *old_address_exception_handler);
+extern void os_set_env (asm_routine exit_handler,
       byte *ram_limit,
-      void const *undefined_instruction_handler,
-      void const *prefetch_abort_handler,
-      void const *data_abort_handler,
-      void const *address_exception_handler,
-      void **old_exit_handler,
+      asm_routine undefined_instruction_handler,
+      asm_routine prefetch_abort_handler,
+      asm_routine data_abort_handler,
+      asm_routine address_exception_handler,
+      asm_routine *old_exit_handler,
       byte **old_ram_limit,
-      void **old_undefined_instruction_handler,
-      void **old_prefetch_abort_handler,
-      void **old_data_abort_handler,
-      void **old_address_exception_handler);
+      asm_routine *old_undefined_instruction_handler,
+      asm_routine *old_prefetch_abort_handler,
+      asm_routine *old_data_abort_handler,
+      asm_routine *old_address_exception_handler);
 
 /* ------------------------------------------------------------------------
  * Function:      os_int_on()
@@ -2789,13 +2789,13 @@
  */
 
 extern os_error *xos_call_back (os_register_block const *register_block,
-      void const *call_back_handler,
+      asm_routine call_back_handler,
       os_register_block **old_register_block,
-      void **old_call_back_handler);
+      asm_routine *old_call_back_handler);
 extern void os_call_back (os_register_block const *register_block,
-      void const *call_back_handler,
+      asm_routine call_back_handler,
       os_register_block **old_register_block,
-      void **old_call_back_handler);
+      asm_routine *old_call_back_handler);
 
 /* ------------------------------------------------------------------------
  * Function:      os_break_pt()
@@ -2825,13 +2825,13 @@
  */
 
 extern os_error *xos_break_ctrl (os_register_block *register_block,
-      void const *break_pt_handler,
+      asm_routine break_pt_handler,
       os_register_block **old_register_block,
-      void **old_break_pt_handler);
+      asm_routine *old_break_pt_handler);
 extern void os_break_ctrl (os_register_block *register_block,
-      void const *break_pt_handler,
+      asm_routine break_pt_handler,
       os_register_block **old_register_block,
-      void **old_break_pt_handler);
+      asm_routine *old_break_pt_handler);
 
 /* ------------------------------------------------------------------------
  * Function:      os_unused_swi()
@@ -2848,9 +2848,9 @@
  * Other notes:   Calls SWI 0x19.
  */
 
-extern os_error *xos_unused_swi (void const *unused_swi_handler,
-      void **old_unused_swi_handler);
-__swi (0x19) void *os_unused_swi (void const *unused_swi_handler);
+extern os_error *xos_unused_swi (asm_routine unused_swi_handler,
+      asm_routine *old_unused_swi_handler);
+__swi (0x19) asm_routine os_unused_swi (asm_routine unused_swi_handler);
 
 /* ------------------------------------------------------------------------
  * Function:      os_update_memc()
@@ -2941,10 +2941,10 @@
  */
 
 extern os_error *xos_claim (int vector,
-      void const *routine,
+      asm_routine routine,
       byte *handle);
 __swi (0x1F) void os_claim (int vector,
-      void const *routine,
+      asm_routine routine,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -2961,10 +2961,10 @@
  */
 
 extern os_error *xos_release (int vector,
-      void const *routine,
+      asm_routine routine,
       byte *handle);
 __swi (0x20) void os_release (int vector,
-      void const *routine,
+      asm_routine routine,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -3677,10 +3677,10 @@
  */
 
 extern os_error *xos_call_after (int delay,
-      void const *code,
+      asm_routine code,
       byte *handle);
 __swi (0x3B) void os_call_after (int delay,
-      void const *code,
+      asm_routine code,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -3696,10 +3696,10 @@
  */
 
 extern os_error *xos_call_every (int delay,
-      void const *code,
+      asm_routine code,
       byte *handle);
 __swi (0x3C) void os_call_every (int delay,
-      void const *code,
+      asm_routine code,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -3714,9 +3714,9 @@
  * Other notes:   Calls SWI 0x3D.
  */
 
-extern os_error *xos_remove_ticker_event (void const *code,
+extern os_error *xos_remove_ticker_event (asm_routine code,
       byte *handle);
-__swi (0x3D) void os_remove_ticker_event (void const *code,
+__swi (0x3D) void os_remove_ticker_event (asm_routine code,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -3856,14 +3856,14 @@
  */
 
 extern os_error *xos_change_environment (os_handler_type handler_type,
-      void const *handler,
+      asm_routine handler,
       byte *handle,
       byte *buffer,
-      void **old_handler,
+      asm_routine *old_handler,
       byte **old_handle,
       byte **old_buffer);
-extern void *os_change_environment (os_handler_type handler_type,
-      void const *handler,
+extern asm_routine os_change_environment (os_handler_type handler_type,
+      asm_routine handler,
       byte *handle,
       byte *buffer,
       byte **old_handle,
@@ -3889,14 +3889,14 @@
  */
 
 extern os_error *xchangeenvironmentv (os_handler_type handler_type,
-      void const *handler,
+      asm_routine handler,
       byte *handle,
       byte *buffer,
-      void **old_handler,
+      asm_routine *old_handler,
       byte **old_handle,
       byte **old_buffer);
-extern void *changeenvironmentv (os_handler_type handler_type,
-      void const *handler,
+extern asm_routine changeenvironmentv (os_handler_type handler_type,
+      asm_routine handler,
       byte *handle,
       byte *buffer,
       byte **old_handle,
@@ -4100,10 +4100,10 @@
  */
 
 extern os_error *xos_add_to_vector (int vector,
-      void const *routine,
+      asm_routine routine,
       byte *handle);
 __swi (0x47) void os_add_to_vector (int vector,
-      void const *routine,
+      asm_routine routine,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -4181,12 +4181,12 @@
  */
 
 extern os_error *xos_claim_device_vector (os_device_type device,
-      void const *driver,
+      asm_routine driver,
       byte *handle,
       int *status,
       bits mask);
 extern void os_claim_device_vector (os_device_type device,
-      void const *driver,
+      asm_routine driver,
       byte *handle,
       int *status,
       bits mask);
@@ -4206,12 +4206,12 @@
  */
 
 extern os_error *xos_release_device_vector (os_device_type device,
-      void const *driver,
+      asm_routine driver,
       byte *handle,
       int *status,
       bits mask);
 extern void os_release_device_vector (os_device_type device,
-      void const *driver,
+      asm_routine driver,
       byte *handle,
       int *status,
       bits mask);
@@ -4392,9 +4392,9 @@
  * Other notes:   Calls SWI 0x54.
  */
 
-extern os_error *xos_add_call_back (void const *call_back,
+extern os_error *xos_add_call_back (asm_routine call_back,
       byte *handle);
-__swi (0x54) void os_add_call_back (void const *call_back,
+__swi (0x54) void os_add_call_back (asm_routine call_back,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -4414,10 +4414,10 @@
  */
 
 extern os_error *xos_read_default_handler (int handler_type,
-      void **handler,
+      asm_routine *handler,
       byte **handle,
       byte **buffer);
-extern void *os_read_default_handler (int handler_type,
+extern asm_routine os_read_default_handler (int handler_type,
       byte **handle,
       byte **buffer);
 
@@ -4599,9 +4599,9 @@
  * Other notes:   Calls SWI 0x5F.
  */
 
-extern os_error *xos_remove_call_back (void const *call_back,
+extern os_error *xos_remove_call_back (asm_routine call_back,
       byte *handle);
-__swi (0x5F) void os_remove_call_back (void const *call_back,
+__swi (0x5F) void os_remove_call_back (asm_routine call_back,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -4672,10 +4672,10 @@
  */
 
 extern os_error *xos_claim_swi (int swi,
-      void const *routine,
+      asm_routine routine,
       byte *handle);
 __swi (0x62) void os_claim_swi (int swi,
-      void const *routine,
+      asm_routine routine,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -4691,10 +4691,10 @@
  */
 
 extern os_error *xos_release_swi (int swi,
-      void const *routine,
+      asm_routine routine,
       byte *handle);
 __swi (0x63) void os_release_swi (int swi,
-      void const *routine,
+      asm_routine routine,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -4962,7 +4962,7 @@
       byte const *base_address,
       os_area_flags flags,
       int size_limit,
-      void const *handler,
+      asm_routine handler,
       void *workspace,
       char const *description,
       os_dynamic_area_no *area_out,
@@ -4973,7 +4973,7 @@
       byte const *base_address,
       os_area_flags flags,
       int size_limit,
-      void const *handler,
+      asm_routine handler,
       void *workspace,
       char const *description,
       byte **base_address_out,
@@ -5015,7 +5015,7 @@
       byte **base_address,
       os_area_flags *flags,
       int *size_limit,
-      void **handler,
+      asm_routine *handler,
       void **workspace,
       char **description);
 extern void osdynamicarea_read (os_dynamic_area_no area,
@@ -5023,7 +5023,7 @@
       byte **base_address,
       os_area_flags *flags,
       int *size_limit,
-      void **handler,
+      asm_routine *handler,
       void **workspace,
       char **description);
 
@@ -5343,9 +5343,9 @@
  */
 
 extern os_error *xosmemory_read_controller (osmemory_controller_flags controller,
-      void **controller_addr);
+      asm_routine *controller_addr);
 extern void osmemory_read_controller (osmemory_controller_flags controller,
-      void **controller_addr);
+      asm_routine *controller_addr);
 
 /* ------------------------------------------------------------------------
  * Function:      osmemory_find_contiguous()
@@ -5468,10 +5468,10 @@
  */
 
 extern os_error *xosclaimprocessorvector_alloc (bits vector,
-      void const *routine,
-      void **old_routine);
-extern void *osclaimprocessorvector_alloc (bits vector,
-      void const *routine);
+      asm_routine routine,
+      asm_routine *old_routine);
+extern asm_routine osclaimprocessorvector_alloc (bits vector,
+      asm_routine routine);
 
 /* ------------------------------------------------------------------------
  * Function:      osclaimprocessorvector_free()
@@ -5485,9 +5485,9 @@
  */
 
 extern os_error *xosclaimprocessorvector_free (bits vector,
-      void const *old_routine);
+      asm_routine old_routine);
 extern void osclaimprocessorvector_free (bits vector,
-      void const *old_routine);
+      asm_routine old_routine);
 
 /* ------------------------------------------------------------------------
  * Function:      os_reset()
@@ -5536,8 +5536,8 @@
  */
 
 extern os_error *xosplatformfeatures_get_features (os_platform_feature_flags *flags,
-      void **predisable_fn);
-extern os_platform_feature_flags osplatformfeatures_get_features (void **predisable_fn);
+      asm_routine *predisable_fn);
+extern os_platform_feature_flags osplatformfeatures_get_features (asm_routine *predisable_fn);
 
 /* ------------------------------------------------------------------------
  * Function:      os_synchronise_code_areas()
@@ -5553,11 +5553,11 @@
  */
 
 extern os_error *xos_synchronise_code_areas (bits flags,
-      void const *start,
-      void const *end);
+      asm_routine start,
+      asm_routine end);
 __swi (0x6E) void os_synchronise_code_areas (bits flags,
-      void const *start,
-      void const *end);
+      asm_routine start,
+      asm_routine end);
 
 /* ------------------------------------------------------------------------
  * Function:      osambcontrol_create()
@@ -5734,14 +5734,14 @@
  */
 
 extern os_error *xosclaimosswi_claim (int swi,
-      void const *routine,
+      asm_routine routine,
       byte *handle,
-      void **old_routine,
+      asm_routine *old_routine,
       byte **old_handle);
 extern void osclaimosswi_claim (int swi,
-      void const *routine,
+      asm_routine routine,
       byte *handle,
-      void **old_routine,
+      asm_routine *old_routine,
       byte **old_handle);
 
 /* ------------------------------------------------------------------------
@@ -5757,10 +5757,10 @@
  */
 
 extern os_error *xosclaimosswi_release (int swi,
-      void const *routine,
+      asm_routine routine,
       byte *handle);
 extern void osclaimosswi_release (int swi,
-      void const *routine,
+      asm_routine routine,
       byte *handle);
 
 /* ------------------------------------------------------------------------
@@ -5834,9 +5834,9 @@
 
 extern os_error *xos_hardware_find_hal_routine (os_hardware_flags flags,
       int call,
-      void **routine,
+      asm_routine *routine,
       int *static_base);
-extern void *os_hardware_find_hal_routine (os_hardware_flags flags,
+extern asm_routine os_hardware_find_hal_routine (os_hardware_flags flags,
       int call,
       int *static_base);
 
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/OS.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/OS.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/OS.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/OS.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -1278,15 +1278,15 @@
 .set XOS_Control,0x2000f
 .set OS_Control,0xf
    @Entry
-   @  R0 -> error_handler (code)
+   @  R0 = error_handler (pointer to code)
    @  R1 = error_buffer (pointer to OS_Error)
-   @  R2 -> escape_handler (code)
-   @  R3 -> event_handler (code)
+   @  R2 = escape_handler (pointer to code)
+   @  R3 = event_handler (pointer to code)
    @Exit
-   @  R0 -> old_error_handler (code)
+   @  R0 = old_error_handler (pointer to code)
    @  R1 = old_error_buffer (pointer to OS_Error)
-   @  R2 -> old_escape_handler (code)
-   @  R3 -> old_event_handler (code)
+   @  R2 = old_escape_handler (pointer to code)
+   @  R3 = old_event_handler (pointer to code)
 
 .set XOS_GetEnv,0x20010
 .set OS_GetEnv,0x10
@@ -1305,19 +1305,19 @@
 .set XOS_SetEnv,0x20012
 .set OS_SetEnv,0x12
    @Entry
-   @  R0 -> exit_handler (code)
+   @  R0 = exit_handler (pointer to code)
    @  R1 = ram_limit (pointer to data)
-   @  R4 -> undefined_instruction_handler (code)
-   @  R5 -> prefetch_abort_handler (code)
-   @  R6 -> data_abort_handler (code)
-   @  R7 -> address_exception_handler (code)
+   @  R4 = undefined_instruction_handler (pointer to code)
+   @  R5 = prefetch_abort_handler (pointer to code)
+   @  R6 = data_abort_handler (pointer to code)
+   @  R7 = address_exception_handler (pointer to code)
    @Exit
-   @  R0 -> old_exit_handler (code)
+   @  R0 = old_exit_handler (pointer to code)
    @  R1 = old_ram_limit (pointer to data)
-   @  R4 -> old_undefined_instruction_handler (code)
-   @  R5 -> old_prefetch_abort_handler (code)
-   @  R6 -> old_data_abort_handler (code)
-   @  R7 -> old_address_exception_handler (code)
+   @  R4 = old_undefined_instruction_handler (pointer to code)
+   @  R5 = old_prefetch_abort_handler (pointer to code)
+   @  R6 = old_data_abort_handler (pointer to code)
+   @  R7 = old_address_exception_handler (pointer to code)
 
 .set XOS_IntOn,0x20013
 .set OS_IntOn,0x13
@@ -1331,10 +1331,10 @@
 .set OS_CallBack,0x15
    @Entry
    @  R0 -> register_block (OS_RegisterBlock)
-   @  R1 -> call_back_handler (code)
+   @  R1 = call_back_handler (pointer to code)
    @Exit
    @  R0 -> old_register_block (OS_RegisterBlock)
-   @  R1 -> old_call_back_handler (code)
+   @  R1 = old_call_back_handler (pointer to code)
 
 .set XOS_EnterOS,0x20016
 .set OS_EnterOS,0x16
@@ -1349,17 +1349,17 @@
 .set OS_BreakCtrl,0x18
    @Entry
    @  R0 = register_block (pointer to OS_RegisterBlock)
-   @  R1 -> break_pt_handler (code)
+   @  R1 = break_pt_handler (pointer to code)
    @Exit
    @  R0 = old_register_block (pointer to OS_RegisterBlock)
-   @  R1 -> old_break_pt_handler (code)
+   @  R1 = old_break_pt_handler (pointer to code)
 
 .set XOS_UnusedSWI,0x20019
 .set OS_UnusedSWI,0x19
    @Entry
-   @  R0 -> unused_swi_handler (code)
+   @  R0 = unused_swi_handler (pointer to code)
    @Exit
-   @  R0 -> old_unused_swi_handler (code)
+   @  R0 = old_unused_swi_handler (pointer to code)
 
 #  define UKSWIV 0x18
 
@@ -1396,14 +1396,14 @@
 .set OS_Claim,0x1f
    @Entry
    @  R0 = vector (Int)
-   @  R1 -> routine (code)
+   @  R1 = routine (pointer to code)
    @  R2 = handle (pointer to data)
 
 .set XOS_Release,0x20020
 .set OS_Release,0x20
    @Entry
    @  R0 = vector (Int)
-   @  R1 -> routine (code)
+   @  R1 = routine (pointer to code)
    @  R2 = handle (pointer to data)
 
 .set XOS_ReadUnsigned,0x20021
@@ -1694,20 +1694,20 @@
 .set OS_CallAfter,0x3b
    @Entry
    @  R0 = delay (Int)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
 
 .set XOS_CallEvery,0x2003c
 .set OS_CallEvery,0x3c
    @Entry
    @  R0 = delay (Int)
-   @  R1 -> code (code)
+   @  R1 = code (pointer to code)
    @  R2 = handle (pointer to data)
 
 .set XOS_RemoveTickerEvent,0x2003d
 .set OS_RemoveTickerEvent,0x3d
    @Entry
-   @  R0 -> code (code)
+   @  R0 = code (pointer to code)
    @  R1 = handle (pointer to data)
 
 #  define TickerV 0x1c
@@ -1764,23 +1764,23 @@
 .set OS_ChangeEnvironment,0x40
    @Entry
    @  R0 = handler_type (OS_HandlerType)
-   @  R1 -> handler (code)
+   @  R1 = handler (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = buffer (pointer to data)
    @Exit
-   @  R1 -> old_handler (code)
+   @  R1 = old_handler (pointer to code)
    @  R2 = old_handle (pointer to data)
    @  R3 = old_buffer (pointer to data)
 
 #  define ChangeEnvironmentV 0x1e
    @Entry
    @  R0 = handler_type (OS_HandlerType)
-   @  R1 -> handler (code)
+   @  R1 = handler (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = buffer (pointer to data)
    @  R9 = &1E
    @Exit
-   @  R1 -> old_handler (code)
+   @  R1 = old_handler (pointer to code)
    @  R2 = old_handle (pointer to data)
    @  R3 = old_buffer (pointer to data)
 
@@ -1856,7 +1856,7 @@
 .set OS_AddToVector,0x47
    @Entry
    @  R0 = vector (Int)
-   @  R1 -> routine (code)
+   @  R1 = routine (pointer to code)
    @  R2 = handle (pointer to data)
 
 .set XOS_WriteEnv,0x20048
@@ -1885,7 +1885,7 @@
 .set OS_ClaimDeviceVector,0x4b
    @Entry
    @  R0 = device (OS_DeviceType)
-   @  R1 -> driver (code)
+   @  R1 = driver (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = status (pointer to Int)
    @  R4 = mask (Bits)
@@ -1894,7 +1894,7 @@
 .set OS_ReleaseDeviceVector,0x4c
    @Entry
    @  R0 = device (OS_DeviceType)
-   @  R1 -> driver (code)
+   @  R1 = driver (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = status (pointer to Int)
    @  R4 = mask (Bits)
@@ -1962,7 +1962,7 @@
 .set XOS_AddCallBack,0x20054
 .set OS_AddCallBack,0x54
    @Entry
-   @  R0 -> call_back (code)
+   @  R0 = call_back (pointer to code)
    @  R1 = handle (pointer to data)
 
 .set XOS_ReadDefaultHandler,0x20055
@@ -1970,7 +1970,7 @@
    @Entry
    @  R0 = handler_type (Int)
    @Exit
-   @  R1 -> handler (code)
+   @  R1 = handler (pointer to code)
    @  R2 = handle (pointer to data)
    @  R3 = buffer (pointer to data)
 
@@ -2038,7 +2038,7 @@
 .set XOS_RemoveCallBack,0x2005f
 .set OS_RemoveCallBack,0x5f
    @Entry
-   @  R0 -> call_back (code)
+   @  R0 = call_back (pointer to code)
    @  R1 = handle (pointer to data)
 
 .set XOS_FindMemMapEntries,0x20060
@@ -2065,14 +2065,14 @@
 .set OS_ClaimSWI,0x62
    @Entry
    @  R0 = swi (Int)
-   @  R1 -> routine (code)
+   @  R1 = routine (pointer to code)
    @  R2 = handle (pointer to data)
 
 .set XOS_ReleaseSWI,0x20063
 .set OS_ReleaseSWI,0x63
    @Entry
    @  R0 = swi (Int)
-   @  R1 -> routine (code)
+   @  R1 = routine (pointer to code)
    @  R2 = handle (pointer to data)
 
 .set XOS_Pointer,0x20064
@@ -2189,7 +2189,7 @@
    @  R3 -> base_address (data)
    @  R4 = flags (OS_AreaFlags)
    @  R5 = size_limit (Int)
-   @  R6 -> handler (code)
+   @  R6 = handler (pointer to code)
    @  R7 = workspace (pointer to Void)
    @  R8 -> description (String)
    @Exit
@@ -2211,7 +2211,7 @@
    @  R3 -> base_address (data)
    @  R4 = flags (OS_AreaFlags)
    @  R5 = size_limit (Int)
-   @  R6 -> handler (code)
+   @  R6 = handler (pointer to code)
    @  R7 = workspace (pointer to Void)
    @  R8 -> description (String)
 
@@ -2332,7 +2332,7 @@
    @  R0 = &9
    @  R1 = controller (OSMemory_ControllerFlags)
    @Exit
-   @  R1 -> controller_addr (code)
+   @  R1 = controller_addr (pointer to code)
 
 #  define OSMemory_FindContiguous 0xc
    @Entry
@@ -2376,14 +2376,14 @@
 #  define OSClaimProcessorVector_Alloc 0x100
    @Entry
    @  R0 = &100 :OR: vector (Bits)
-   @  R1 -> routine (code)
+   @  R1 = routine (pointer to code)
    @Exit
-   @  R1 -> old_routine (code)
+   @  R1 = old_routine (pointer to code)
 
 #  define OSClaimProcessorVector_Free 0x0
    @Entry
    @  R0 = &0 :OR: vector (Bits)
-   @  R2 -> old_routine (code)
+   @  R2 = old_routine (pointer to code)
    @Exit
    @  R1 corrupted
 
@@ -2408,14 +2408,14 @@
    @  R0 = &0
    @Exit
    @  R0 = flags (OS_PlatformFeatureFlags)
-   @  R1 -> predisable_fn (code)
+   @  R1 = predisable_fn (pointer to code)
 
 .set XOS_SynchroniseCodeAreas,0x2006e
 .set OS_SynchroniseCodeAreas,0x6e
    @Entry
    @  R0 = flags (Bits)
-   @  R1 -> start (code)
-   @  R2 -> end (code)
+   @  R1 = start (pointer to code)
+   @  R2 = end (pointer to code)
 
 .set XOS_CallASWI,0x2006f
 .set OS_CallASWI,0x6f
@@ -2490,17 +2490,17 @@
    @Entry
    @  R0 = &0
    @  R1 = swi (Int)
-   @  R2 -> routine (code)
+   @  R2 = routine (pointer to code)
    @  R3 = handle (pointer to data)
    @Exit
-   @  R2 -> old_routine (code)
+   @  R2 = old_routine (pointer to code)
    @  R3 = old_handle (pointer to data)
 
 #  define OSClaimOSSWI_Release 0x1
    @Entry
    @  R0 = &1
    @  R1 = swi (Int)
-   @  R2 -> routine (code)
+   @  R2 = routine (pointer to code)
    @  R3 = handle (pointer to data)
 
 .set XOS_Hardware,0x2007a
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/osspriteop.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/osspriteop.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/osspriteop.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/osspriteop.h	2008-02-09 16:56:10.000000000 +0100
@@ -200,7 +200,7 @@
 
 struct osspriteop_colour_mapping
    {  byte *workspace;
-      void *function;
+      asm_routine function;
    };
 
 struct osspriteop_area
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/pdriver.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/pdriver.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/pdriver.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/pdriver.h	2008-02-09 16:56:10.000000000 +0100
@@ -1122,10 +1122,10 @@
  * Other notes:   Calls SWI 0x80156.
  */
 
-extern os_error *xpdriver_declare_driver (int reason,
+extern os_error *xpdriver_declare_driver (asm_routine reason,
       void *workspace,
       pdriver_type type);
-__swi (0x80156) void pdriver_declare_driver (int reason,
+__swi (0x80156) void pdriver_declare_driver (asm_routine reason,
       void *workspace,
       pdriver_type type);
 
@@ -1269,13 +1269,13 @@
 extern os_error *xpdrivermiscop_register_dumper (int pdumper_no,
       int dp_version_required,
       void *dumper_workspace,
-      void const *dumper_code,
+      asm_routine dumper_code,
       bits supported_calls,
       bits supported_strips);
 extern void pdrivermiscop_register_dumper (int pdumper_no,
       int dp_version_required,
       void *dumper_workspace,
-      void const *dumper_code,
+      asm_routine dumper_code,
       bits supported_calls,
       bits supported_strips);
 
@@ -1410,14 +1410,14 @@
 extern os_error *xpdrivermiscopfordriver_register_dumper (int pdumper_no,
       int dp_version_required,
       void *dumper_workspace,
-      void const *dumper_code,
+      asm_routine dumper_code,
       bits supported_calls,
       bits supported_strips,
       pdriver_type type);
 extern void pdrivermiscopfordriver_register_dumper (int pdumper_no,
       int dp_version_required,
       void *dumper_workspace,
-      void const *dumper_code,
+      asm_routine dumper_code,
       bits supported_calls,
       bits supported_strips,
       pdriver_type type);
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/PDriver.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/PDriver.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/PDriver.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/PDriver.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -477,7 +477,7 @@
 .set XPDriver_DeclareDriver,0xa0156
 .set PDriver_DeclareDriver,0x80156
    @Entry
-   @  R0 = reason (Int)
+   @  R0 = reason (pointer to code)
    @  R1 = workspace (pointer to Void)
    @  R2 = type (PDriver_Type)
 
@@ -535,7 +535,7 @@
    @  R1 = pdumper_no (Int)
    @  R2 = dp_version_required (Int)
    @  R3 = dumper_workspace (pointer to Void)
-   @  R4 -> dumper_code (code)
+   @  R4 = dumper_code (pointer to code)
    @  R5 = supported_calls (Bits)
    @  R6 = supported_strips (Bits)
 
@@ -588,7 +588,7 @@
    @  R1 = pdumper_no (Int)
    @  R2 = dp_version_required (Int)
    @  R3 = dumper_workspace (pointer to Void)
-   @  R4 -> dumper_code (code)
+   @  R4 = dumper_code (pointer to code)
    @  R5 = supported_calls (Bits)
    @  R6 = supported_strips (Bits)
    @  R8 = type (PDriver_Type)
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/podule.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/podule.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/podule.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/podule.h	2008-02-09 16:56:10.000000000 +0100
@@ -626,30 +626,30 @@
       bits status_bits,
       int *irq_location,
       bits irq_bits,
-      void const *read_code,
-      void const *write_code,
+      asm_routine read_code,
+      asm_routine write_code,
       osbool *unclaimed,
       byte **controller_out,
       int **status_location_out,
       bits *status_bits_out,
       int **irq_location_out,
       bits *irq_bits_out,
-      void **read_code_out,
-      void **write_code_out);
+      asm_routine *read_code_out,
+      asm_routine *write_code_out);
 extern osbool service_adfs_podule_ide (byte *controller,
       int *status_location,
       bits status_bits,
       int *irq_location,
       bits irq_bits,
-      void const *read_code,
-      void const *write_code,
+      asm_routine read_code,
+      asm_routine write_code,
       byte **controller_out,
       int **status_location_out,
       bits *status_bits_out,
       int **irq_location_out,
       bits *irq_bits_out,
-      void **read_code_out,
-      void **write_code_out);
+      asm_routine *read_code_out,
+      asm_routine *write_code_out);
 
 /* ------------------------------------------------------------------------
  * Function:      service_adfs_podule_ide_dying()
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/Podule.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/Podule.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/Podule.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/Podule.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -215,8 +215,8 @@
    @  R4 = status_bits (Bits)
    @  R5 = irq_location (pointer to Int)
    @  R6 = irq_bits (Bits)
-   @  R7 -> read_code (code)
-   @  R8 -> write_code (code)
+   @  R7 = read_code (pointer to code)
+   @  R8 = write_code (pointer to code)
    @Exit
    @  R1 = unclaimed (Bool)
    @  R2 = controller_out (pointer to data)
@@ -224,8 +224,8 @@
    @  R4 = status_bits_out (Bits)
    @  R5 = irq_location_out (pointer to Int)
    @  R6 = irq_bits_out (Bits)
-   @  R7 -> read_code_out (code)
-   @  R8 -> write_code_out (code)
+   @  R7 = read_code_out (pointer to code)
+   @  R8 = write_code_out (pointer to code)
 
 #  define Service_ADFSPoduleIDEDying 0x10802
    @Entry
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/resourcefs.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/resourcefs.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/resourcefs.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/resourcefs.h	2008-02-09 16:56:10.000000000 +0100
@@ -202,9 +202,9 @@
  * Other notes:   Calls SWI 0x30 with R1 = 0x60.
  */
 
-extern os_error *xservice_resource_fs_starting (void const *register_files,
+extern os_error *xservice_resource_fs_starting (asm_routine register_files,
       void *workspace);
-extern void service_resource_fs_starting (void const *register_files,
+extern void service_resource_fs_starting (asm_routine register_files,
       void *workspace);
 
 #ifdef __cplusplus
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/ResourceFS.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/ResourceFS.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/ResourceFS.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/ResourceFS.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -93,7 +93,7 @@
 #  define Service_ResourceFSStarting 0x60
    @Entry
    @  R1 = &60
-   @  R2 -> register_files (code)
+   @  R2 = register_files (pointer to code)
    @  R3 = workspace (pointer to Void)
 
 #endif
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/scsi.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/scsi.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/scsi.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/scsi.h	2008-02-09 16:56:10.000000000 +0100
@@ -460,7 +460,7 @@
       byte *start_addr,
       int length,
       int timeout,
-      void const *callback_code,
+      asm_routine callback_code,
       void *workspace,
       int access_key,
       int *op_id,
@@ -472,7 +472,7 @@
       byte *start_addr,
       int length,
       int timeout,
-      void const *callback_code,
+      asm_routine callback_code,
       void *workspace,
       int access_key,
       int *op_id,
@@ -510,11 +510,11 @@
  */
 
 extern os_error *xscsireserve_claim (int device_id,
-      void const *release_code,
+      asm_routine release_code,
       void *workspace,
       int access_key);
 extern void scsireserve_claim (int device_id,
-      void const *release_code,
+      asm_routine release_code,
       void *workspace,
       int access_key);
 
@@ -534,11 +534,11 @@
  */
 
 extern os_error *xscsireserve_force_claim (int device_id,
-      void const *release_code,
+      asm_routine release_code,
       void *workspace,
       int access_key);
 extern void scsireserve_force_claim (int device_id,
-      void const *release_code,
+      asm_routine release_code,
       void *workspace,
       int access_key);
 
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/SCSI.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/SCSI.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/SCSI.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/SCSI.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -188,7 +188,7 @@
    @  R3 = start_addr (pointer to data)
    @  R4 = length (Int)
    @  R5 = timeout (Int)
-   @  R6 -> callback_code (code)
+   @  R6 = callback_code (pointer to code)
    @  R7 = workspace (pointer to Void)
    @  R8 = access_key (Int)
    @Exit
@@ -213,7 +213,7 @@
    @Entry
    @  R0 = &0
    @  R1 = device_id (Int)
-   @  R2 -> release_code (code)
+   @  R2 = release_code (pointer to code)
    @  R3 = workspace (pointer to Void)
    @  R8 = access_key (Int)
 
@@ -221,7 +221,7 @@
    @Entry
    @  R0 = &1
    @  R1 = device_id (Int)
-   @  R2 -> release_code (code)
+   @  R2 = release_code (pointer to code)
    @  R3 = workspace (pointer to Void)
    @  R8 = access_key (Int)
 
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/sound.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/sound.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/sound.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/sound.h	2008-02-09 16:56:10.000000000 +0100
@@ -200,8 +200,8 @@
    };
 
 struct sound_channel_handler
-   {  void *fill_code;
-      void *overrun_fixup_code;
+   {  asm_routine fill_code;
+      asm_routine overrun_fixup_code;
       sound_log_table *log_table;
       sound_log_scale_table *log_scale_table;
    };
@@ -224,7 +224,7 @@
    };
 
 struct sound_scheduler
-   {  void *scheduler;
+   {  asm_routine scheduler;
    };
 
 struct sound_voice_generator
@@ -421,14 +421,14 @@
  */
 
 extern os_error *xsound_linear_handler (osbool install,
-      void const *new_handler_code,
+      asm_routine new_handler_code,
       void *new_workspace,
-      void **old_handler_code,
+      asm_routine *old_handler_code,
       void **old_workspace);
 extern void sound_linear_handler (osbool install,
-      void const *new_handler_code,
+      asm_routine new_handler_code,
       void *new_workspace,
-      void **old_handler_code,
+      asm_routine *old_handler_code,
       void **old_workspace);
 
 /* ------------------------------------------------------------------------
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/Sound.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/Sound.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/Sound.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/Sound.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -151,10 +151,10 @@
 .set Sound_LinearHandler,0x40145
    @Entry
    @  R0 = install (Bool)
-   @  R1 -> new_handler_code (code)
+   @  R1 = new_handler_code (pointer to code)
    @  R2 = new_workspace (pointer to Void)
    @Exit
-   @  R1 -> old_handler_code (code)
+   @  R1 = old_handler_code (pointer to code)
    @  R2 = old_workspace (pointer to Void)
 
 .set XSound_SampleRate,0x60146
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/taskmanager.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/taskmanager.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/taskmanager.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/taskmanager.h	2008-02-09 16:56:10.000000000 +0100
@@ -204,8 +204,8 @@
  * Other notes:   Calls SWI 0x30 with R1 = 0x42680.
  */
 
-extern os_error *xservice_task_manager_acknowledgements (void *add_message);
-extern void service_task_manager_acknowledgements (void *add_message);
+extern os_error *xservice_task_manager_acknowledgements (asm_routine add_message);
+extern void service_task_manager_acknowledgements (asm_routine add_message);
 
 #ifdef __cplusplus
    }
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/territory.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/territory.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/territory.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/territory.h	2008-02-09 16:56:10.000000000 +0100
@@ -216,7 +216,7 @@
 typedef int territory_alphabet_number;
 
 struct territory_data
-   {  void *e [43];
+   {  asm_routine e [43];
    };
 
 struct territory_ordinals
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/types.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/types.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/types.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/types.h	2008-02-09 16:56:10.000000000 +0100
@@ -21,12 +21,21 @@
    Foundation, Inc, 675 Mass Ave, Cambridge, MA 02139, U S A.
 */
 
+#if defined NAMESPACE_OSLIB
+  namespace OSLib {
+#endif
+
 /********************
  * Type definitions *
  ********************/
 typedef unsigned int                            bits;
 typedef int                                     osbool;
 typedef unsigned char                           byte;
+/* 'asm_routine' is a pointer to an assembler routine which does not
+   necessary requires an APCS-32 binding. Typically such a routine is called
+   directly from one of the RISC OS modules using a non-uniform calling
+   convention.  */
+typedef void (*asm_routine)(void);
 
 /* for backward compatibility with non C++ and pre-C99 code
 ** we can typedef |bool| as |osbool|. Anyone who wants to provide
@@ -141,4 +150,8 @@
 #define NOT_USED(x) {x = x;}
 #define UNSET(x) {(void) &x;}
 
+#if defined NAMESPACE_OSLIB
+  } 
+#endif
+
 #endif
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/wimp.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/wimp.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/wimp.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/wimp.h	2008-02-09 16:56:10.000000000 +0100
@@ -783,16 +783,16 @@
       os_box initial;
       os_box bbox;
       byte *handle;
-      void *draw;
-      void *undraw;
-      void *redraw;
+      asm_routine draw;
+      asm_routine undraw;
+      asm_routine redraw;
    };
 
 struct wimp_auto_scroll_info
    {  wimp_w w;
       os_box pause_zone_sizes;
       int pause_duration;
-      void *state_change;
+      asm_routine state_change;
       byte *handle;
    };
 
@@ -1726,8 +1726,8 @@
       /*RISC O S 4.32+*/
 #define wimp_SCROLL_DOUBLE_EXTENDED_RIGHT       ((wimp_scroll_direction) 0x8u)
       /*RISC O S 4.32+*/
-#define wimp_AUTO_SCROLL_NO_HANDLER             ((void *) 0x0u)
-#define wimp_AUTO_SCROLL_DEFAULT_HANDLER        ((void *) 0x1u)
+#define wimp_AUTO_SCROLL_NO_HANDLER             ((asm_routine) 0x0u)
+#define wimp_AUTO_SCROLL_DEFAULT_HANDLER        ((asm_routine) 0x1u)
 #define wimp_PRE_QUIT_TASK_ONLY                 ((wimp_pre_quit_flags) 0x1u)
 #define wimp_CLAIM_CARET_OR_SELECTION           ((wimp_claim_flags) 0x3u)
       /*caret or selection being claimed*/
@@ -3322,10 +3322,10 @@
  */
 
 extern os_error *xwimp_register_filter (wimp_filter_action type,
-      void const *filter_code,
+      asm_routine filter_code,
       byte *handle);
 __swi (0x400F5) void wimp_register_filter (wimp_filter_action type,
-      void const *filter_code,
+      asm_routine filter_code,
       byte *handle);
 
 /* ------------------------------------------------------------------------
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/Wimp.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/Wimp.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/Wimp.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/Wimp.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -2042,7 +2042,7 @@
 .set Wimp_RegisterFilter,0x400f5
    @Entry
    @  R0 = type (Wimp_FilterAction)
-   @  R1 -> filter_code (code)
+   @  R1 = filter_code (pointer to code)
    @  R2 = handle (pointer to data)
    @Exit
    @  R0 corrupted
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/zapredraw.h /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/zapredraw.h
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/zapredraw.h	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/zapredraw.h	2008-02-09 16:56:10.000000000 +0100
@@ -493,10 +493,10 @@
  */
 
 extern os_error *xzapredraw_redraw_area (zapredraw_block const *redraw_block,
-      void const *extension_fn,
+      asm_routine extension_fn,
       void *extension_handle);
 extern void zapredraw_redraw_area (zapredraw_block const *redraw_block,
-      void const *extension_fn,
+      asm_routine extension_fn,
       void *extension_handle);
 
 /* ------------------------------------------------------------------------
diff -ru -I '.*ritten by .*' /home/joty/projects/oslib/cp_before_asm_change/oslib/ZapRedraw.Hdr /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/ZapRedraw.Hdr
--- /home/joty/projects/oslib/cp_before_asm_change/oslib/ZapRedraw.Hdr	2008-02-09 12:10:41.000000000 +0100
+++ /home/joty/projects/gccsdk/riscos2/env_elf/include/oslib/ZapRedraw.Hdr	2008-02-09 16:56:10.000000000 +0100
@@ -270,7 +270,7 @@
 .set ZapRedraw_RedrawArea,0x48480
    @Entry
    @  R1 -> redraw_block (ZapRedraw_Block)
-   @  R2 -> extension_fn (code)
+   @  R2 = extension_fn (pointer to code)
    @  R3 = extension_handle (pointer to Void)
    @Exit
    @  R0 corrupted


More information about the oslib-user mailing list