;Entry:
; R0 = Command tail (<addr> <val1> [...<valN>])
; R1 = no. of parameters
; R12 = pointer to module private word

.Entry_MEMA
 STMFD   R13!, {R1-R12, R14}

 MOV     R6, #0				;default to DWORD
 MOV     R1, R0
 BL      skip_spaces_R1
 BL      _check_type			;R6=0-dword 1-byte 2-word
 SUBNE   R1, R1, #1			;wasn't D/W/B

 MOV     R0, #16			;base 16 number with restricted range
 ._address_2
 SWI     XOS_ReadUnsigned		;read the value PRM1-460
 LDMVSFD R13!, {R1-R12, PC}
 MOV     R8, R2				;R8=start of cache flush
 MOV     R9, R2				;R9=<addr>

 ._L1
   BL      skip_spaces_R1
   BCC     _done			;exit, if end of commandline
   TEQ     R2, #ASC("||")		;..or a comment?
   TEQNE   R2, #ASC(";")
   BEQ     _done			;YES
   TEQ     R2, #ASC(">")		;is it an address?
   BEQ     _address			;YES
   TEQ     R2, #ASC("""")		;is it a string?
   BEQ     _string
   BL      _check_type			;is it a type?
   BEQ     _L1				;YES

   SUB     R1, R1, #1
   SWI     XOS_ReadUnsigned		;read the value PRM1-460
   LDMVSFD R13!, {R1-R12, PC}

   CMP     R6, #1			;store value
   STRLO   R2, [R9], #4			;dword
   STRHSB  R2, [R9], #1			;byte or word
   MOVHI   R2, R2, LSR #8
   STRHIB  R2, [R9], #1
 B       _L1

 ._done
 #if compile_RO > 311
   BL      _cacheop
 #endif
 SUBS    R0, R0, R0			;clear V
LDMFD   R13!, {R1-R12, PC}


 ._check_type
 BIC     R2, R2, #&20			;uppercase

 TEQ     R2, #ASC("I")			;IMB required?
 BEQ     _imb

 LDRB    R11, [R1]			;check its not the start of an address
 TEQ     R11, #ASC(" ")
 MOVNE   PC, R14			;it is

 TEQ     R2, #ASC("D")
 MOVEQ   R6, #0
 MOVEQ   PC, R14

 TEQ     R2, #ASC("H")
 MOVEQ   R6, #2
 MOVEQ   PC, R14

 TEQ     R2, #ASC("B")
 MOVEQ   R6, #1
 MOV     PC, R14


 ; I [<start> <end>]
 ._imb
 #if compile_RO > 311
   SWI     XOS_ReadUnsigned		;read the value PRM1-460
   MOVVC   R8, R2
   SWIVC   XOS_ReadUnsigned
   MOVVC   R9, R2
   BVC     _done

   MOV     R8, #page_zero_Scratch_Space	;perform a full appspace IMB
   MOV     R9, #jit_allocate_memory + jit_RMA_size
 #endif
 B       _done


 ._string
   LDRB    R2, [R1], #1
   TEQ     R2, #ASC("""")		;end of string?
   LDREQB  R11, [R1]			;possibly,
   TEQEQ   R11, #ASC("""")		;..check for double "
   ADDEQ   R1, R1, #1			;YES, keep
   STREQB  R2, [R9], #1
   BEQ     _string

   TEQ     R2, #ASC("""")		;end of string?
   BEQ     _L1
   TEQ     R2, #13
   TEQNE   R2, #0			;or end of commandline?
   BEQ     _done
   STRB    R2, [R9], #1
 B       _string


 ._address
 #if compile_RO > 311
   BL      _cacheop
 #endif
 B      _address_2

 #if compile_RO > 311
   ; R8 - start of range
   ; R9 - end of range
   ._cacheop
   STMFD   R13!, {R0-R4, R14}
   BIC     R1, R8, #%11			;word align start/end
   ADD     R2, R9, #3
   BIC     R2, R2, #%11

   BL      check_JIT_and_taskID		;is the task under JIT?
   BNE     _let_OS_handle		;NO
   SWI     XOS_IntOff
   LDR     R3, [R12, #JIT_ARM4 - VARS]	;need to switch JIT to ARM3 to force
   MOV     R0, #0			;it to reset the JIT instructions
   STR     R0, [R12, #JIT_ARM4 - VARS]
   SUBS    R4, R2, R1
   MOV     R2, R1
   BLGT    hv_reset_memory_block	;YES, reset JIT space
   STR     R3, [R12, #JIT_ARM4 - VARS]
   SWI     XOS_IntOn
   LDMFD   R13!, {R0-R4, PC}

   ._let_OS_handle
   MOV     R0, #1
   SWI     XOS_SynchroniseCodeAreas	;flush cache
   LDMFD   R13!, {R0-R4, PC}
 #endif
