;Entry_ADFScreenLoad
;-------------------
;Avoid RISC OS's use of Page Zero for ScreenLoad
;
;Entry:
; R0 - Command tail
; R12 - unset

.Entry_ADFScreenLoad
 STMFD   R13!, {R1-R8, R12, R14}
 ADR     R12, VARS

 MOV     R8, R0				;R8=filename

 MOV     R1, R0
 MOV     R0, #17			;get file info
 SWI     XOS_File			;PRM2-46
 TEQ     R0, #1				;did we find a file?
 MOVNE   R0, #19
 MOVNE   R2, #0
 SWINE   XOS_File
 BVS     _exit				;NO

 MOV     R0, #Module_Claim
 ADD     R3, R4, #1024			;file size + 1K
 SWI     XOS_Module			;PRM1-236
 BVS     _exit

 MOV     R7, R2				;R7=sprite area
 STR     R3, [R2, #0]			;size of sprite area
 MOV     R0, #16
 STR     R0, [R2, #8]			;offset to 1st sprite
 MOV     R0, #9 + 256
 MOV     R1, R7				;our sprite area
 SWI     XOS_SpriteOp			;PRM1-794

 MOVVC   R0, #10 + 256			;load sprite
 MOVVC   R1, R7				;our sprite area
 MOVVC   R2, R8				;filename
 SWIVC   XOS_SpriteOp			;PRM1-796

 MOVVC   R0, #8 + 256			;find 1st sprite
 MOVVC   R1, R7				;our sprite area
 SWIVC   XOS_SpriteOp			;PRM1-793
 ADDVC   R2, R4, R7			;R2=pointer to sprite

; MOVVC   R0, #40 + 512			;sprite info
; MOVVC   R1, R7				;our sprite area
; SWIVC   XOS_SpriteOp			;PRM1-818
 MOVVC   R0, #37 + 512			;create/remove palette
 MOVVC   R1, R7				;our sprite area
 MVNVC   R3, #0				;read current palette
 SWIVC   XOS_SpriteOp			;PRM1-817
 BVS     _exit2				;R4=palette  R5=MODE

 STMFD   R13!, {R2}
 CMP     R5, #255			;MODE numbered?
 BHI     _unknown_MODE			;NO
 #if compile_RO == 311
   MOV     R0, #135
   SWI     XOS_Byte			;PRM1-670
 #else
   MOV     R0, #1			;get MODE specifier
   SWI     XOS_ScreenMode		;PRM5a-138
   MOV     R2, R1
   BL      find_MODE			;convert to MODE number
 #endif
 TEQ     R2, R5				;in the correct MODE?
 BEQ     _P1				; |+ dont change
 #if compile_RO == 311
   SWI     XOS_WriteI + 22
   MOV     R0, R5
   SWI     XOS_WriteC
 #else
   MOV     R0, #0			;change MODE
   MOV     R1, R5
   SWI     XOS_ScreenMode		;PRM5a-135
 #endif

 ._unknown_MODE
 SWI     XOS_RemoveCursors		;PRM1-739
 ._P1

 BICS    R3, R3, #1 << 31		;R3=size of palette
 BEQ     _no_palette			;NO palette
 SUB     R13, R13, #8			;use stack for palette
 MOV     R5, #0
 ADD     R1, R13, #3
 ._L1
   LDR     R0, [R4], #4			;get palette entry
   STR     R0, [R13, #4]
   STRB    R5, [R13, #3]
   MOV     R0, #17			;first flash
   STRB    R0, [R13, #4]
   MOV     R0, #12
   SWI     XOS_Word			;PRM1-706
   LDR     R0, [R4], #4			;get palette entry
   STR     R0, [R13, #4]
   STRB    R5, [R13, #3]
   MOV     R0, #18			;second flash
   STRB    R0, [R13, #4]
   MOV     R0, #12
   SWI     XOS_Word			;PRM1-706

   ADD     R5, R5, #1
   SUBS    R3, R3, #1
 BNE     _L1
 ADD     R13, R13, #8

 ._no_palette
 MOV     R0, #-1
 MOV     R1, #4
 SWI     XOS_ReadModeVariable
 MOV     R3, R2				;R3=XEigFactor
 MOV     R1, #5
 SWI     XOS_ReadModeVariable
 MOV     R4, R2				;R4=YEigFactor
 MOV     R0, #128			;GWLCol
 MOV     R1, #129			;GWBRow
 MOV     R2, #-1
 STMFD   R13!, {R0-R2}
 MOV     R0, R13
 MOV     R1, R13
 SWI     XOS_ReadVduVariables
 LDMFD   R13!, {R0-R2}			;get X,Y of graphics window

 MOV     R3, R0, LSL R3			;X=X << XEigFactor
 MOV     R4, R1, LSL R4			;Y=Y << YEigFactor
 MOV     R0, #34 + 512			;put sprite
 MOV     R1, R7				;our sprite area
 LDMFD   R13!, {R2}			;restore sprite ptr
 MOV     R5, #0				;overwrite pixels
 SWI     XOS_SpriteOp			;PRM1-806

 ._exit2
 MOV     R0, #Module_Free		;free claimed area
 MOV     R2, R7
 SWI     XOS_Module			;PRM1-238

 ._exit
LDMFD   R13!, {R1-R8, R12, PC}
