.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?
 BLEQ    check_taskID			;is the task supported?
 BNE     vector_handler_forward		;NO

 LDR     R14, [R11, #emulate_RISCOS - VARS]
 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
 ADD     R12, R11, #Joystick_Mousemapping - VARS + 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
 ADD     R12, R11, #Joystick_Mousemapping - VARS

 ;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
