;Entry_ADFBootFloppy
;-------------------
;Simulates a Shift-Break soft-reset
;
;Entry:
; R0 - Command tail
; R1 - Parameter count
; R12 - pointer to module private word or VARS

.Entry_ADFBootFloppy
 STMFD   R13!, {R1-R5, R11-R12, R14}
 LDR     R12, [R12, #0]			;could be called via CallBack from
					;service._Entry_ADFBootFloppyCB
 MOV     R11, R1			;R11 = parameter count
 CMP     R1, #1
 MOVHI   R11, #1

 #if ZLib_RMASpace > 0
  STMFD   R13!, {R0}
  MVN     R0, #0
  BL      Entry_RMAFree			;increase RMA for ZLib
  LDMFD   R13!, {R0}
 #endif

 TEQ     R11, #1			;are we being asked to run a script?
 MOVEQ   R2, R0				;YES
 BEQ     _run_a_script

 MOV     R0, #WimpSysInfo_ActiveTasks	;get number of WIMP tasks
 SWI     XWimp_ReadSysInfo		;PRM3-216
 TEQ     R0, #0				;R0>0 if WIMP is active
 BNE     _leave_time

 SWI     XOS_ReadMonotonicTime		;reset MonotonicTime
 LDR     R2, [R12, #MonotonicTime - VARS]	;get the current offset
 ADD     R0, R0, R2			;add it to the current result
 STR     R0, [R12, #MonotonicTime - VARS]	;and store it back
 ._leave_time
 ADD     R3, R12, #JFD_tmp - VARS	;JFD header
 LDR     R0, [R3, #JFD_ID]		;JFD Fxxxxxx
 ADR     R1, _Fid			;buffer address
 MOV     R2, #7				;length of buffer
 SWI     XOS_ConvertCardinal4		;PRM1-483

 LDR     R0, [R3, #JFD_Sequence]	;JFD floppy no
 AND     R0, R0, #&FF			;mask down to <99
 CMP     R0, #10
 MOVLT   R2, #ASC("0")			;pad with 0 if necessary
 STRLTB  R2, [R1], #1
 MOV     R2, #2				;length of buffer
 SWI     XOS_ConvertCardinal1

 ADR     R2, _Fid - 1			;pointer to F10xxxyy filename
._run_a_script
 ADR     R1, _obeyzip
 ADR     R3, _Obey			;our obey save location
 BL      ZIP_extract			;does ADFFS:Obey.Fxxxxxnn exist?
 BVC     _RunExtractedObey		;YES
 TEQ     R11, #1			;are we being asked to run a script?
 BEQ     _exit				;YES, exit early if not found

 LDR     R4, [R12, #obey_file_offset - VARS]	;offset to Obey file
 TEQ     R4, #0				;is there an Obey file?
 BNE     _RunEmbeddedObey		;YES, run it

					;*********************************
					;setup boot environment
					;*********************************
 MOV     R0, #14			;select ADFS
 MOV     R1, #8				;PRM2-21
 SWI     XOS_FSControl			;PRM2-98

 ADR     R0, _CSD			;set CSD
 SWI     XOS_CLI

 MOV     R0, #39			;set User Root Directory
 ADR     R1, _URD
 SWI     XOS_FSControl			;PRM2-124

 BL      _set_floppy_options

 MOV     R0, #47			;PRM2-132
 ADR     R1, _URD
 SWI     XOS_FSControl			;check if the floppy is bootable
 CMP     R2, #2				;2/3 is Run/Exec
 BLO     _exit				;oops, no boot option

 MOV     R0, #15			;boot the filesystem
 SWI     XOS_FSControl			;PRM2-99
 BVS     _exit

 LDRB    R0, [R12, #BootFloppyRequested - VARS]
 TEQ     R0, #0				;has the filer requested a floppy boot?
 MOVNE   R0, #138			;YES, need to workaround *EXEC not
 MOVNE   R1, #0				; | triggering via CallBack by..
 STRNEB  R1, [R12, #BootFloppyRequested - VARS]	; |   eg Repton 3, Chuck Rock
 MOVNE   R2, #ASC(" ")			; | ..inserting a key into the keybuffer
 SWINE   XOS_Byte			;PRM1-172
					;*********************************
 ._exit
LDMFD   R13!, {R1-R5, R11-R12, PC}




;Entry:
; R4 - offset to obey file in buffer

._RunEmbeddedObey
 ADR     R1, _Obey			;our obey save location
 MOV     R0, #&8F			;open for writing
 SWI     XOS_Find			;PRM2-78

 ADDVC   R2, R12, #JFD_tmp - VARS	;buffer address
 LDRVC   R3, [R2, #JFD_Obey_Length]	;length of Obey file
 LDRVC   R2, [R12, #ADF_Buffer_Address - VARS]
 ADDVC   R2, R2, R4			;address of Obey file
 MOVVC   R1, R0				;file handle
 MOVVC   R0, #2				;write from current pointer
 SWIVC   XOS_GBPB			;PRM2-68

 MOVVC   R0, #0
 SWIVC   XOS_Find			;close the file PRM2-77

;Entry:
; R2  - pointer to obey filename
; R11 - parameter count
._RunExtractedObey
 MOV     R6, R2
 MOVVC   R0, #18			;set filetype
 MOVVC   R1, R3				;our filename
 MOVVC   R2, #&FEB			;FEB - Obey
 SWIVC   XOS_File			;PRM2-36
 BVS     _exit

 TEQ     R11, #1			;are we being asked to run a script?
 ADRNE   R0, _ObeyRun			;NO
 BNE     _runit

 ADR     R0, _Obey_fixup1		;need to fixup !Obey
 SWI     XOS_CLI

 MOV     R1, R6
 ._L1					;skip filename
   LDRB    R14, [R1], #1
   CMP     R14, #ASC(" ")
 BHI     _L1				;R1=<parameters>

 ADR     R0, _Obey_param
 SUBLO   R1, R1, #1
 MOV     R2, #0
 MOV     R3, #0
 MOV     R4, #0
 SWI     XOS_SetVarVal

 ADR     R0, _Obey_fixup2
 ._runit				;won't return
 SWI     XOS_CLI			;run Obey file
B       _exit


._set_floppy_options
 STMFD   R13!, {R0, R3-R6, R14}

 LDR     R0, [R12, #JFD_tmp - VARS + JFD_MinVersion]
 CMP     R0, #206			;2.06+ images have these values
 LDMLOFD R13!, {R0, R3-R6, PC}

 LDR     R0, [R12, #JFD_tmp - VARS + JFD_FPS]
 TEQ     R0, #0				;do we have a FPS?
 BLNE    _set_FPS			;YES, set it

 MOV     R4, #0
 LDR     R0, [R12, #JFD_tmp - VARS + JFD_Bit_Flags]

 LDRB    R3, [R12, #prevent_CMOSchanges - VARS]
 CMP     R3, #&FF			;has it been manually set?
 BEQ     _P2				;YES
 TST     R0, #JFD_BF_ProtectCMOS	;do we need to protect the CMOS?
 STREQB  R4, [R12, #prevent_CMOSchanges - VARS]	;NO
 STRNEB  R0, [R12, #prevent_CMOSchanges - VARS]	;YES
 ._P2

 LDRB    R3, [R12, #prevent_RMKills - VARS]
 CMP     R3, #&FF			;has it been manually set?
 BEQ     _P3				;YES
 TST     R0, #JFD_BF_ProtectModules	;do we need to protect modules?
 STREQB  R4, [R12, #prevent_RMKills - VARS]	;NO
 STRNEB  R0, [R12, #prevent_RMKills - VARS]	;YES
 ._P3

 BL      hourglass_off
 LDRB    R3, [R12, #prevent_Hourglass - VARS]
 TEQ     R3, #&FF			;has it been manually set?
 BEQ     _P4				;YES
 TST     R0, #JFD_BF_HideHourglass	;do we need to hide the hourglass?
 MOVNE   R4, #1				;YES
 STRB    R4, [R12, #prevent_Hourglass - VARS]
 ._P4
 LDMFD   R13!, {R0, R3-R6, PC}

 ._Obey_fixup1	DCB "Set ADFFS$sourceDIR |<Obey$Dir>", 0
 ._Obey_fixup2	DCB "Obey -c ADFFS:!fixObey", 0
 ._Obey_param	DCB "ADFFS$sourceENV",0
 ._CSD		DCB "DIR "
 ._URD		DCB "adfs::0.$", 0
 ._ObeyRun	DCB "Obey -c "
 ._Obey		DCB "ADFFS:!Obey", 0
		DCB "F"
 ._Fid		DCB "12345"
 ._Fdisk	DCB "67", 0
 ._obeyzip	DCB "ADFFS:Obey", 0
 ALIGN




 ._set_FPS
 MOV     R6, #200			;100 * 2ms (the FPS in JFD is doubled)
 TEMP    R3				;R5=R6 DIV R0
 oDIV    R5, R6, R0			;R5 = ms to wait
 LOCK    R3
 STRB    R5, [R12, #force_vsync - VARS]	;set the forced FPS
MOV     PC, R14
