;Entry_ADFBootFloppy
;-------------------
;Simulates a Shift-Break soft-reset
;
;Entry:
; R0 - Command tail
; R12 - pointer to module private word OR undefined

 .Entry_ADFBootFloppy_CSD	DCB "DIR "
 .Entry_ADFBootFloppy_URD	DCB "adfs::0.$", 0
 .Entry_ADFBootFloppy_ObeyRun	DCB "Obey -c "
 .Entry_ADFBootFloppy_Obey	DCB "ADFFS:!Obey", 0
				DCB "F"
 .Entry_ADFBootFloppy_Fno	DCB "12345"
 .Entry_ADFBootFloppy_Fdsk	DCB "67", 0
				ALIGN

.Entry_ADFBootFloppy
 STMFD   R13!, {R1-R5, R12, R14}
 ADR     R12, VARS			;could be called via CallBack from
					;service._Entry_ADFBootFloppyCB
 #if ZLib_RMASpace > 0
  MVN     R0, #0
  BL      Entry_RMAFree			;increase RMA for ZLib
 #endif

 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
 ADR     R3, JFD_tmp			;JFD header
 LDR     R0, [R3, #JFD_ID]		;JFD Fxxxxxx
 ADR     R1, Entry_ADFBootFloppy_Fno	;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     R1, _obeyzip
 ADR     R2, Entry_ADFBootFloppy_Fno - 1	;pointer to F10xxxyy filename
 ADR     R3, Entry_ADFBootFloppy_Obey	;our obey save location
 BL      ZIP_extract			;does ADFFS:Obey.Fxxxxxnn exist?
 BVC     _RunExtractedFile		;YES

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

					;*********************************
					;setup boot environment
					;*********************************
#if compile_RO == 400
  MOV     R0, #0
  BL      Entry_ADFScreenCaching	;turn screen caching off for RO4/SA
#endif

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

 ADR     R0, Entry_ADFBootFloppy_CSD	;set CSD
 SWI     XOS_CLI

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

 BL      _set_floppy_options

 MOV     R0, #47			;PRM2-132
 ADR     R1, Entry_ADFBootFloppy_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

 LDR     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..
 STRNE   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, R12, PC}


 ._obeyzip	DCB "ADFFS:Obey", 0
 ALIGN




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

 ._ADFRunObeyFile
 ADR     R5, Entry_ADFBootFloppy_Obey	;our obey save location
 MOV     R1, R5				;filename
 MOV     R0, #&8F			;open for writing
 SWI     XOS_Find			;PRM2-78

 ADRVC   R2, JFD_tmp			;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

 ._RunExtractedFile
 MOVVC   R0, #18			;set filetype
 MOVVC   R1, R3				;our filename
 MOVVC   R2, #&FEB			;FEB - Obey
 SWIVC   XOS_File			;PRM2-36

 ADRVC   R0, Entry_ADFBootFloppy_ObeyRun

 BVS     _exit
 BL      _set_floppy_options

 SWI     XOS_CLI			;run Obey file
B       _exit


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

 ADR     R1, JFD_tmp			;buffer address

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

 LDR     R0, [R1, #JFD_FPS]
 TEQ     R0, #0				;do we have a FPS?
 BLNE    _set_FPS			;YES, set it

 MOV     R4, #0
 LDR     R0, [R1, #JFD_Bit_Flags]

 LDR     R3, [R12, #prevent_CMOSchanges - VARS]
 CMN     R3, #1				;has it been manually set?
 BEQ     _P2				;YES
 TST     R0, #JFD_BF_ProtectCMOS	;do we need to protect the CMOS?
 STREQ   R4, [R12, #prevent_CMOSchanges - VARS]	;NO
 STRNE   R0, [R12, #prevent_CMOSchanges - VARS]	;YES
 ._P2

 LDR     R3, [R12, #prevent_RMKills - VARS]
 CMN     R3, #1				;has it been manually set?
 BEQ     _P3				;YES
 TST     R0, #JFD_BF_ProtectModules	;do we need to protect modules?
 STREQ   R4, [R12, #prevent_RMKills - VARS]	;NO
 STRNE   R0, [R12, #prevent_RMKills - VARS]	;YES
 ._P3

 LDR     R3, [R12, #prevent_Hourglass - VARS]
 CMN     R3, #1				;has it been manually set?
 BEQ     _P4				;YES
 TST     R0, #JFD_BF_HideHourglass	;do we need to hide the hourglass?
 STREQ   R4, [R12, #prevent_Hourglass - VARS]	;NO
 BEQ     _P4
 LDR     R3, [R12, #prevent_Hourglass - VARS]	;YES, get previous value
 STR     R0, [R12, #prevent_Hourglass - VARS]	; |  turn off
 TEQ     R3, #0				; |  was hourglass previously on?
 SWIEQ   XHourglass_Off			; +- YES, turn hourglass off PRM2-748
 ._P4
 LDMFD   R13!, {R0-R1, R3-R6, PC}



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