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

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *    Turbo Pascal Runtime Library            *
  5. ; *    Protected Mode Memory Manager            *
  6. ; *                            *
  7. ; *    Copyright (C) 1988,91 Borland International    *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    WMEM
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. ; Heap segment header
  16.  
  17. hsSignature    EQU    (WORD PTR 0)
  18. hsReserved    EQU    (WORD PTR 2)
  19. hsFreeList    EQU    (BYTE PTR 4)
  20. hsMemFree    EQU    (WORD PTR 8)
  21. hsNextHeap    EQU    (WORD PTR 10)
  22. hsHeapOrg    EQU    (BYTE PTR 12)
  23.  
  24. ; Heap block header
  25.  
  26. hbNext        EQU    (WORD PTR 0)
  27. hbSize        EQU    (WORD PTR 2)
  28.  
  29.     IF DPMIVersion
  30.     .286P
  31.     ENDIF
  32.  
  33. DATA    SEGMENT    WORD PUBLIC
  34.  
  35. ; Externals
  36.  
  37.     EXTRN    HeapList:WORD,HeapLimit:WORD,HeapBlock:WORD
  38.     EXTRN    HeapError:DWORD
  39.     IF WindowsVersion
  40.     EXTRN    HeapAllocFlags:WORD
  41.     ENDIF
  42.  
  43. ; Local variables
  44.  
  45. AllocSize    DW    ?
  46.  
  47. DATA    ENDS
  48.  
  49. ; External memory manager entry points
  50.  
  51.     IF WindowsVersion
  52.     EXTRN    GlobalAlloc:FAR,GlobalLock:FAR,GlobalFree:FAR
  53.     EXTRN    GlobalHandle:FAR,GlobalUnlock:FAR,GlobalCompact:FAR
  54.     EXTRN    GetFreeSpace:FAR
  55.     ELSE
  56.     EXTRN    MemAllocateBlock:FAR,MemFreeBlock:FAR,MemQueryFreeMem:FAR
  57.     ENDIF
  58.  
  59. CODE    SEGMENT    BYTE PUBLIC
  60.  
  61.     ASSUME    CS:CODE,DS:DATA
  62.  
  63. ; Externals
  64.  
  65.     EXTRN    HaltError:NEAR
  66.  
  67. ; Publics
  68.  
  69.     PUBLIC    NewPtr,DisposePtr,MarkPtr,ReleasePtr
  70.     PUBLIC    GetFreMem,GetFreMax,NewMemory,DisMemory
  71.  
  72. ; New and GetMem standard procedures
  73.  
  74. NewPtr:
  75.  
  76.     INC    BP
  77.     PUSH    BP
  78.     MOV    BP,SP
  79.     PUSH    DS
  80.     MOV    AX,[BP+6]
  81.     CALL    NewMemory
  82.     MOV    SP,BP
  83.     POP    BP
  84.     DEC    BP
  85.     JC    @@1
  86.     RETF    2
  87. @@1:    MOV    AX,203
  88.     JMP    HaltError
  89.  
  90. ; Dispose and FreeMem standard procedures
  91.  
  92. DisposePtr:
  93.  
  94.     INC    BP
  95.     PUSH    BP
  96.     MOV    BP,SP
  97.     PUSH    DS
  98.     MOV    AX,[BP+6]
  99.     MOV    CX,[BP+8]
  100.     MOV    BX,[BP+10]
  101.     CALL    DisMemory
  102.     MOV    SP,BP
  103.     POP    BP
  104.     DEC    BP
  105.     JC    MemError
  106.     RETF    6
  107.  
  108. ; Mark and Release standard procedures
  109.  
  110. MemError:
  111. MarkPtr:
  112. ReleasePtr:
  113.  
  114.     MOV    AX,204
  115.     JMP    HaltError
  116.  
  117. ; MemAvail standard function
  118.  
  119. GetFreMem:
  120.  
  121.     INC    BP
  122.     PUSH    BP
  123.     MOV    BP,SP
  124.     PUSH    DS
  125.     IF WindowsVersion
  126.     MOV    AX,1000H        ;GMEM_NOT_BANKED
  127.     PUSH    AX
  128.     CALL    GetFreeSpace
  129.     ELSE
  130.     PUSH    2
  131.     PUSH    0
  132.     CALL    MemQueryFreeMem
  133.     ENDIF
  134.     MOV    CX,HeapList
  135.     JCXZ    @@2
  136. @@1:    MOV    ES,CX
  137.     ADD    AX,ES:hsMemFree
  138.     ADC    DX,0
  139.     MOV    CX,ES:hsNextHeap
  140.     CMP    CX,HeapList
  141.     JNE    @@1
  142. @@2:    MOV    SP,BP
  143.     POP    BP
  144.     DEC    BP
  145.     RETF
  146.  
  147. ; MaxAvail standard function
  148.  
  149. GetFreMax:
  150.  
  151.     INC    BP
  152.     PUSH    BP
  153.     MOV    BP,SP
  154.     PUSH    DS
  155.     IF WindowsVersion
  156.     XOR    AX,AX
  157.     PUSH    AX
  158.     PUSH    AX
  159.     CALL    GlobalCompact
  160.     ELSE
  161.     PUSH    2
  162.     PUSH    0
  163.     CALL    MemQueryFreeMem
  164.     ENDIF
  165.     OR    DX,DX
  166.     JNE    @@3
  167.     MOV    CX,HeapList
  168.     JCXZ    @@3
  169. @@1:    MOV    ES,CX
  170.     CMP    AX,ES:hsMemFree
  171.     JAE    @@2
  172.     MOV    AX,ES:hsMemFree
  173. @@2:    MOV    CX,ES:hsNextHeap
  174.     CMP    CX,HeapList
  175.     JNE    @@1
  176. @@3:    MOV    SP,BP
  177.     POP    BP
  178.     DEC    BP
  179.     RETF
  180.  
  181. ; Allocate memory
  182. ; In    AX    = Size in bytes
  183. ; Out    DX:AX = Block pointer
  184. ;    CF    = 1 if error
  185.  
  186. NewMemory:
  187.  
  188.     OR    AX,AX
  189.     JE    @@7
  190.     MOV    AllocSize,AX
  191. @@1:    CMP    AX,HeapLimit
  192.     JB    @@2
  193.     CALL    NewGlobal
  194.     JNC    @@6
  195.     CMP    HeapLimit,0
  196.     JE    @@4
  197.     MOV    AX,AllocSize
  198.     MOV    BX,HeapBlock
  199.     SUB    BX,OFFSET hsHeapOrg
  200.     CMP    AX,BX
  201.     JA    @@4
  202.     CALL    NewHeapMem
  203.     JMP    SHORT @@3
  204. @@2:    CALL    NewHeapMem
  205.     JNC    @@6
  206.     MOV    AX,AllocSize
  207.     CALL    NewGlobal
  208. @@3:    JNC    @@6
  209. @@4:    MOV    AX,HeapError.ofs
  210.     OR    AX,HeapError.seg
  211.     JE    @@5
  212.     PUSH    AllocSize
  213.     CALL    HeapError
  214. @@5:    CMP    AX,1
  215.     MOV    AX,AllocSize
  216.     JA    @@1
  217.     JB    @@6
  218. @@7:    XOR    AX,AX
  219.     CWD
  220. @@6:    RET
  221.  
  222. ; Allocate global block
  223. ; In    AX    = Block size
  224. ; Out    DX:AX = Block pointer
  225. ;    CF    = 1 if error
  226.  
  227. NewGlobal:
  228.  
  229.     IF WindowsVersion
  230.     PUSH    HeapAllocFlags
  231.     XOR    DX,DX
  232.     PUSH    DX
  233.     PUSH    AX
  234.     CALL    GlobalAlloc
  235.     CMP    AX,1
  236.     JB    @@1
  237.     PUSH    AX
  238.     CALL    GlobalLock
  239.     CLC
  240.     ELSE
  241.     PUSH    0
  242.     MOV    DX,SP
  243.     PUSH    0            ;heapHandle
  244.     PUSH    AX            ;size
  245.     PUSH    2            ;attributes
  246.     PUSH    0            ;eventProc
  247.     PUSH    0
  248.     PUSH    SS            ;selector
  249.     PUSH    DX
  250.     CALL    MemAllocateBlock
  251.     POP    DX
  252.     OR    AX,AX
  253.     JE    @@1
  254.     STC
  255.     ENDIF
  256. @@1:    RET
  257.  
  258. ; Allocate heap block
  259. ; In    AX    = Block size
  260. ; Out    DX:AX = Block pointer
  261. ;    CF    = 1 if error
  262.  
  263. NewHeapMem:
  264.  
  265.     ADD    AX,3
  266.     AND    AL,0FCH
  267.     MOV    CX,HeapList
  268.     JCXZ    @@2
  269. @@1:    MOV    ES,CX
  270.     CALL    NewBlock
  271.     JNC    @@3
  272.     MOV    CX,ES:hsNextHeap
  273.     CMP    CX,HeapList
  274.     JNE    @@1
  275. @@2:    CALL    NewSegment
  276.     JC    @@4
  277.     CALL    NewBlock
  278. @@3:    MOV    HeapList,ES
  279.     MOV    AX,BX
  280.     MOV    DX,ES
  281. @@4:    RET
  282.  
  283. ; Allocate heap segment
  284. ; Out    ES = Heap segment
  285. ;    CF = 1 if error
  286.  
  287. NewSegment:
  288.  
  289.     PUSH    AX
  290.     MOV    AX,HeapBlock
  291.     CALL    NewGlobal
  292.     JC    @@2
  293.     MOV    ES,DX
  294.     XOR    DI,DI
  295.     CLD
  296.     MOV    AX,'PT'            ;hsSignature
  297.     STOSW
  298.     XOR    AX,AX            ;hsReserved
  299.     STOSW
  300.     MOV    AX,OFFSET hsHeapOrg
  301.     STOSW                ;hsFreeList.hbNext
  302.     XOR    AX,AX
  303.     STOSW                ;hsFreeList.hbSize
  304.     MOV    AX,HeapBlock
  305.     SUB    AX,OFFSET hsHeapOrg
  306.     STOSW                ;hsMemFree
  307.     PUSH    AX
  308.     MOV    AX,ES
  309.     MOV    CX,HeapList
  310.     JCXZ    @@1
  311.     PUSH    DS
  312.     MOV    DS,CX
  313.     XCHG    AX,DS:hsNextHeap
  314.     POP    DS
  315. @@1:    STOSW                ;hsNextHeap
  316.     XOR    AX,AX
  317.     STOSW                ;hbNext
  318.     POP    AX
  319.     STOSW                ;hbSize
  320. @@2:    POP    AX
  321.     RET
  322.  
  323. ; Allocate block from heap segment
  324. ; In    AX = Block size
  325. ;    ES = Heap segment
  326. ; Out    BX = Block offset
  327. ;    CF = 1 if error
  328.  
  329. NewBlock:
  330.  
  331.     MOV    BX,OFFSET hsFreeList
  332. @@1:    MOV    SI,BX
  333.     MOV    BX,ES:[BX].hbNext
  334.     CMP    BX,1
  335.     JB    @@3
  336.     MOV    DX,ES:[BX].hbSize
  337.     SUB    DX,AX
  338.     JB    @@1
  339.     MOV    CX,ES:[BX].hbNext
  340.     JE    @@2
  341.     MOV    DI,BX
  342.     ADD    DI,AX
  343.     MOV    ES:[DI].hbNext,CX
  344.     MOV    ES:[DI].hbSize,DX
  345.     MOV    CX,DI
  346. @@2:    MOV    ES:[SI].hbNext,CX
  347.     SUB    ES:hsMemFree,AX
  348.     CLC
  349. @@3:    RET
  350.  
  351. ; Dispose memory
  352. ; In    AX    = Block size
  353. ;    BX:CX = Block pointer
  354. ; Out    CF    = 1 if error
  355.  
  356. DisMemory:
  357.  
  358.     OR    AX,AX
  359.     JE    @@4
  360.     JCXZ    @@6
  361.     ADD    AX,3
  362.     AND    AL,0FCH
  363.     MOV    ES,BX
  364.     MOV    BX,CX
  365.     CMP    ES:hsSignature,'PT'
  366.     JNE    @@5
  367.     TEST    BL,3
  368.     JNE    @@5
  369.     MOV    SI,OFFSET hsFreeList
  370. @@1:    MOV    DI,SI
  371.     MOV    SI,ES:[SI].hbNext
  372.     OR    SI,SI
  373.     JE    @@2
  374.     CMP    BX,SI
  375.     JA    @@1
  376.     JE    @@5
  377. @@2:    MOV    ES:[BX].hbNext,SI
  378.     MOV    ES:[BX].hbSize,AX
  379.     ADD    AX,ES:hsMemFree
  380.     MOV    ES:hsMemFree,AX
  381.     ADD    AX,OFFSET hsHeapOrg
  382.     CMP    AX,HeapBlock
  383.     JE    @@7
  384.     CALL    @@3
  385.     MOV    ES:[DI].hbNext,BX
  386.     MOV    BX,DI
  387. @@3:    MOV    SI,BX
  388.     ADD    SI,ES:[BX].hbSize
  389.     CMP    SI,ES:[BX].hbNext
  390.     JNE    @@4
  391.     MOV    AX,ES:[SI].hbNext
  392.     MOV    ES:[BX].hbNext,AX
  393.     MOV    AX,ES:[SI].hbSize
  394.     ADD    ES:[BX].hbSize,AX
  395. @@4:    CLC
  396.     RET
  397. @@5:    STC
  398.     RET
  399. @@6:    MOV    AX,DS
  400.     CMP    AX,BX
  401.     JE    @@5
  402.     IF WindowsVersion
  403.     PUSH    BX
  404.     CALL    GlobalHandle
  405.     OR    AX,AX
  406.     JE    @@5
  407.     PUSH    AX
  408.     PUSH    AX
  409.     CALL    GlobalUnlock
  410.     CALL    GlobalFree
  411.     ELSE
  412.     PUSH    BX
  413.     CALL    MemFreeBlock
  414.     ENDIF
  415.     CLC
  416.     RET
  417. @@7:    XOR    AX,AX
  418.     MOV    BX,ES
  419.     MOV    DX,ES:hsNextHeap
  420.     CMP    BX,DX
  421.     JE    @@9
  422.     MOV    AX,HeapList
  423. @@8:    MOV    ES,AX
  424.     MOV    AX,ES:hsNextHeap
  425.     CMP    AX,BX
  426.     JNE    @@8
  427.     MOV    ES:hsNextHeap,DX
  428.     MOV    AX,ES
  429. @@9:    MOV    HeapList,AX
  430.     JMP    @@6
  431.  
  432. CODE    ENDS
  433.  
  434.     END
  435.