Annotation of os2sdk/startup/dos/stdalloc.asm, revision 1.1.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.