;vector_handler_40140
;--------------------
;Prevents Channel Handlers from taking over

;Entry:
; R0 - 0 or Number of channels
; R1 - 0 or Sample length
; R2 - 0 or Sample period
; R3 - 0 or Channel Handler address
; R4 - 0 or Scheduler address
; R11 - pointer to VARS

.vector_handler_40140
 LDRB    R14, [R11, #dont_trap_sound_configure - VARS]
 TEQ     R14, #0			;should we trap Sound_Configure?
 BEQ     vector_handler_forward		;NO, pass to OS

 SUB     R13, R13, #5 * 4		;room for exit R0-R4
 MOV     R14, R13
 STMFD   R13!, {R5-R10, R12}
 MOV     R10, R14
 ADD     R12, R11, #hypervised_sound_configure - VARS	;values currently in use
 LDMIA   R12, {R5-R9}
 STMIA   R10, {R5-R9}			;exit R0-R4

 LDR     R14, [R11, #emulate_RISCOS - VARS]
 CMP     R14, #&350 << 8		;emulating <RO3.5
 BHS     _P1				;NO

 TEQ     R2, #0				;YES, use previous value if R2=0
 MOVNE   R14, #0
 STRNE   R14, [R12, #sound_config_struct.VIDC1_period]
 BNE     _P1

 LDR     R14, [R12, #sound_config_struct.VIDC1_period]
 STR     R2, [R12, #sound_config_struct.VIDC1_period]
 MOVS    R2, R14			;was value previous set?
 STRNE   R2, [R10, #2 * 4]		;YES, overwrite R2 on stack

 ._P1
 TEQ     R3, #0				;Channel Handler
 STRNE   R3, [R12, #sound_config_struct.ChannelHandler]
 MOVNE   R3, #0				;we'll handle this
 TEQ     R4, #0				;Scheduler
 STRNE   R4, [R12, #sound_config_struct.Scheduler]
 MOVNE   R4, #0				;we'll handle this

 TEQ     R0, #0
 STRNE   R0, [R12, #sound_config_struct.channels]
 TEQ     R1, #0
 STRNE   R1, [R12, #sound_config_struct.length]
 TEQ     R2, #0
 STRNE   R2, [R12, #sound_config_struct.period]
 ADDEQS  R14, R0, R1			;are the values all zeros?
 LDMEQFD R13!, {R5-R10, R12}
 BEQ     _exit				;YES, exit

 STR     R0, [R13, #-4]!
 MOV     R0, #0
 BL      check_and_return_taskID	;R0=taskID if under JIT or 0
 STR     R0, [R12, #sound_config_struct.taskID]
 LDMFD   R13!, {R0, R5-R10, R12}

 BL      pre_SWI_veneer			;call SWI that follows
 SWI     XSound_Configure		;PRM4-18
 BL      post_SWI_veneer
 BL      dontexit_SWI_veneer
 ._exit
EXITSWI "R0-R4"
