home *** CD-ROM | disk | FTP | other *** search
/ BURKS 2 / BURKS_AUG97.ISO / BURKS / SOFTWARE / LIBS / PMC101.ZIP / LIBSRC.ZIP / BMFREE.ASM (.txt) < prev    next >
Assembly Source File  |  1994-06-24  |  6KB  |  175 lines

  1. ;──────────────────────────────────────────────────────────────────────────────
  2. ;                             MEMBLOCK Free Memory
  3. ;──────────────────────────────────────────────────────────────────────────────
  4. ;
  5. ; Borland C++ 4.0 for WIN32 prototype:
  6. ; void  __pascal mbfree (MEMBLOCK *mb, PTR ptr);
  7. ;
  8. ; version 0.3
  9. ; - White Shadow -
  10. ;
  11. .386p
  12. Ideal
  13. include "bmmalloc.inc"
  14.  
  15. Public MBFREE
  16.  
  17.  
  18. ;──────────────────────────────────────────────────────────────────────────────
  19. Segment _TEXT byte public use32 'CODE'
  20. Assume  cs:_TEXT, ds:DGROUP
  21.  
  22.  
  23. ; -- argument stack offsets
  24. arg1 = 4                ; -> MEMBLOCK
  25. arg2 = 0                ; -> Mem Area
  26.  
  27. MBFREE:         push ebx esi edi ebp
  28. pct = (4)+(4*4)         ; # bytes pushed on stack after last argument
  29.  
  30.                 ;-- Get ptr to MemNode (NULL PTR?)
  31.                 mov  edx, [esp+pct+arg2]        ; -> Mem Area
  32.                 or   edx, edx
  33.                 jz   Exit                    ; Null ptr?
  34.                 sub  edx, size MemNode          ; -> MemNode
  35.  
  36.                 ;-- Load MEMBLOCK info
  37.                 mov  esi, [esp+pct+arg1]        ; -> MEMBLOCK
  38.                 mov  ebx, [esi+MEMBLOCK.base]   ; linear adx of MEMBLOCK
  39.                 sub  ebx, [_database]           ; relative ofs to DGROUP
  40.                 mov  ebp, [esi+MEMBLOCK.size]   ; size of memblock
  41.                 add  ebp, ebx                   ; -> final byte + 1
  42.  
  43.                 ;-- MEMBLOCK uninitalized?
  44.                 cmp  ecx, ebp
  45.                 je   Exit
  46.  
  47. If DebugMode    ;-- Check MBSig
  48.                 cmp  [dword ebx], MBSig
  49.                 jne  Exit                    ; Invalid MBSig?
  50.                 add  ebx, MBSigSize             ; -> first node
  51. EndIf
  52.  
  53.                 ;-- nullify ptr to previous MemNode
  54.                 xor  edi, edi
  55.  
  56. ;---------------
  57.  
  58. FindNode:
  59. ; ebx -> current MemNode
  60. ; edx -> MemNode to free
  61. ; edi -> previous MemNode
  62. ; ebp -> final byte of MEMBLOCK + 1
  63.  
  64. If DebugMode    ;-- Is current MemNode valid?
  65.                 mov  eax, [ebx+MemNode.size]
  66.                 xor  eax, NodeSigKey
  67.                 cmp  [ebx+MemNode.sig], eax
  68.                 jne  CorruptMB               ; invalid MemNode?
  69. EndIf
  70.                 ;-- Is MemNode the one to free?
  71.                 cmp  edx, ebx
  72.                 je   FoundNodeToFree
  73.  
  74.                 ;-- Update previous MemNode ptr
  75.                 mov  edi, ebx                   ; -> previous node
  76.  
  77.                 ;-- Point to next node
  78.                 mov  eax, [ebx+MemNode.size]
  79.                 and  eax, 7fffffffh             ; kill 'used' flag
  80.                 add  ebx, size MemNode          ; skip MemNode
  81.                 add  ebx, eax                   ; skip mem area
  82.  
  83.                 ;-- Any more nodes to check?
  84.                 cmp  ebx, ebp
  85.                 jb   FindNode
  86.                 ja   CorruptMB
  87.                 jmp  short Exit
  88.  
  89.  
  90. ;---------------
  91.  
  92. FoundNodeToFree:
  93. ; ebx -> node to free
  94. ; edi -> previous node (null = no last node)
  95. ; ebp -> final byte of MEMBLOCK + 1
  96.  
  97.                 ;-- MemNode already free?
  98.                 mov  eax, [ebx+MemNode.size]
  99.                 test eax, 80000000h
  100.                 jz   Exit
  101.  
  102.                 ;-- Mark node as free
  103.                 and  eax, 7fffffffh
  104.                 mov  [ebx+MemNode.size], eax
  105. If DebugMode
  106.                 xor  eax, NodeSigKey
  107.                 mov  [ebx+MemNode.sig], eax
  108.                 xor  eax, NodeSigKey
  109. EndIf
  110.                 ;-- Is next node free?
  111.                 add  eax, size MemNode
  112.                 add  eax, ebx                   ; -> next MemNode
  113.                 cmp  eax, ebp
  114.                 ja   CorruptMB
  115.                 je   NextNotFree
  116.                 mov  ecx, [eax+MemNode.size]
  117.                 test ecx, 80000000h
  118.                 jnz  NextNotFree
  119.  
  120.                 ;-- Join next node and freed node
  121.                 mov  [eax+MemNode.size], 0      ; destroy next node
  122.                 mov  eax, [ebx+MemNode.size]    ; newly freed node's size
  123.                                                 ; high bit is 0
  124.                 add  eax, size MemNode          ; next node size
  125.                 add  eax, ecx                   ; mem area of next node
  126.                 mov  [ebx+MemNode.size], eax
  127. If DebugMode
  128.                 xor  eax, NodeSigKey
  129.                 mov  [ebx+MemNode.sig], eax
  130. EndIf
  131.  
  132. NextNotFree:
  133. ; ebx -> freed node
  134. ; edi -> previous node (null = no last node)
  135.  
  136.                 ;-- Last MemNode NULL?
  137.                 or   edi, edi
  138.                 jz   Exit
  139.  
  140.                 ;-- Is last node free?
  141.                 mov  eax, [edi+MemNode.size]
  142.                 test eax, 80000000h
  143.                 jnz  Exit
  144.  
  145.                 ;-- Join last node and freed node
  146.                 add  eax, size MemNode          ; size of freed node
  147.                 add  eax, [ebx+MemNode.size]    ; high bit is 0
  148.                 mov  [ebx+MemNode.size], 0      ; destroy freed node
  149.                 mov  [edi+MemNode.size], eax
  150. If DebugMode
  151.                 xor  eax, NodeSigKey
  152.                 mov  [edi+MemNode.sig], eax
  153. EndIf
  154.  
  155. ;---------------
  156.  
  157. Exit:           pop  ebp edi esi ebx
  158.                 ret  8                          ; 2 args
  159.  
  160. ;---------------
  161.  
  162. CorruptMB:
  163. If DebugMode    ;-- Invalidate MEMBLOCK
  164.                 mov  ebx, [esp+pct+arg1]        ; -> MEMBLOCK
  165.                 mov  ebx, [ebx+MEMBLOCK.base]   ; linear adx of MEMBLOCK
  166.                 sub  ebx, [_database]           ; relative ofs to DGROUP
  167.                 mov  [dword ebx], MBSigInvl
  168. EndIf
  169.                 jmp  short Exit
  170.  
  171.  
  172. ;──────────────────────────────────────────────────────────────────────────────
  173. EndS            _TEXT
  174. End
  175.