; Copyright 1996 Acorn Computers Ltd
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
;     http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
; > s.Memory

; Small veneer between AMBControl's memory block requirements and OS_Heap,
; using system heap. This is changed since Ursula - old code called OS_Module
; and claimed blocks from RMA, which is an anachronism since code is in
; the kernel.

; quantise sizes to reduce heap stress
;
AMBblockQ  * 64


;in:  r3=size
;out: r2 -> block, r0 corrupted
;
AMB_BlockClaim ROUT
        Push    "r1,r3,lr"
        ADD     r3,r3,#AMBblockQ - 1
        BIC     r3,r3,#AMBblockQ - 1
        BL      ClaimSysHeapNode
        Pull    "r1,r3,pc"

;in:  r2 -> block
;out: r0 corrupted
;
AMB_BlockFree ROUT
        Push    "r1,lr"
        BL      FreeSysHeapNode
        Pull    "r1,pc"

;in:  r2 -> block, r3 = new size
;out: r2 -> new block, r0 corrupted
;
AMB_BlockResize ROUT
        Push    "r1,r3,lr"
        ADD     r3,r3,#AMBblockQ - 1
        BIC     r3,r3,#AMBblockQ - 1
        LDR     r1,[r2,#-4]                  ;pick up OS_Heap's size word (naughty!)
        SUB     r1,r1,#8                     ;heap size will be 8 more than quantised size
        SUBS    r3,r3,r1                     ;required size change
        MOVNE   r0, #HeapReason_ExtendBlock
        BLNE    DoSysHeapOpWithExtension
        Pull    "r1,r3,pc"


        END