;vector_handler_disc_swap
;------------------------
;Called from SWI vector when certain keys are pressed, to load a disc image
;Actions a disc image change request

.vector_handler_disc_swap
 LDR     R14, _vectorHandler_swapdisc	;are we dealing with the request?
 TEQ     R14, #0
 BNE     vector_handler_exit		;YES

 LDR     R14, ADF_Mounted		;do we have an image mounted?
 TEQ     R14, #0
 TEMP    R11
 STREQ   R14, disk_swap_pending		;NO, don't try to swap again
 BEQ     vector_handler_exit		; |+ exit
 LOCK    R11

 LDR     R11, IRQsema			;check IRQsema
 LDR     R11, [R11, #0]
 TEQ     R11, #0			;called from an IRQ?
 #if compile_RO == 311
   LDREQ   R11, [R13, #SWI_stack.R14]	;get PC from stack
   TSTEQ   R11, #1 << 27		;are IRQ's are enabled?
 #else
   MRSEQ   R11, SPSR			;32bit, use SPSR
   TSTEQ   R11, #1 << 7			;are IRQ's are enabled?
 #endif
 BNE     vector_handler_exit		;NO, don't change disc yet

 STR     R13, _vectorHandler_swapdisc	;pending disc change
 ADD     R12, R13, #SWI_stack.size	;R12=address for state
 STMFD   R13!, {R0-R3}

 #if compile_RO == 311
   MOV     R0, PC			;26bit CPU
   STR     R0, [R12, #SWI_veneer.CPSR]	;store CPSR
   BIC     R0, R0, #%11 << 26		;clear IRQ/FIQ bits
   ORR     R0, R0, #%11			;SVC
   TEQP    R0, #0
 #else
   MRS     R0, CPSR			;32bit CPU
   STR     R0, [R12, #SWI_veneer.CPSR]	;store CPSR
   STR     R11, [R12, #SWI_veneer.SPSR]	;store SPSR
   BIC     R0, R11, #%11001111		;clear mode bits
   ORR     R0, R0, #%00000011		;SVC, enable interrupts
   MSR     CPSR_c, R0
 #endif
 #if compile_RO < 500
   NOP					;now in correct SVC mode
 #endif

 STR     R14, [R13, #-4]!		;preserve R14

 LDR     R1, disk_swap_pending
 ADR     R0, Current_File_Mounted	;now we need to load the correct disc
 MOV     R2, R0
 ._L1					;find end of filename
   LDRB    R3, [R2], #1
   TEQ     R3, #0
 BNE     _L1

 ._L2
   LDRB  R3, [R2, #-1]!			;get the previous char
   TEQ   R3, #ASC(".")			;have we hit the directory?
   TEQNE R2, R0				;have we hit the start of the file?
   BEQ   _unknown_disc

   CMP   R3, #ASC("0")			;is it a digit?
   BLO   _L2				;NO
   CMP   R3, #ASC("9")			;0..9?
   BHI   _L2				;NO

 STRB    R1, [R2, #0]			;store the disc no. over the last char

 ._unknown_disc
 MOV     R3, R0				;preserve R0
					;write the DiscOp info to file
 LDR     R0, recording_addr		;file handle
 TEQ     R0, #0
 MVNNE   R0, #0
 ADRNE   R2, recordStack		;address of data
 STRNE   R0, [R2, #0*4]
 STRNE   R0, [R2, #1*4]
 STRNE   R0, [R2, #2*4]
 STRNE   R0, [R2, #3*4]
 STRNE   R0, [R2, #4*4]
 BLNE    record_discop

 BL      resetVectors			;reset key vectors
 STMFD   R13!, {R3-R5}
 MOV     R0, #17			;read file information
 MOV     R1, R3				;point to filename
 SWI     XOS_File			;PRM2-38
 LDMFD   R13!, {R3-R5}
 TEQ     R0, #1				;does the file exist?
 MOVEQ   R0, R3				;YES, preserve R0
 BLEQ    Entry_ADFMount			; |+  mount the disc
 BL      resetVectors			;reset key vectors
 LDR     R14, [R13], #4			;preserve R14

 LDR     R0, [R12, #SWI_veneer.CPSR]	;original CPU mode
 #if compile_RO == 311
   TEQP    R0, #0			;26bit, use PC flags
   NOP					;now back in original CPU mode
 #else
   MSR     CPSR_all, R0
   NOP
   LDR     R0, [R12, #SWI_veneer.SPSR]	;restore SPSR
   MSR     SPSR_all, R0
 #endif

 MOV     R14, #0
 TEMP    R1
 STR     R14, disk_swap_pending		;allow key traps again
 LOCK    R1
 LDMFD   R13!, {R0-R3}

 STR     R14, _vectorHandler_swapdisc	;allow disc swaps
B       vector_handler_exit

 ._vectorHandler_swapdisc DCD 0		;<>0 means processing a disc change
