home *** CD-ROM | disk | FTP | other *** search
/ Graphics 16,000 / graphics-16000.iso / msdos / animutil / pvquan / flilib / str_low.asm < prev    next >
Assembly Source File  |  1992-03-27  |  4KB  |  202 lines

  1.         .model  large, c
  2.         .code
  3.  
  4.         PUBLIC wcompare
  5.         ;wcompare(s1, s2, count)
  6. wcompare PROC far s1: dword, s2: dword, count: word
  7.     push ds
  8.     push si
  9.     push di
  10.     cld
  11.  
  12.         lds si, s1
  13.         les di, s2
  14.         mov cx, count
  15.     inc cx
  16.     repe cmpsw
  17.  
  18.         mov ax, count
  19.     sub ax,cx
  20.  
  21.     pop di
  22.     pop si
  23.     pop ds
  24.         ret
  25. wcompare ENDP
  26.  
  27.         PUBLIC bcompare
  28.         ;bcompare(s1,s2,count)
  29. ;return # of bytes of s1 and s2 that match
  30. bcompare PROC far s1: dword, s2: dword, count: word
  31.     push ds
  32.     push si
  33.     push di
  34.     cld
  35.  
  36.         lds si, s1
  37.         les di, s2
  38.         mov cx, count
  39.     inc cx
  40.     repe cmpsb
  41.  
  42.         mov ax, count
  43.     sub ax,cx
  44.  
  45.     pop di
  46.     pop si
  47.     pop ds
  48.     ret    
  49. bcompare ENDP
  50.  
  51.         PUBLIC bcontrast
  52.         ;bcontrast(s1, s2, count)
  53. ;return how many bytes of s1 and s2 are different
  54. bcontrast PROC  far s1: dword, s2: dword, count: word
  55.         push    ds
  56.         push    si
  57.         push    di
  58.     cld
  59.  
  60.         lds     si, s1
  61.         les     di, s2
  62.         mov     cx, count
  63.     repne cmpsb
  64.         inc     cx
  65.         mov     ax, count
  66.         sub     ax,cx
  67.  
  68.         pop     di
  69.         pop     si
  70.         pop     ds
  71.     ret    
  72. bcontrast ENDP
  73.  
  74.         PUBLIC bsame
  75.         ;bsame(d, count)
  76.     ;find out how many bytes in a row are the same value 
  77. bsame   PROC    far d:dword, count: word
  78.         push    di
  79.     cld
  80.  
  81.         les     di, d
  82.         mov     cx, count
  83.         mov     ax,es:[di]
  84.         inc     cx
  85.     repe scasb
  86.  
  87.         mov     ax, count
  88.         sub     ax,cx
  89.  
  90.         pop     di
  91.     ret    
  92. bsame   ENDP
  93.  
  94.         PUBLIC fii_tnskip, fii_tnsame
  95.  
  96. ;fii_tnskip(s1,s2,bcount,mustmatch)
  97. fii_tnskip     proc far s1: dword, s2: dword, bcount: word, mmatch: word
  98. difcount    equ    [bp-2]
  99.     sub sp,4    ;space for locals
  100.     push bx
  101.     push si
  102.     push di
  103.     push ds
  104.  
  105.     mov word ptr difcount,0    ;zero out return value
  106.     lds si,s1
  107.     les di,s2
  108.     mov bx,bcount
  109.     mov dx,mmatch
  110.  
  111. tnsloop:
  112.     ;calculate number of pixels different in s1 and s2 into ax
  113.     mov cx,bx
  114.     inc cx
  115.     repne cmpsb
  116.     mov ax,bx
  117.     sub ax,cx
  118.     dec si    ;move source pointers just past this different run
  119.     dec di
  120.     sub bx,ax
  121.     add difcount,ax    ;and different count to return value
  122.  
  123.     cmp bx,dx        ;see if near the end...
  124.     js endcheck
  125.  
  126.     ;see if enough in a row match to break out of this
  127.     mov cx,dx
  128.     repe cmpsb
  129.     jz zfii_tnskip    ;if all of them match between s1 and s2 go home
  130.     inc cx
  131.     mov ax,dx        ;calc ones that do match into ax
  132.     sub ax,cx
  133.     add difcount,ax    ;add it to difcount return value
  134.     sub bx,ax        ;sub it from pixels left to examine
  135.     dec si        ;update s1,s2 pointers
  136.     dec di
  137.     jmp tnsloop
  138. endcheck:
  139.     ;check last couple of pixels
  140.     mov cx,bx
  141.     inc cx
  142.     repe cmpsb
  143.     jcxz zfii_tnskip    ;if all of them match between s1 and s2 go home
  144.     add difcount,bx    ;otherwise assume no skip this time around
  145.  
  146. zfii_tnskip:
  147.     mov ax,difcount
  148.     pop ds
  149.     pop di
  150.     pop si
  151.     pop bx
  152.     mov sp,bp
  153.     ret
  154. fii_tnskip     endp
  155.  
  156.  
  157. ;fii_tnsame(s2x,wcount,mustmatch)
  158. fii_tnsame     PROC far s2x: dword, wcount: word, mumatch: word
  159.     push ds
  160.     push si
  161.     push di
  162.     push bx
  163.  
  164.                 
  165.     les    di,s2x        ;get starting address in es:di
  166.     mov    dx,wcount        ;dx is 'dif_count' return value
  167.     mov    bx,dx        ;bx is # of pixels left
  168.     mov    si,0        ;si is # of pixels examined
  169. alp:
  170.                 ;break out of loop if less than 4 pixels
  171.                 ;left to examine
  172.     cmp    bx,mumatch
  173.     js    zalp
  174.  
  175.     ;same_count = i86_bsame(s2x,wcount)
  176.     mov cx,bx
  177.     mov al,es:[di]
  178.     rep scasb
  179.     inc cx
  180.     sub di,2
  181.     mov ax,bx
  182.     sub ax,cx
  183.  
  184.     cmp ax,mumatch            ;if mustmatch or more
  185.     jns gotsame        ;go truncate dif_count
  186.     add    si,ax
  187.     add    di,ax
  188.     sub    bx,ax
  189.     jmp    alp
  190. gotsame:
  191.     mov    dx,si        
  192. zalp:
  193.     mov ax,dx        ;return dif_count
  194.     pop bx
  195.     pop di
  196.     pop si
  197.     pop ds
  198.     ret
  199. fii_tnsame     ENDP
  200.  
  201. END
  202.