home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
581a.lha
/
MemMan_v2.0
/
MemManLib.asm
< prev
next >
Wrap
Assembly Source File
|
1991-12-04
|
4KB
|
158 lines
* Lib.asm - Runtime library interface for Guido - © 1991 Bryan Ford *
include "exec/types.i"
include "exec/initializers.i"
include "exec/libraries.i"
include "exec/lists.i"
include "exec/alerts.i"
include "exec/resident.i"
include "exec/semaphores.i"
include "exec/funcdef.i"
include "exec/exec_lib.i"
include "bry/macros.i"
VERSION equ 1 ; Don't forget to change the idstring
REVISION equ 0
STRUCTURE MemManLibrary,0
STRUCT lib_Node,LIB_SIZE
UBYTE lib_Flags ; Defined below
BYTE lib_pad
LONG lib_SegList ; Library SegList
APTR lib_SysBase ; A bunch of library pointers
APTR lib_DOSBase
APTR lib_GfxBase
APTR lib_IntuitionBase
APTR lib_GadToolsBase ; From here on are optional libraries
APTR lib_AslBase
APTR lib_ArpBase
LABEL lib_Size
code text
xref MMInit,MMFinish
dosentry:
moveq #-1,d0
rts
idstring:
dc.b "memman.library 1.0 (4-Dec-91) Copyright 1991 Bryan Ford"
ds.w 0
initdescrip:
DC.W RTC_MATCHWORD ; UWORD RT_MATCHWORD
DC.L initdescrip ; APTR RT_MATCHTAG
DC.L endcode ; APTR RT_ENDSKIP
DC.B RTF_AUTOINIT ; UBYTE RT_FLAGS
DC.B VERSION ; UBYTE RT_VERSION
DC.B NT_LIBRARY ; UBYTE RT_TYPE
DC.B 0 ; BYTE RT_PRI
DC.L libname ; APTR RT_NAME
DC.L idstring ; APTR RT_IDSTRING
DC.L init ; APTR RT_INIT
init:
DC.L lib_Size ; size of library base data space
DC.L functable ; pointer to function initializers
DC.L datatable ; pointer to data initializers
DC.L initroutine ; routine to run
functable:
;------ standard system routines
dc.l Open
dc.l Close
dc.l Expunge
dc.l Null
;------ my libraries definitions
dcx.l MMAddNode
dcx.l MMRemNode
;------ function table end marker
dc.l -1
datatable:
INITBYTE LN_TYPE,NT_LIBRARY
INITLONG LN_NAME,libname
INITBYTE LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
INITWORD LIB_VERSION,VERSION
INITWORD LIB_REVISION,REVISION
INITLONG LIB_IDSTRING,idstring
dc.l 0
initroutine:
push a5
move.l d0,a5
move.l a6,lib_SysBase(a5)
move.l a0,lib_SegList(a5)
bsr MMInit
tst.l d0
bz.s \err
move.l a5,d0
\err
pop a5
rts
Open: ; ( libptr:a6, version:d0 )
addq.w #1,LIB_OPENCNT(a6)
bclr #LIBB_DELEXP,lib_Flags(a6)
move.l a6,d0
rts
Close: ; ( libptr:a6 )
cq d0
subq.w #1,LIB_OPENCNT(a6)
bnz.s \noexp
btst #LIBB_DELEXP,lib_Flags(a6)
bnz.s Expunge
\noexp
rts
Expunge: ; ( libptr: a6 )
apush
move.l a6,a5
move.l lib_SysBase(a5),a6
;------ see if anyone has us open
tst.w LIB_OPENCNT(a5)
bz.s 1$
;------ it is still open. set the delayed expunge flag
bset #LIBB_DELEXP,lib_Flags(a5)
cq d0
b.s 9$
1$
bsr MMFinish
move.l lib_SegList(a5),d2
;------ unlink from library list
move.l a5,a1
jsr _LVORemove(a6)
;------ free our memory
moveq #0,d0
move.l a5,a1
move.w LIB_NEGSIZE(a5),d0
sub.l d0,a1
add.w LIB_POSSIZE(a5),d0
jsr _LVOFreeMem(a6)
move.l d2,d0
9$
apop
rts
Null:
moveq #0,d0
rts
libname dc.b "memman.library",0
endcode:
end