**********************************************************************
* Name: PMEM
* Stack: ( %port --> %free )
* Desc: Calculate free memory in given port
**********************************************************************
ASSEMBLE
CON(1) 8
RPL
xNAME PMEM
::
CK1&Dispatch
real
::
COERCE ( #port )
DUP#0=csedrp ( * Port 0 * )
:: 'EvalNoCK: xMEM ;
DUP PORTSTATUS ( #port present? write? merged? #size #addr )
5ROLL NOTcase SETPORTNOTAV ( #port write? merged? #size #addr )
4ROLLDROP ( #port merged? #size #addr )
ROT case ( * Merged port * )
:: 3DROP 'EvalNoCK: xMEM ;
ROTDUP ( #size #addr #port #port )
GX? ITE
:: G_PORTEOS# THIRTYTHREE ;
:: PORTEOS# TWO ;
ROT #<case SETPORTNOTAV ( #size #addr #endaddr )
SWAP#- #- UNCOERCE %2 %/ ( %free )
;
;
**********************************************************************