    INCLUDE "Blitz.i"
    INCLUDE "lib/exec.i"
    INCLUDE "lib/dos.i"

    libheader   195,0,0,Exit,LibErrs

    afunction   word
        args
        libs    doslib,la6
        subs    _CtrlC,0,0
    name       "CtrlC"," - Returns True if a CTRL/C has been received"

    afunction   long
        args    long
        libs    execlib,la6
        subs    _New,0,0

        args    long,long
        libs    execlib,la6
        subs    _New_a,0,0
    name        "New","(Size[,Type]) - Allocates Memory"

    astatement
        args    long
        libs    execlib,la6
        subs    _Dispose,0,0
    name        "Dispose","(Addr) - Deallocates previously allocated memory"

    acommand    word
        args
        libs    execlib,la0
        subs    _KickVersion,0,0

        args    word
        libs    execlib,la0
        subs    _KickVersion_a,0,0
    name       "KickVersion","[(Ver)] - Used to Check/Get Kickstart version."

    afunction  long
        args
        libs    execlib,ld0
        subs    _execbase,0,0
    name       "execbase","- Returns pointer to Exec library base."

Exit:   nullsub LibExit,0,0, execlib,la6

    libfin

****************************************************************************************

_New:
    MOVE.L  #$10000,d1                  ; d1 := #MEMF_CLEAR
_New_a:
    ADDQ.L  #8,d0                       ; d0 := Size + 8
    MOVE.L  d0,d2                       ; d2 := d0
    Call    AllocMem
    TST.L   d0
    BEQ.B   1$                          ; AllocMem() failed
    MOVEA.L d0,a0                       ; a0 := MemPtr
    MOVE.L  d2,4(a0)                    ; Save Size
    MOVE.L  __MemEntry(pc),(a0)
    MOVE.L  d0,__MemEntry               ; Save last allocated in d0
    ADDQ.L  #8,d0                       ; d0 := MemPtr + 8
1$  RTS

_Dispose:
    TST.L   d0
    BEQ.B   2$                          ; Nothing to Dispose
    SUBQ.L  #8,d0                       ; d0 := Real MemPtr
    LEA     __MemEntry(pc),a1           ; a1 := MemList
1$  MOVE.L  (a1),d1                     ; d1 := Ptr to last MemChunk allocated
    BEQ.B   2$                          ; NULL when no memory have been allocated yet
    MOVEA.L a1,a2                       ; a2 := MemList
    MOVEA.L d1,a1                       ; a1 := Ptr to last MemChunk allocated
    CMP.L   d1,d0                       ; is Arg Ptr to last MemSize allocated ?
    BNE.B   1$                          ; No : Arg <> Ptr to...
    MOVE.L  4(a1),d0                    ; d0 := MemSize
    MOVE.L  (a1),(a2)                   ; Save Next MemChunk in MemList
    Call    FreeMem
2$  RTS

_CtrlC:
    MOVE.L  #$1000,d1
    Call    CheckSignal
    RTS

_KickVersion:
    MOVE.W  20(a0),d0
    RTS
_KickVersion_a:
    CMP.W   20(a0),d0
    BGE     Oops
    MOVEQ   #-1,d0
_execbase:
    RTS

Oops:
    MOVEQ   #0,d0
    RTS

LibExit:
    MOVEA.L __MemEntry(pc),a2
    MOVE.L  a2,d0
    BEQ.B   2$                          ; No MemList
1$  MOVEA.L a2,a1                       ; a1 := MemPtr
    MOVE.L  4(a2),d0                    ; d0 := MemSize
    MOVEA.L (a2),a2                     ; a2 := Next MemChunk
    Call    FreeMem                     ; (a1/d0)
    MOVE.L  a2,d0                       ; d0 := Next MemChunk
    BNE.B   1$                          ; d0 <> NULL
2$  RTS

__MemEntry
    Dc.l    0

LibErrs:
    Dc.b    "$VER: Lotan's System Library 0.12 (17-04-99),0
    Even
