;MEMUSE

       SEARCH  SYS
       SEARCH  SYSSYM

       CLR     D1
       CALL    SHOADR
       TYPE    <AMOS memory    >
       MOV     SYSBAS,D1
       CALL    SHOSIZ

       MOV     SYSBAS,D1
       CALL    SHOADR
       TYPE    <System memory  >
       MOV     MEMBAS,D1
       SUB     SYSBAS,D1
       CALL    SHOSIZ

       MOV     MEMBAS,D1
       CALL    SHOADR
       TYPE    <User memory    >
       MOV     MEMEND,D1
       SUB     MEMBAS,D1
       CALL    SHOSIZ

       TYPECR  <                         ---------->

       TYPE    <          Total memory   >
       MOV     MEMEND,D1
       CALL    SHOSIZ

       CRLF                            ;

;find amount of user memory in use

       CLR     D0                      ; size of hold (largest)
       CLR     D4                      ; not in use K count
       CLR     D5                      ; in use K count
       CLR     D3                      ; size of hole (current)
       CLR     D2                      ; state flag (0=unused, 1=used)

       CLR     D0                      ;
       MOV     MEMBAS,A0               ;
       MOV     MEMEND,A1               ;

LOOP:   CALL    OWNED                   ; see if this memory is in use
       BEQ     INUSE                   ;   yes, owned by a job

FREE:   INC     D4                      ; increment not-in-use K count
       TSTB    D2                      ; same state?
       BEQ     10$                     ;   yes
       CLRB    D2                      ;
       CLR     D3                      ;
10$:    INC     D3                      ;
       BR      NEXT                    ;

INUSE:  INC     D5                      ; increment in-use K count
       TSTB    D2                      ; same state?
       BNE     NEXT                    ;    yes
       TST     D3                      ;
       BEQ     NEXT                    ;
       TST     D0                      ;
       BEQ     10$                     ;
       CMP     D3,D0
       BLOS    NEXT                    ;
10$:    MOV     D3,D0                   ;

NEXT:   ADD     #1024.,A0               ;
       CMP     A0,A1                   ;
       BLO     LOOP                    ;

       CRLF                            ;

       TYPE    <Memory allocated to jobs >
       MOV     D5,D1                   ;
       MUL     D1,#1024.               ;
       CALL    SHOSIZ                  ;

       TYPE    <Memory free (not in use) >
       MOV     D4,D1                   ;
       MUL     D1,#1024.               ;
       CALL    SHOSIZ                  ;

       TYPE    <Largest free segment size>
       MOV     D0,D1                   ;
       MUL     D1,#1024.               ;
       CALL    SHOSIZ                  ;

       CRLF
       EXIT

;************
;*  SHOADR  *
;************
;Function:      Display memory address
;
;Inputs:        D1 - address

SHOADR: SAVE    A0                      ;
       JOBIDX  A0                      ;
       PUSHW   JOBTYP(A0)              ;
       ORW     #J.HEX,JOBTYP(A0)       ;
       OCVT    10,OT$TRM               ;
       TYPE    <  >                    ;
       POPW    JOBTYP(A0)              ;
       REST    A0                      ;
       RTN                             ;

;************
;*  SHOSIZ  *
;************
;Function:      Display amount of memory
;
;Inputs:        D1 - amount of bytes

SHOSIZ: SAVE    D1-D2                   ;
       DCVT    12,OT$TRM!OT$ZER        ;
       TYPE    < bytes >               ;
       CMP     D1,#1024.               ;
       JEQ     SHO.EL                  ;
       TYPE    < (>                    ;

SHO.BR: MOV     D1,D2                   ;
       CMP     D1,#1024.*1024.         ;
       BHIS    SHO.MB                  ;
       CMP     D1,#1024.               ;
       BHIS    SHO.KB                  ;

SHO.B:  DCVT    0,OT$TRM!OT$ZER         ;
       TYPE    < bytes>                ;
       BR      SHO.RT                  ;

SHO.KB: DIV     D1,#1024.               ;
       AND     #177777,D1              ;
       DCVT    0,OT$TRM!OT$ZER         ;
10$:    TYPE    < KB>                   ;
       MUL     D1,#1024.               ;
       SUB     D1,D2                   ;
       BEQ     SHO.RT                  ;
       MOV     D2,D1                   ;
       TYPE    <, >                    ;
       BR      SHO.BR                  ;

SHO.MB: DIV     D1,#1024.               ;
       AND     #177777,D1              ;
       DIV     D1,#1024.               ;
       AND     #177777,D1              ;
       DCVT    0,OT$TRM!OT$ZER         ;
       TYPE    < MB>                   ;
       MUL     D1,#1024.               ;
       MUL     D1,#1024.               ;
       SUB     D1,D2                   ;
       BEQ     SHO.RT                  ;
       MOV     D2,D1                   ;
       TYPE    <, >                    ;
       JMP     SHO.BR                  ;

SHO.RT: TYPE    )                       ;
SHO.EL: CRLF                            ;
       REST    D1-D2                   ;
       RTN                             ;

;set Z if memory address A0 is in use by any job

OWNED:  SAVE    A2                      ;
       MOV     JOBTBL,A2               ;
10$:    MOV     (A2)+,D7                ;
       BEQ     10$                     ;
       CMP     D7,#-1                  ;
       BEQ     90$                     ;
       MOV     D7,A6                   ;
       TST     JOBSIZ(A6)              ;
       BEQ     10$                     ;
       MOV     JOBBAS(A6),D6           ;
       MOV     D6,D7                   ;
       ADD     JOBSIZ(A6),D7           ;
       CMP     A0,D6                   ;
       BLO     10$                     ;
       CMP     A0,D7                   ;
       BHI     10$                     ;

       REST    A2                      ;
       LCC     #PS.Z                   ;
       RTN                             ;

90$:    REST    A2                      ;
       LCC     #0                      ;
       RTN                             ;

       END