home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l040 / 13.ddi / RTLSYS.ZIP / HEAP.ASM < prev    next >
Encoding:
Assembly Source File  |  1992-10-28  |  5.2 KB  |  373 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Turbo Pascal Run-time Library                   *
  5. ; *    Heap Manager                    *
  6. ; *                            *
  7. ; *     Copyright (c) 1988,92 Borland International     *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    HEAP
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. DATA    SEGMENT    WORD PUBLIC
  16.  
  17. ; Externals
  18.  
  19.     EXTRN    HeapOrg:DWORD,HeapPtr:DWORD,HeapEnd:DWORD
  20.     EXTRN    FreeList:DWORD,HeapError:DWORD
  21.  
  22. ; Local variables
  23.  
  24. AllocSize    DW    ?
  25.  
  26. DATA    ENDS
  27.  
  28. CODE    SEGMENT    BYTE PUBLIC
  29.  
  30.     ASSUME    CS:CODE,DS:DATA
  31.  
  32. ; Externals
  33.  
  34.     EXTRN    HaltError:NEAR
  35.  
  36. ; Publics
  37.  
  38.     PUBLIC    NewPtr,DisposePtr,MarkPtr,ReleasePtr
  39.     PUBLIC    GetFreMem,GetFreMax,NewMemory,DisMemory
  40.  
  41. ; New and GetMem standard procedures
  42.  
  43. NewPtr:
  44.  
  45.     PUSH    BP
  46.     MOV    BP,SP
  47.     MOV    AX,[BP+6]
  48.     CALL    NewMemory
  49.     POP    BP
  50.     JC    @@1
  51.     RETF    2
  52. @@1:    MOV    AX,203
  53.     JMP    HaltError
  54.  
  55. ; Dispose and FreeMem standard procedures
  56.  
  57. DisposePtr:
  58.  
  59.     PUSH    BP
  60.     MOV    BP,SP
  61.     MOV    AX,[BP+6]
  62.     LES    CX,[BP+8]
  63.     MOV    BX,ES
  64.     CALL    DisMemory
  65.     POP    BP
  66.     JC    @@1
  67.     RETF    6
  68. @@1:    MOV    AX,204
  69.     JMP    HaltError
  70.  
  71. ; Mark standard procedure
  72.  
  73. MarkPtr:
  74.  
  75.     MOV    BX,SP
  76.     LES    DI,SS:[BX+4]
  77.     CLD
  78.     MOV    AX,HeapPtr.w0
  79.     STOSW
  80.     MOV    AX,HeapPtr.w2
  81.     STOSW
  82.     RETF    4
  83.  
  84. ; Release standard procedure
  85.  
  86. ReleasePtr:
  87.  
  88.     MOV    BX,SP
  89.     LES    DI,SS:[BX+4]
  90.     LES    DI,ES:[DI]
  91.     MOV    HeapPtr.w0,DI
  92.     MOV    HeapPtr.w2,ES
  93.     MOV    FreeList.w0,DI
  94.     MOV    FreeList.w2,ES
  95.     RETF    4
  96.  
  97. ; MemAvail standard function
  98.  
  99. GetFreMem:
  100.  
  101.     MOV    BX,OFFSET CS:@@4
  102.     JMP    SHORT GetFreHeap
  103. @@1:    ADD    DX,1000H
  104.     JMP    SHORT @@3
  105. @@2:    ADD    AX,DS:[SI].mSize.w0
  106.     JC    @@1
  107. @@3:    ADD    DX,DS:[SI].mSize.w2
  108.     LDS    SI,DS:[SI].mNext
  109. @@4:    MOV    BX,DS
  110.     CMP    BX,DI
  111.     JNE    @@2
  112.     RET
  113.  
  114. ; MaxAvail standard function
  115.  
  116. GetFreMax:
  117.  
  118.     MOV    BX,OFFSET CS:@@4
  119.     JMP    SHORT GetFreHeap
  120. @@1:    CMP    DX,DS:[SI].mSize.w2
  121.     JA    @@3
  122.     JB    @@2
  123.     CMP    AX,DS:[SI].mSize.w0
  124.     JAE    @@3
  125. @@2:    MOV    AX,DS:[SI].mSize.w0
  126.     MOV    DX,DS:[SI].mSize.w2
  127. @@3:    LDS    SI,DS:[SI].mNext
  128. @@4:    MOV    BX,DS
  129.     CMP    BX,DI
  130.     JNE    @@1
  131.     RET
  132.  
  133. ; Common MemAvail/MaxAvail calculation
  134.  
  135. GetFreHeap:
  136.  
  137.     MOV    AX,HeapEnd.w0
  138.     MOV    DX,HeapEnd.w2
  139.     SUB    AX,HeapPtr.w0
  140.     SBB    DX,HeapPtr.w2
  141.     AND    AX,0FH
  142.     PUSH    DS
  143.     MOV    DI,HeapPtr.w2
  144.     LDS    SI,FreeList
  145.     CALL    BX
  146.     POP    DS
  147.     MOV    CL,4
  148.     ROL    DX,CL
  149.     MOV    CX,DX
  150.     AND    CL,0F0H
  151.     AND    DX,0FH
  152.     ADD    AX,CX
  153.     ADC    DX,0
  154.     RETF
  155.  
  156. ; Allocate memory
  157. ; In    AX    = Size
  158. ; Out    DX:AX = Pointer
  159. ;    CF    = 1 if error
  160.  
  161. NewMemory:
  162.  
  163.     OR    AX,AX
  164.     JE    @@9
  165.     MOV    AllocSize,AX
  166. @@1:    CALL    PointerSize
  167.     MOV    DI,OFFSET DS:FreeList
  168.     MOV     CX,DS
  169.     MOV    ES,CX
  170. @@2:    MOV    CX,DI
  171.     MOV    BX,ES
  172.     LES    DI,ES:[DI].mNext
  173.     MOV    SI,ES
  174.     CMP    SI,HeapPtr.w2
  175.     JE    @@6
  176.     CMP    DX,ES:[DI].mSize.w2
  177.     JA    @@2
  178.     JB    @@3
  179.     CMP    AX,ES:[DI].mSize.w0
  180.     JA    @@2
  181. @@3:    PUSH    ES
  182.     PUSH    DI
  183.     PUSH    BX
  184.     PUSH    CX
  185.     MOV    CX,ES:[DI].mNext.w0
  186.     MOV    BX,ES:[DI].mNext.w2
  187.     JE    @@4
  188.     PUSH    BX
  189.     PUSH    CX
  190.     MOV    CX,ES:[DI].mSize.w0
  191.     MOV    BX,ES:[DI].mSize.w2
  192.     SUB    CX,AX
  193.     SBB    BX,DX
  194.     AND    CX,0FH
  195.     ADD    AX,DI
  196.     ADD    DX,SI
  197.     ADD    AL,0F0H
  198.     ADC    DX,0
  199.     AND    AL,0FH
  200.     MOV    DI,AX
  201.     MOV    ES,DX
  202.     POP    ES:[DI].mNext.w0
  203.     POP    ES:[DI].mNext.w2
  204.     MOV    ES:[DI].mSize.w0,CX
  205.     MOV    ES:[DI].mSize.w2,BX
  206.     MOV    CX,DI
  207.     MOV    BX,ES
  208. @@4:    POP    DI
  209.     POP    ES
  210.     MOV    ES:[DI].mNext.w0,CX
  211.     MOV    ES:[DI].mNext.w2,BX
  212.     POP    AX
  213.     POP    DX
  214.     CLC
  215. @@5:    RET
  216. @@9:    XOR    AX,AX
  217.     CWD
  218.     RET
  219. @@6:    ADD    AX,DI
  220.     ADD    DX,SI
  221.     ADD    AL,0F0H
  222.     ADC    DX,0
  223.     AND    AL,0FH
  224.     CMP    DX,HeapEnd.w2
  225.     JB    @@7
  226.     JA    @@8
  227.     CMP    AX,HeapEnd.w0
  228.     JA    @@8
  229. @@7:    PUSH    ES
  230.     PUSH    DI
  231.     MOV    DI,CX
  232.     MOV    ES,BX
  233.     MOV    HeapPtr.w0,AX
  234.     MOV    HeapPtr.w2,DX
  235.     MOV    ES:[DI].mNext.w0,AX
  236.     MOV    ES:[DI].mNext.w2,DX
  237.     XOR    AX,AX
  238.     PUSH    AX
  239.     CALL    HeapError
  240.     POP    AX
  241.     POP    DX
  242.     CLC
  243.     RET
  244. @@8:    PUSH    AllocSize
  245.     CALL    HeapError
  246.     CMP    AL,1
  247.     JB    @@5
  248.     JE    @@9
  249.     MOV    AX,AllocSize
  250.     JMP    @@1
  251.  
  252. ; Dispose memory
  253. ; In    AX    = Size
  254. ;    BX:CX = Pointer
  255. ; Out    CF    = 1 if error
  256.  
  257. DisMemory:
  258.  
  259.     OR    AX,AX
  260.     JE    @@6
  261.     TEST    CX,0FFF7H
  262.     JNE    @@5
  263.     CMP    BX,HeapOrg.w2
  264.     JA    @@1
  265.     JB    @@5
  266.     CMP    CX,HeapOrg.w0
  267.     JB    @@5
  268. @@1:    CMP    BX,HeapPtr.w2
  269.     JB    @@2
  270.     JA    @@5
  271.     CMP    CX,HeapPtr.w0
  272.     JAE    @@5
  273. @@2:    CALL    PointerSize
  274.     MOV    DI,CX
  275.     MOV    ES,BX
  276.     MOV    ES:[DI].mSize.w0,AX
  277.     MOV    ES:[DI].mSize.w2,DX
  278.     MOV    DI,OFFSET DS:FreeList
  279.     MOV    AX,DS
  280.     MOV    ES,AX
  281. @@3:    MOV    AX,DI
  282.     MOV    DX,ES
  283.     LES    DI,ES:[DI].mNext
  284.     MOV    SI,ES
  285.     CMP    BX,SI
  286.     JA    @@3
  287.     JB    @@4
  288.     CMP    CX,DI
  289.     JA    @@3
  290.     JE    @@5
  291. @@4:    PUSH    DX
  292.     PUSH    AX
  293.     CALL    MergeCheck
  294.     POP    CX
  295.     POP    BX
  296.     CALL    MergeCheck
  297.     CLC
  298.     RET
  299. @@5:    STC
  300. @@6:    RET
  301.  
  302. ; Merge adjacent blocks
  303. ; In    BX:CX = Target block pointer
  304. ;    ES:DI = Next block pointer
  305. ; Out    ES:DI = Target block pointer
  306.  
  307. MergeCheck:
  308.  
  309.         MOV    AX,DI
  310.     MOV    DX,ES
  311.     MOV    DI,CX
  312.     MOV    ES,BX
  313.     ADD    CX,ES:[DI].mSize.w0
  314.     ADD    BX,ES:[DI].mSize.w2
  315.     ADD    CL,0F0H
  316.     ADC    BX,0
  317.     AND    CL,0FH
  318.     CMP    BX,DX
  319.     JNE    @@2
  320.     CMP    CX,AX
  321.     JNE    @@2
  322.     CMP    DX,HeapPtr.w2
  323.     JNE    @@1
  324.     CMP    AX,HeapPtr.w0
  325.     JNE    @@1
  326.     MOV    HeapPtr.w0,DI
  327.     MOV    HeapPtr.w2,ES
  328.     RET
  329. @@1:    PUSH    DS
  330.     PUSH    DI
  331.     MOV    SI,AX
  332.     MOV    DS,DX
  333.     CLD
  334.     MOVSW
  335.     MOVSW
  336.     LODSW
  337.     XCHG    AX,DX
  338.     LODSW
  339.     XCHG    AX,DX
  340.     ADD    AX,ES:[DI].w0
  341.     ADD    DX,ES:[DI].w2
  342.     ADD    AL,0F0H
  343.     ADC    DX,0
  344.     AND    AL,0FH
  345.     STOSW
  346.     XCHG    AX,DX
  347.     STOSW
  348.     POP    DI
  349.     POP    DS
  350.     RET
  351. @@2:    MOV    ES:[DI].mNext.w0,AX
  352.     MOV    ES:[DI].mNext.w2,DX
  353.     RET
  354.  
  355. ; Convert word size to pointer size
  356. ; In    AX    = Word size
  357. ; Out    DX:AX = Pointer size
  358.  
  359. PointerSize:
  360.  
  361.     ADD    AX,7
  362.     MOV    DX,AX
  363.     RCR    DX,1
  364.     SHR    DX,1
  365.     SHR    DX,1
  366.     SHR    DX,1
  367.     AND    AX,8
  368.     RET
  369.  
  370. CODE    ENDS
  371.  
  372.     END
  373.