;Module init
;-----------
;Entry:
; R10 - pointer to initialisation parameters
; R11 - instantiation number
; R12 - pointer to private word

.Entry_init
 STMFD   R13!, {R1-R11, R14}
 TEMP    R14
 STR     R12, privateWord		;Store our private word pointer
 ADR     R0, VARS
 STR     R0, [R12, #0]			;and point it at VARS
 MOV     R12, R0

 MOV     R0, #Module_Lookup		;check OS version
 ADR     R1, UtilityModule		;..via UtilityModule version
 SWI     XOS_Module			;PRM1-249
 MOV     R0, #Module_Enumerate		;request Module version
 MVN     R2, #0
 SWI     XOS_Module			;PRM1-252
 AND     R2, R6, #&FF00
 TEQ     R2, #&600			;RO6?
 SUBEQ   R6, R6, #&200			;YES, drop it to 4.x
 STR     R6, [R12, #os_version - VARS]	;store the OS version

 #if JIT_WIMP_support == 1
   BL      get_domainID_address
 #endif
 BL      detect_CPU			;detect chipset
 #if ARMv3_support == 1
   BL      detect_ARMv3			;optimizations for ARMv3 CPUs
 #endif
 #if compile_IOMD == 1
   BL      detect_VIDC20
   BL      detect_IOMD

   MOV     R0, #8 + (2 << 8)		;get amount of VRAM
   SWI     XOS_Memory			;PRM5a-69
   MUL     R0, R1, R2
   STR     R0, [R12, #vram_available - VARS]	;store the amount of VRAM
 #endif

 #if compile_RO == 400
   MOV     R0, #161			;read *TV x,y value from CMOS
   MOV     R1, #10			;PRM1-362
   SWI     XOS_Byte			;PRM1-369
   AND     R2, R2, #%111 << 5
   MOV     R2, R2, LSL #24		;shift to sign value
   MOV     R2, R2, ASR #32 - 6		;shift back down and multply by 8
   STR     R2, [R12, #TV_offset - VARS]
 #endif

 ADR     R0, Read_FileSizeLimitVal	;read ADFFS$FileSizeLimit
 ADR     R1, Current_File_Mounted + 4	;used this as a tmp buffer
 MOV     R2, #8
 MOV     R3, #0
 MOV     R4, #0
 SWI     XOS_ReadVarVal			;PRM1-314
 TEQ     R4, #1				;is ADFFS$FileSizeLimit a number?
 LDREQ   R3, [R1]			;...YES
 MOVEQ   R3, R3, LSL #10		;convert from KB to bytes
 STREQ   R3, [R12, #File_Size_Limit - VARS]	;...store our file size limit

 ADR     R0, Read_VecPtrTabVal		;read ADFFS$VecPtrTab
 MOV     R2, #8
 MOV     R3, #0
 MOV     R4, #0
 SWI     XOS_ReadVarVal			;PRM1-314
 TEQ     R4, #1				;is ADFFS$VecPtrTab a number?
 LDREQ   R3, [R1]			;YES
 MOVNE   R3, #0				;trap ADFFS$VecPtrTab not being set
 #if compile_RO > 400
   LDR     R0, [R12, #os_version - VARS]
   MOV     R1, #&523 << 8
   CMP     R0, R1			;RO 5.23+
   BLO     _pre_RO523			;NO

   #if MMUControl2_support == 1
     MOV     R0, #33			;request cache line size
     MOV     R1, #0			;..for L1 cache
     SWI     XOS_PlatformFeatures	;see ROOL wiki
     CMP     R1, R3			;R1=D-cache line, R3=I-cache line
     MOVLO   R1, R3			;R1 hopefully now covers both caches
     STR     R1, L1_CACHE_LINE_SIZE	;store for all cache aligned ops
     SUB     R1, R1, #1
     STR     R1, L1_CACHE_LINE_MASK
   #endif

   MOV     R0, #6			;YES, ask the OS for VecPtrTab
   MOV     R1, #0
   MOV     R2, #85			;VecPtrTab
   SWI     XOS_ReadSysInfo		;see ROOL wiki
   MOV     R3, R2			;R3=VecPtrTab address
   ._pre_RO523
 #endif
 STR     R3, [R12, #VecPtrTab - VARS]	;store Vector Table address
 TEQ     R3, #0				;are we tracking Vectors?
 BLNE    copySoftwareVectors		;YES, copy the software vector table

 #if Managed_ChannelHandler == 0
   BL      Claim_SWI_Vector		;hook onto the SWI hardware vector
 #endif
 BL      Create_DynamicAreas		;create our Dynamic Areas
 LDMVSFD R13!, {R1-R11, PC}		;exit on error
 #if Managed_ChannelHandler == 1
   BL      claim_ChannelHandler		;take over the RISCOS Channel Handler
   BL      Claim_SWI_Vector		;hook onto the SWI hardware vector
 #endif

 #if compile_RO == 400
   LDR     R0, [R12, #os_version - VARS]
   CMP     R0, #&380 << 8		;RO3.8+?
   BLO     _P1
 #endif
 #if compile_RO > 311
   MOV     R0, #6
   MOV     R1, #0
   MOV     R2, #14			;L2PT
   SWI     XOS_ReadSysInfo		;riscosopen.org
   STR     R2, L2PT_addr

   MOV     R2, #13			;L1PT
   SWI     XOS_ReadSysInfo		;riscosopen.org
   STR     R2, L1PT_addr

   MOV     R2, #16			;SVC stack
   SWI     XOS_ReadSysInfo		;riscosopen.org
   STR     R2, [R12, #SVC_stack_init - VARS]
 #endif
 #if compile_RO > 400
   MOV     R2, #67			;IRQ stack base
   SWI     XOS_ReadSysInfo		;riscosopen.org
   STR     R2, [R12, #IRQ_stack_init - VARS]

   MOV     R2, #69			;IRQsema
   SWI     XOS_ReadSysInfo
   STR     R2, [R12, #IRQsema - VARS]	;pointer to IRQsema, used in SWI handler
 #endif
 #if compile_RO == 400
   ._P1
   MOV     R3, #(8 * 1024) - 1
   ADD     R2, R13, R3			;work out top of SVC26 stack
   BIC     R2, R2, R3
   STR     R2, [R12, #SVC_stack_init - VARS]

   MRS     R0, CPSR
   BIC     R1, R0, #%11
   ORR     R1, R1, #%10			;IRQ26
   MSR     CPSR_all, R1
   NOP
   ADD     R2, R13, R3			;work out top of IRQ26 stack
   BIC     R2, R2, R3
   MSR     CPSR_all, R0
   NOP
   STR     R2, [R12, #IRQ_stack_init - VARS]
 #endif

 SWI     XOS_ReadMemMapInfo		;read the current page size PRM1-391
 STR     R0, [R12, #current_PageSize - VARS]	;store page size
 SUB     R1, R0, #1			;mask = page size - 1
 STR     R1, DA_mask			;store mask

 #if MMUControl2_support == 1
   BL      SETUP_MMUControl2
 #endif

 #if compile_RO > 311
   MOV     R2, #0
   MOV     R1, #1			;calculate shift to get page
   ._L1					;..count
     MOVS    R0, R0, ROR #1
     ADDCC   R2, R2, #1
   BCC     _L1
   STR     R2, DA_mask_shift
 #endif

 #if compile_GPU == 1
   BL      claim_GraphicsV_Vector	;start the GraphicsV driver
 #endif

 MOV     R0, #Module_ReInit
 ADR     R1, ADFS_Module
 SWI     XOS_Module			;Reinit ADFS to get it's DiscOp / MiscOp

 ADR     R0, Alias_RunType_FCE		;point the RunType alias back at ADFFS
 ADR     R1, Alias_RunType_FCE_val
 MOV     R2, #Alias_RunType_FCE_valE - Alias_RunType_FCE_val
 MOV     R3, #0
 MOV     R4, #0
 SWI     XOS_SetVarVal			;PRM1-316

 MOV     R0, #Module_InsertFromMemoryToRMA
 ADR     R1, MemAlloc_Module
 MOV     R2, #MemAlloc_End - MemAlloc_Module
 SWI     XOS_Module			;load MemAlloc stub Module

 SUBS    R0, R0, R0			;clear V
 LOCK    R14
LDMFD   R13!, {R1-R11, PC}




;Entry_kill
;----------
;Terminates the module

.Entry_kill
 STMFD   R13!, {R0-R12, R14}
 ADR     R12, VARS

 #if compile_GPU == 1
   BL      release_GraphicsV_Vector
 #endif

 #if compile_RO > 311
   MOV     R1, #0
   BL      Entry_GOARM3JIT		;shutdown JIT
   MOV     R1, #0
   BL      release_DataAbort_Vector	;release Data_Abort
 #endif
 #if compile_IOMD == 1 AND No_Frame_Pacing == 0
   BL      release_event_4		;stop generating VSync events
 #endif
 #if compile_GPU == 1
   BL      release_GraphicsV_Vector
 #endif
 #if Managed_ChannelHandler == 1
   BL      release_ChannelHandler	;reinstate the RISCOS ChannelHandler
 #endif
 MOV     R0, #0
 BL      Entry_ADFEject			;Dismount current disc
 BL      Remove_DynamicAreas		;Remove our DAs

 LDR     R2, recording_addr		;free DiscOp recoding memory
 TEQ     R2, #0
 MOVNE   R0, #Module_Free
 SWINE   XOS_Module			;PRM1-238

 MOV     R0, #Module_Delete
 ADR     R1, MemAlloc_Title
 SWI     XOS_Module                     ;PRM1-235

 LDMFD   R13!, {R0-R12, R14}		;clear down stack
B       Release_SWI_Vector		;releaseSWI will kill us
