Annotation of os2sdk/startup/dos/stdalloc.asm, revision 1.1

1.1     ! root        1:        TITLE   stdalloc - memory allocation routine for stdargv, stdenvp
        !             2: ;***
        !             3: ;stdalloc.asm - memory allocation routine for stdargv, stdenvp
        !             4: ;
        !             5: ;      Copyright (c) 1985-1987, Microsoft Corporation.  All rights reserved.
        !             6: ;
        !             7: ;Purpose:
        !             8: ;      Memory allocation for stdargv and stdenvp.
        !             9: ;
        !            10: ;*******************************************************************************
        !            11: 
        !            12: include        version.inc
        !            13: .xlist
        !            14: ifdef  _QC                     ;[3] Move these includes out of version.inc
        !            15: include        \sl\qc\src\include\kernel.inc   ;[3]
        !            16: include \sl\qc\src\include\kmac.inc    ;[3]
        !            17: endif  ;_QC                    ;[3]
        !            18: 
        !            19: include        cmacros.inc
        !            20: include        msdos.inc
        !            21: include        brkctl.inc
        !            22: .list
        !            23: 
        !            24: 
        !            25: sBegin data
        !            26: assumes        ds,data
        !            27: externW        _psp                    ; PSP segment #
        !            28: externW        _abrktb                 ; break table for allocation
        !            29: externW        _asizds                 ; break table for allocation end
        !            30: 
        !            31: ifdef  _QC                     ; [1]
        !            32: extrn  __QCrtcsip:DWORD        ; [1]
        !            33: endif  ;_QC                    ; [1]
        !            34: 
        !            35: sEnd   data
        !            36: 
        !            37: sBegin code
        !            38: assumes        ds,data
        !            39: assumes        cs,code
        !            40: 
        !            41: externNP _amsg_exit            ; write error and die routine
        !            42: 
        !            43: page
        !            44: ;***
        !            45: ;_myalloc - low overhead heap allocation
        !            46: ;
        !            47: ;Purpose:
        !            48: ;      Used to allocate heap space, without the overhead of
        !            49: ;      malloc for both wildcard arguments and environment strings, ptrs.
        !            50: ;
        !            51: ;      Tries to find space in heap, failing this calls dos to extend
        !            52: ;      heap and tries again, failing this spits out error message and
        !            53: ;      dies.
        !            54: ;
        !            55: ;Entry:
        !            56: ;      BP      = number of bytes in table ( argv/ or envp )
        !            57: ;      AX      = total number of bytes to allocate table and strings
        !            58: ;      DI      = error message number in case of death.
        !            59: ;
        !            60: ;Exit:
        !            61: ;      BP      = points to table
        !            62: ;      AX      = size of table in bytes.
        !            63: ;
        !            64: ;Uses:
        !            65: ;
        !            66: ;Exceptions:
        !            67: ;      If can't get enough memory, gives
        !            68: ;      error 2009/2008: no space for enviroment/arguments
        !            69: ;      and then dies.
        !            70: ;
        !            71: ;*******************************************************************************
        !            72: 
        !            73: 
        !            74: cProc  _myalloc,<NEAR,PUBLIC>,<>
        !            75: 
        !            76: cBegin nogen
        !            77: assumes        ds,data
        !            78:        mov     dx,ax           ; save size of environment
        !            79:        add     ax,[_abrktb].sz ; ax = DS offset of end of environment
        !            80:        jc      _hpovr          ; environment won't fit w/in 64k
        !            81:                                ; give error
        !            82:        cmp     [_asizds],ax    ; will env fit in allocated mem?
        !            83:        jnc     _hpok           ; yes, go move it
        !            84:                                ; need more memory
        !            85:        add     ax,15d          ; round up to nearest paragraph
        !            86:        push    ax              ; save this for later
        !            87:        rcr     ax,1            ; shift right including carry from add
        !            88:        mov     cl,3
        !            89:        shr     ax,cl           ; convert to # of paragraphs
        !            90:        mov     cx,ds
        !            91:        mov     bx,[_psp]
        !            92:        sub     cx,bx           ; DGROUP - _PSP
        !            93:        add     ax,cx           ; make # of paragraphs _PSP relative
        !            94:        mov     es,bx           ; seg addr of mem area
        !            95:        mov     bx,ax           ; set up for OS call
        !            96:        callos  setmem          ; change size of mem block to bx paras
        !            97:        pop     ax              ; restore (env size + 15)
        !            98:        jc      _hpovr          ; not enough memory, give error
        !            99:        and     al,0F0h         ; round down to nearest paragraph addr
        !           100:        dec     ax
        !           101:        mov     [_asizds],ax    ; store new last byte of DGROUP
        !           102: 
        !           103: _hpok:
        !           104:        xchg    ax,bp           ; ax = size of env ptr table
        !           105:        mov     bp,[_abrktb].sz ; bp points to mem for storing env ptrs
        !           106:        add     [_abrktb].sz,dx ; update bottom of heap
        !           107:        ret
        !           108: 
        !           109: _hpovr:
        !           110: ifdef  _QC                                     ; [1]
        !           111:        extrn   $F_PSP:WORD                     ;[2]
        !           112:        mov     ds,cs:[$F_PSP]                  ;[2] get PSP
        !           113:        mov     ax,ds:[PSP_DGROUP_SEG]          ;[2] get DGROUP
        !           114:        mov     ds, ax                          ;[2] ds = DGROUP
        !           115: 
        !           116:        pop     word ptr [__QCrtcsip]           ; [1] Offset
        !           117:        mov     word ptr [__QCrtcsip+2], cs     ; [1] Segment (proc is near)
        !           118: endif  ;_QC                                    ; [1]
        !           119: 
        !           120:        mov     ax,di           ; error 2009/2008: no space for enviroment/arguments
        !           121:        jmp     _amsg_exit      ; give error and die
        !           122: 
        !           123: cEnd   nogen
        !           124: 
        !           125: 
        !           126: sEnd   code
        !           127: 
        !           128:        end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.