home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / misc / enote / source.lha / source / memory.a < prev    next >
Text File  |  1995-01-10  |  4KB  |  170 lines

  1. *
  2. *  Memory.a  -  Self administrating memory routines
  3. *
  4.         ifnd    IFILES
  5. IFILES        set    1
  6.         include    "exec/types.i"
  7.         include    "exec/memory.i"
  8.         include    "exec/funcdef.i"
  9.         include    "exec/lists.i"
  10.         include    "exec/exec_lib.i"
  11.         include    "call.i"
  12.         endc
  13.  
  14.         xref    _NoMem
  15.   ifd    DEBUG
  16.         xref    _MemError
  17. ExtraBytes    equ    20
  18.   else
  19. ExtraBytes    equ    12
  20.   endc
  21.         CSECT    text,0,0,2,2
  22.  
  23.  
  24.  
  25. *********************************************************
  26. *
  27. *  --  AllocM  --
  28. *
  29.  
  30.  Func    _Calloc
  31.         mulu    d1,d0                By ANSI definition max 64k at a time
  32.         move.l    #MEMF_CLEAR,d1
  33.         bra.s    AM_
  34.  Func    _Malloc
  35.         moveq.l    #MEMF_ANY,d1
  36.  
  37.  Func    _AllocMA
  38.  
  39. CallersRA    equ    16                4 regs movem'd
  40.  
  41. AM_        movem.l    d2/d3/a2/a6,-(a7)
  42.         move.l    d1,d3                Memtype, keep for error
  43.         moveq.l    #ExtraBytes,d2            12 (20) bytes for minnode and size (and debug info)
  44.         add.l    d0,d2                Add to requested number
  45.         move.l    d2,d0                Keep requested size
  46. AM_Alloc    move.l    4,a6
  47.         jsr    _LVOAllocMem(a6)
  48.         move.l    d0,a0                Block of memory
  49.         tst.l    d0                Allocated?
  50.         bne.s    AM_GotMem            Yes..
  51.  
  52. *--    No memory, call custom function
  53.  
  54.         move.l    d3,-(a7)            Memory type
  55.         move.l    d2,-(a7)            Memory size
  56.         jsr    _NoMem(pc)            Call warning (or cure) function
  57.         addq.l    #8,a7
  58.         move.l    d0,a0                Set a0 to block or clear in case of no retry
  59.         tst.l    d0                Accept no memory?
  60.         beq.s    AM_Rtn                Yes, return zero..
  61.         moveq.l    #-1,d1                Retry flag
  62.         cmp.l    d0,d1                Retry?
  63.         bne.s    AM_GotMem            No, we have a pointer to a block from NoMem()..
  64.         move.l    d2,d0                Yes retry, memory size
  65.         move.l    d3,d1                Memory type
  66.         bra.s    AM_Alloc            Retry..
  67.  
  68. AM_GotMem
  69.  
  70. *--    We have a block, store our info into the reserved fields
  71.  
  72.   ifd    DEBUG
  73.         move.b    #$aa,-4(a0,d2.l)        Check value
  74.         move.l    CallersRA(a7),(a0)+        Callers return address
  75.   endc
  76.         move.l    d2,(a0)+            Remember size
  77.         lea.l    MemList(a4),a1            Our administration base
  78.         move.l    (a1),a2                Old Node1 becomes Node2
  79.         move.l    a0,LN_PRED(a2)            Node1 into Node2.LN_PRED
  80.         move.l    a0,(a1)                Node1 into List.LN_HEAD
  81.         move.l    a2,(a0)+            Node2 into Node1.LN_SUCC
  82.         move.l    a1,(a0)+            List into Node1.LN_PRED
  83.         move.l    a0,d0                Return pointer to free block
  84.  
  85. AM_Rtn        movem.l    (a7)+,d2/d3/a2/a6
  86.         rts
  87.  
  88.  
  89. *********************************************************
  90. *
  91. *  --  FreeM  --
  92. *
  93.  
  94.  Func    _Free
  95.  Func    _FreeMA
  96.  
  97.         cmp.w    #0,a1
  98.         beq.s    FM_Rtn
  99.  
  100.         movem.l    a6/a2,-(a7)
  101.         move.l    -(a1),a0            Node0
  102.         move.l    -(a1),a2            Node2
  103.         move.l    a0,LN_PRED(a2)            Node0 predecessor of Node2
  104.         move.l    a2,(a0)                Node2 successor of Node0
  105.         move.l    -(a1),d0            Size
  106.   ifd    DEBUG
  107.         subq.l    #4,a1                Callers return address
  108.         cmp.b    #$aa,-4(a1,d0.l)        Check value
  109.         beq.s    FM_CheckOK            No error..
  110.         movem.l    d0/a1,-(a7)            Keep size and location
  111.         move.l    a1,-(a7)            Location as parameter
  112.         jsr    _MemError(pc)
  113.         addq.l    #4,a7
  114.         movem.l    (a7)+,d0/a1            Restore size and location
  115. FM_CheckOK
  116.   endc
  117.         move.l    4,a6
  118.         jsr    _LVOFreeMem(a6)
  119.         movem.l    (a7)+,a6/a2
  120.  
  121. FM_Rtn        rts        
  122.  
  123.  
  124. *********************************************************
  125. *
  126. *  --  FreeMAll
  127. *
  128.  
  129.  Func    _FreeMAll
  130.  
  131.         movem.l    a2-a3/a6,-(a7)
  132.         move.l    4,a6
  133.         lea.l    MemList(a4),a2
  134.  
  135. FMA_TestList    cmp.l    LH_TAILPRED(a2),a2
  136.         beq.s    FMA_Rtn
  137.         move.l    (a2),a1
  138.         movem.l    (a1),a0/a3            Succ/Pred
  139.         move.l    a0,(a3)                Pred gets new Succ
  140.         move.l    a3,LN_PRED(a0)            Succ gets new Pred
  141.         move.l    -(a1),d0            Size
  142.   ifd    DEBUG
  143.         subq.l    #4,a1                Callers return address
  144.         cmp.b    #$aa,-4(a1,d0.l)        Check value
  145.         beq.s    FMA_CheckOK            No error..
  146.         movem.l    d0/a1,-(a7)            Keep size and location
  147.         move.l    a1,-(a7)            Location as parameter
  148.         jsr    _MemError(pc)
  149.         addq.l    #4,a7
  150.         movem.l    (a7)+,d0/a1            Restore size and location
  151. FMA_CheckOK
  152.   endc
  153.         jsr    _LVOFreeMem(a6)
  154.         bra.s    FMA_TestList
  155.  
  156. FMA_Rtn        movem.l    (a7)+,a2-a3/a6
  157.         rts
  158.  
  159.  
  160. *********************************************************
  161.  
  162.         SECTION    __MERGED,data
  163.  
  164. MemList
  165. ML_Head        dc.l    ML_Tail
  166. ML_Tail        dc.l    0
  167. ML_TailPred    dc.l    ML_Head
  168.  
  169.         END
  170.