OBJNAM GETMEM.LIT ; Created 14-May-87, edited 14-May-87
; by Irv Bromberg, Medic/OS Consultants, Toronto, Canada
; Allows the size of any module in user's MEM: area to be changed relatively
; or absolutely.
RADIX 10
VMAJOR=1
VMINOR=0
VEDIT=1

SEARCH SYS
SEARCH SYSSYM

if eq,1
Syntax examples:

GETMEM MODULE.DAT 10    ; create module MODULE.DAT = 10 bytes
GETMEM MODULE.DAT 10K   ; create module MODULE.DAT = 10 kilobytes
GETMEM MODULE.DAT 101   ; rounded up to even size = 102 bytes

Of course any valid filename name may be substituted for MODULE.DAT (the
default extension for the module name is ".DAT").

The module cannot already exist.  A size of zero is allowed but not
terribly useful (unless the CHGMEM command is use later to increase it).
The created module is pre-cleared to nulls.

Possible messages:

?Improper file name - MEM:filnam.ext
?Duplicate file name - MEM:filnam.ext
?Memory allocation failed
?Missing size parameter

GETMEM.LIT is re-entrant and re-useable.

endc

JCB=A0
Buffer=A2
Name=A3
Module=A5

Size=D0
Char=D1
Number=D1

       PHDR    -1,0,PH$REE!PH$REU

       MOV     JOBCUR,JCB              ; use JOBRBK as work area
       LEA     Name,JOBRBK(JCB)
       CLR     @Name                   ; pre-clear filename in case
       CLR     4(Name)                 ; of invalid entry
       FILNAM  @Name,DAT

Search: TST     @Name                   ; name received?
       BNE     10$
       TYPE    <?Improper>
       BR      20$
10$:    SRCH    @Name,Module,F.USR      ; module already in MEM:?
       BNE     GetSiz                  ; no, OK to create it
       TYPE    <?Duplicate>
20$:    TYPE    < file name - MEM:>
       PRNAM   @Name
       CRLF
       EXIT

GetSiz: BYP                             ; allow blank or tab separators
       MOVB    @Buffer,Char            ; check for absolute specifier "="
       CMPB    Char,#'=
       BEQ     SkipIt
ChkComma:CMPB   Char,#',                ; allow comma
       BNE     GetNum
SkipIt: INCW    Buffer                  ; skip comma
       BYP                             ; bypass possibly more whitespace

GetNum: LIN                             ; should not be at end of line
       BNE     10$
       TYPECR  <?Missing size parameter>
       EXIT

10$:    GTDEC
       MOV     Number,Size
Kilo:   CMPB    @Buffer,#'K             ; kilobytes?
       BNE     FixSiz
       MUL     Size,#1024              ; yes, convert to KB

FixSiz: INC     Size                    ; make it even
       BCLR    #0,Size
       PUSH    Size
       PUSH
       GETMEM  @SP
       BNE     Done                    ; NE=failed, errmsg on screen
       POP     Module
       POP
       MOV     (Name)+,-6(Module)      ; save filename.ext
       MOVW    @Name,-2(Module)
       ORW     #FIL,-8(Module)         ; keep it around please

Done:   EXIT

       END