.os_word_21
 LDRB    R14, [R1, #0]			;get the parameter
 TEQ     R14, #3			;set mouse position?
 BEQ     os_word_21_3
 TEQ     R14, #1			;set mouse bounding box?
 BEQ     os_word_21_1
 TEQ     R14, #0			;Define pointer?
 BNE     vector_handler_forward		;NO

 BL      check_taskID			;is the task supported?
 BNE     vector_handler_forward		;NO, call directly

 LDR     R14, emulate_RISCOS
 CMP     R14, #&350 << 8		;below RO3.50?
 BHS     vector_handler_forward		;NO, pass to RISCOS

 STMFD   R13!, {R0-R2}			;preserve R0-R2
 BL      pre_SWI_veneer			;call SWI that follows
 SWI     XOS_Word
 BL      post_SWI_veneer

 MOV     R0, #19
 SWI     XOS_Byte			;PRM1-652 force a VSync
 BL      dontexit_SWI_veneer		;return to entry CPU mode
EXITSWI "R0-R2"


.os_word_21_1
 ADR     R12, Joystick_Mousemapping	;VARS pointer
 ADD     R12, R12, #Joystick_Mouse.bound_left
 ADD     R1, R1, #1
 MOV     R0, #4
 ._L1
   LDRB    R14, [R1], #1
   LDRB    R11, [R1], #1
   ORR     R14, R14, R11, LSL #8
   MOV     R14, R14, LSL #16
   MOV     R14, R14, ASR #16
   STR     R14, [R12], #4
   SUBS    R0, R0, #1
 BNE     _L1
 MOV     R0, #21
 SUB     R1, R1, #9
B       vector_handler_forward


.os_word_21_3
 ADR     R12, Joystick_Mousemapping	;VARS pointer

 ;use the new Mouse position as the centre for the Joystick
 LDRB    R14, [R1, #1]
 LDRB    R11, [R1, #2]
 ORR     R14, R14, R11, LSL #8		;R14=X pos
 MOV     R14, R14, LSL #16
 LDR     R11, [R12, #screen_OS_units_X - Joystick_Mousemapping]
 MOV     R14, R14, ASR #16
 SUB     R14, R14, R11, LSR #1
 STR     R14, [R12, #Joystick_Mouse.X_offset]

 LDRB    R14, [R1, #3]
 LDRB    R11, [R1, #4]
 ORR     R14, R14, R11, LSL #8		;R14=Y pos
 MOV     R14, R14, LSL #16
 LDR     R11, [R12, #screen_OS_units_Y - Joystick_Mousemapping]
 MOV     R14, R14, ASR #16
 SUB     R14, R14, R11, LSR #1
 STR     R14, [R12, #Joystick_Mouse.Y_offset]

B       vector_handler_forward
