In   -
Out  memory
Type AOF
Ver  1.00n

; this is a simple library to deal with some things that C takes for
; granted ;-)

#Area "JFP:Memory" Code ReadOnly
#Rem Off
; *******************************************************************
; Subroutine:   malloc
; Description:  Allocate some memory
; Parameters:   r0 = size to claim
; Returns:      r0-> space, or 0 if failed
; *******************************************************************
.|malloc|
   STMFD   (sp)!,{r1-r3,link}            ; Stack registers
   REM     "Claim %r0"
   MOV     r3,r0                         ; right register
   XSWI    "XOS_Module",6                ; claim space
   MOVVS   r0,#0                         ; if error, return 0
   MOVVC   r0,r2                         ; return address
   LDMFD   (sp)!,{r1-r3,pc}^             ; Return from call

; *******************************************************************
; Subroutine:   free
; Subroutine:   free memory claimed by malloc
; Description:  release RMA at r0
; Parameters:   r0 = address
; Returns:      none
; *******************************************************************
.|free|
   STMFD   (sp)!,{r0-r2,link}            ; Stack registers
   REM     "%&0"
   MOV     r2,r0                         ; right register
   XSWI    "XOS_Module",7                ; claim space
   LDMFD   (sp)!,{r0-r2,pc}^             ; Return from call

; *******************************************************************
; Subroutine:   realloc
; Description:  change the size of a block
; Parameters:   r0 = block
;               r1 = new size
; Returns:      r0-> block, 0 if failed
; *******************************************************************
.|realloc|
   STMFD   (sp)!,{r1-r3,link}            ; Stack registers
   LDR     r2,[r0,#-4]                   ; read the current size
   SUB     r3,r1,r2                      ; calculate the change
   MOV     r2,r0                         ; right register
   XSWI    "XOS_Module",13               ; extend space
   MOVVS   r0,#0                         ; if error, return 0
   LDMVSFD (sp)!,{r1-r3,pc}^             ; Return from call if error
$noerror
   MOV     r0,r2                         ; return address
   LDMFD   (sp)!,{r1-r3,pc}^             ; Return from call
