gno/bin/gsh/bufpool.asm

137 lines
2.8 KiB
NASM

**************************************************************************
*
* The GNO Shell Project
*
* Developed by:
* Jawaid Bazyar
* Tim Meekins
*
* $Id: bufpool.asm,v 1.7 1999/02/08 17:26:50 tribby Exp $
*
**************************************************************************
*
* BUFPOOL
* By Tim Meekins
* Modified by Dave Tribby for GNO 2.0.6
*
* This is the buffer pool
*
* Note: text set up for tabs at col 16, 22, 41, 49, 57, 65
* | | | | | |
* ^ ^ ^ ^ ^ ^
**************************************************************************
*
* Interfaces defined in this file:
* The alloc routine is a jsl without any stack params.
* Pointer to requested buffer is returned in X/A registers.
* allocmaxline
* The free routine takes the address from the X/A registers
* freemaxline
*
* bufpool data:
* pmaxline dc i4'0'
* pmaxlinemutex key
*
**************************************************************************
mcopy /obj/gno/bin/gsh/bufpool.mac
dummybufpool start ; ends up in .root
end
setcom 60
**************************************************************************
*
* Get a buffer of size maxline_size
*
**************************************************************************
allocmaxline START
using bufpool
lock pmaxlinemutex
lda pmaxline If pool pointer
ora pmaxline+2 isn't NULL,
beq allocbuf
phd
ph4 pmaxline Push pool pointer on stack.
tsc
tcd
lda [1] Replace pool pointer with
sta pmaxline the address it points to.
ldy #2
lda [1],y
sta pmaxline+2
unlock pmaxlinemutex
pla
plx
pld
rtl Return to caller.
;
; No memory in free pool; must allocate a new block.
;
allocbuf unlock pmaxlinemutex
ph4 maxline_size
~NEW
rtl
;
; Constant indicating # of bytes in a maxline buffer
;
maxline_size entry Make this easily seen.
dc i4'4096'
END
**************************************************************************
*
* Free a buffer of size maxline_size, putting it into the free pool
*
**************************************************************************
freemaxline START
using bufpool
phd
phx
pha
tsc
tcd
lock pmaxlinemutex
lda pmaxline Move current head of pool list
sta [1] into the buffer being freed.
ldy #2
lda pmaxline+2
sta [1],y
lda 1 Put address of buffer being freed
sta pmaxline into the pool list head.
lda 3
sta pmaxline+2
unlock pmaxlinemutex
pla
plx
pld
rtl Return to caller.
END
**************************************************************************
*
* Buffer pool data
*
**************************************************************************
bufpool DATA
pmaxline dc i4'0' Head of free pool list.
pmaxlinemutex key Mutual exclusion when modifying list.
END