page 75,132 %title "Object Oriented Memory Management System - TASM 3.0" %subttl "Testing/Benchmark module" ; Copyright (c) 1991 By Borland International, Inc. ifndef MDL display "Error: This module requires that you provide a memory model" display " definition on the command line. I.E. /dMDL=SMALL." display "Also, /M must be given on the command line to enable multiple" display " passes." MDL equ endif ModuleVersion EQU "0.32" jumps page locals @@ ; Things to check: ; Check the effect of /ML on generated macros for method calls. % .model MDL,pascal .stack 1000h .code CR = 0DH LF = 0AH ; Int 21 DOS calls DOSINT = 21H DOSRESIZEBLOCK = 4AH DOSPRINTSTRING = 09H DOSTERMINATE = 4CH include vmtutil.inc ; Include the display routines include display.inc ; Include definitions of the memory system objects include mem.inc ; Create an advanced decendant of the memory_system ! memory_system_advanced STRUC memory_system METHOD \ init:mptr=memory_system_advanced_init,\ virtual show:mptr=memory_system_advanced_show diskhandle dw ? memory_system_advanced ends memory_system_advanced_init proc ; Must fill in the VMT pointer mov ds:[si.@Mptr_memory_system],offset @TableAddr_memory_system_advanced mov ds:[si.root],0 mov ds:[si.last],0 mov ds:[si.rover],0 mov ds:[si.freespace],0 mov ds:[si.usedspace],0 ret memory_system_advanced_init endp .data msas_advanced db "Advanced $" .code memory_system_advanced_show proc push ds mov ax,@data mov ds,ax mov dx,offset msas_advanced mov ah,DOSPRINTSTRING int 21h pop ds call +@Table_memory_system|show ret memory_system_advanced_show endp ; Make the advanced memory system VMT. MAKE_VMT .data ; Declare an instance of the memory system. Note that multiple memory ; system instances can be declared and if each is initialized with AX ; other than zero, they each will manage separate heaps. memory memory_system {} memorya memory_system_advanced {@Mptr_memory_system = @TableAddr_memory_system_advanced} Psp dw ? ; Our PSP LastSeg dw seg zzlastseg ; Segment of the last segment in memory block1 dw ? block2 dw ? block3 dw ? block4 dw ? dw 20000 dup (?) .code start_: ; Load our data segment mov ax,@data mov ds,ax ; Store the original PSP in case it is needed. mov [Psp],es ; Have to give up extra memory that we don't need ; so the memory system objects can get blocks of memory. mov bx,[LastSeg] mov ax,es sub bx,ax ; Size of program as a number of segments is in BX mov ah,DOSRESIZEBLOCK int DOSINT ; Initialize the memory system mov si,offset memory comment ~ ; Only allow memory system to grab 300 paragraphs of memory mov ax,300 ; Set ES to point to the virtual tables! LoadVMTSeg ES call [si] method memory_system:init call [si] method memory_system:show mov cx,100 mov di,offset block1 t1: mov ax,2 call [si] method memory_system:alloc mov [di],ax add di,2 loop t1 call [si] method memory_system:show call CRLF call CRLF mov cx,100 mov di,offset block1 t2: mov ax,[di] call [si] method memory_system:free mov word ptr [di],0 add di,2 loop t2 call [si] method memory_system:show call CRLF call CRLF mov ax,90 call [si] method memory_system:alloc mov [block1],ax call [si] method memory_system:show mov ax,90 call [si] method memory_system:alloc mov [block2],ax call [si] method memory_system:show mov ax,90 call [si] method memory_system:alloc mov [block3],ax call [si] method memory_system:show mov ax,[block2] call [si] method memory_system:free call [si] method memory_system:show mov ax,[block1] call [si] method memory_system:free call [si] method memory_system:show mov ax,[block3] call [si] method memory_system:free call [si] method memory_system:show call CRLF call CRLF ~ ; Allow memory system to grab all the memory it can mov ax,0 ; Set ES to point to the virtual tables! LoadVMTSeg ES call [si] method memory_system:init call [si] method memory_system:show ; Test using memory_system:alloc and memory_block:markfree blockcount=2000 ; Get 20 blocks of various sizes mov cx,blockcount mov di,offset block1 again: mov ax,cx and ax,0fh cmp al,0 jne again_2 ; call [si] method memory_system:show again_2: inc ax inc ax call [si] method memory_system:alloc mov [di],ax inc di inc di loop again ; call [si] method memory_system:show ; call CRLF ; call CRLF xor si,si ; Now free up half of them mov cx,blockcount/2 mov di,offset block1 again_3: mov ax,cx and ax,0fh cmp al,0 jne again_4 ; call [si] method memory_system:show again_4: mov ax,[di] mov word ptr [di],0 cmp ax,0 je again_5 push ds mov ds,ax call [si] method memory_block:MarkFree pop ds again_5: add di,4 loop again_3 ; call [si] method memory_system:show ; call CRLF ; call CRLF ; Now free up all the rest mov cx,blockcount mov di,offset block1 again_6: mov ax,cx and ax,0fh cmp al,0 jne again_7 ; call [si] method memory_system:show again_7: mov ax,[di] mov word ptr [di],0 cmp ax,0 je again_8 push ds mov ds,ax call [si] method memory_block:MarkFree pop ds again_8: add di,2 loop again_6 ; call [si] method memory_system:show ; call CRLF ; call CRLF mov si,offset memory ; Now allocate 13 very large blocks mov cx,13 mov di,offset block1 final: mov ax,2000 call [si] method memory_system:alloc mov [di],ax add di,2 loop final ; call [si] method memory_system:show ; call CRLF ; call CRLF xor si,si mov cx,13 mov di,offset block1 final2: mov ax,[di] push ds mov ds,ax call [si] method memory_block:MarkFree pop ds add di,2 loop final2 mov si,offset memory ; Now allocate 15 larger blocks mov cx,15 mov di,offset block1 final3: mov ax,2500 call [si] method memory_system:alloc mov [di],ax add di,2 loop final3 ; call [si] method memory_system:show ; call CRLF ; call CRLF xor si,si mov cx,15 mov di,offset block1 final4: mov ax,[di] cmp ax,0 jz final4b push ds mov ds,ax call [si] method memory_block:MarkFree pop ds final4b: add di,2 loop final4 mov si,offset memory comment ~ ; Test using memory_system:alloc and memory_system:free blockcount=2000 ; Get 20 blocks of various sizes mov cx,blockcount mov di,offset block1 again: mov ax,cx and ax,0fh cmp al,0 jne again_2 ; call [si] method memory_system:show again_2: inc ax inc ax call [si] method memory_system:alloc mov [di],ax inc di inc di loop again ; call [si] method memory_system:show ; call CRLF ; call CRLF ; Now free up half of them mov cx,blockcount/2 mov di,offset block1 again_3: mov ax,cx and ax,0fh cmp al,0 jne again_4 ; call [si] method memory_system:show again_4: mov ax,[di] mov word ptr [di],0 cmp ax,0 je again_5 call [si] method memory_system:free again_5: add di,4 loop again_3 ; call [si] method memory_system:show ; call CRLF ; call CRLF ; Now free up all the rest mov cx,blockcount mov di,offset block1 again_6: mov ax,cx and ax,0fh cmp al,0 jne again_7 ; call [si] method memory_system:show again_7: mov ax,[di] mov word ptr [di],0 cmp ax,0 je again_8 call [si] method memory_system:free again_8: add di,2 loop again_6 ; call [si] method memory_system:show ; call CRLF ; call CRLF ; Now allocate 13 very large blocks mov cx,13 mov di,offset block1 final: mov ax,2000 call [si] method memory_system:alloc mov [di],ax add di,2 loop final ; call [si] method memory_system:show ; call CRLF ; call CRLF mov cx,13 mov di,offset block1 final2: mov ax,[di] call [si] method memory_system:free add di,2 loop final2 ; Now allocate 15 larger blocks mov cx,15 mov di,offset block1 final3: mov ax,2500 call [si] method memory_system:alloc mov [di],ax add di,2 loop final3 ; call [si] method memory_system:show ; call CRLF ; call CRLF mov cx,15 mov di,offset block1 final4: mov ax,[di] call [si] method memory_system:free add di,2 loop final4 ~ call [si] method memory_system:show call CRLF call CRLF call [si] method memory_system:freeall call [si] method memory_system:show call CRLF call CRLF ; Try the same calls with the advanced memory system object mov si,seg memorya mov ds,si mov si,offset memorya ; Set ES to point to the virtual tables! LoadVMTSeg ES,BX call [si] method memory_system_advanced:init call [si] method memory_system_advanced:show call [si] method memory_system_advanced:freeall mov ah,DOSTERMINATE int DOSINT @curseg ends zzlastseg segment zzlastseg ends end start_