76 lines
1.9 KiB
NASM
76 lines
1.9 KiB
NASM
|
;
|
||
|
; Copyright (c) Mix Software 1988
|
||
|
;
|
||
|
; --------------------------------------------------
|
||
|
; alloca - allocate from the stack
|
||
|
; returns null if not enough memory
|
||
|
; char *_alloca(size)
|
||
|
; unsigned size;
|
||
|
; --------------------------------------------------
|
||
|
;
|
||
|
IDT alloca
|
||
|
DEF alloca
|
||
|
DREF $$LIMIT
|
||
|
DREF $$MAXS
|
||
|
;
|
||
|
alloca MOV SI,SP
|
||
|
MOV AX,[SI][%PARM1-2] ; Requested size
|
||
|
SUB SI,[$$LIMIT] ; Stack boundary
|
||
|
CMP SI,AX
|
||
|
JB NOSPACE
|
||
|
POP BX ; Remove return
|
||
|
POP CX
|
||
|
POP DX ; argument
|
||
|
SUB SP,AX
|
||
|
MOV AX,SP
|
||
|
DEC AX
|
||
|
AND AX,>FFFE
|
||
|
MOV SP,AX
|
||
|
PUSH DX
|
||
|
PUSH CX
|
||
|
PUSH BX
|
||
|
CMP AX,[$$MAXS]
|
||
|
JAE EXIT
|
||
|
MOV [$$MAXS],AX
|
||
|
EXIT RETSEG
|
||
|
NOSPACE XOR AX,AX
|
||
|
RETSEG
|
||
|
END
|
||
|
;
|
||
|
; --------------------------------------------------
|
||
|
; stackavail - return available stack
|
||
|
; returns amount of stack space available
|
||
|
; unsigned stackavail()
|
||
|
; --------------------------------------------------
|
||
|
;
|
||
|
IDT stackava
|
||
|
IF LONGNAME
|
||
|
LDEF stackavail
|
||
|
ENDIF
|
||
|
IF SHORTNAM
|
||
|
DEF stackava
|
||
|
ENDIF
|
||
|
DREF $$LIMIT
|
||
|
DREF $$MAXS
|
||
|
;
|
||
|
stackavail MOV AX,SP
|
||
|
SUB AX,[$$LIMIT] ; Stack boundary
|
||
|
RETSEG
|
||
|
END
|
||
|
;
|
||
|
; --------------------------------------------------
|
||
|
; stacksiz - return available stack
|
||
|
; returns amount of stack space available
|
||
|
; unsigned stacksiz()
|
||
|
; --------------------------------------------------
|
||
|
;
|
||
|
IDT stacksiz
|
||
|
DEF stacksiz
|
||
|
DREF $$LIMIT
|
||
|
DREF $$MAXS
|
||
|
;
|
||
|
stacksiz MOV AX,SP
|
||
|
SUB AX,[$$LIMIT] ; Stack boundary
|
||
|
RETSEG
|
||
|
END
|