home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics 16,000
/
graphics-16000.iso
/
msdos
/
animutil
/
pvquan
/
flilib
/
str_low.asm
< prev
next >
Wrap
Assembly Source File
|
1992-03-27
|
4KB
|
202 lines
.model large, c
.code
PUBLIC wcompare
;wcompare(s1, s2, count)
wcompare PROC far s1: dword, s2: dword, count: word
push ds
push si
push di
cld
lds si, s1
les di, s2
mov cx, count
inc cx
repe cmpsw
mov ax, count
sub ax,cx
pop di
pop si
pop ds
ret
wcompare ENDP
PUBLIC bcompare
;bcompare(s1,s2,count)
;return # of bytes of s1 and s2 that match
bcompare PROC far s1: dword, s2: dword, count: word
push ds
push si
push di
cld
lds si, s1
les di, s2
mov cx, count
inc cx
repe cmpsb
mov ax, count
sub ax,cx
pop di
pop si
pop ds
ret
bcompare ENDP
PUBLIC bcontrast
;bcontrast(s1, s2, count)
;return how many bytes of s1 and s2 are different
bcontrast PROC far s1: dword, s2: dword, count: word
push ds
push si
push di
cld
lds si, s1
les di, s2
mov cx, count
repne cmpsb
inc cx
mov ax, count
sub ax,cx
pop di
pop si
pop ds
ret
bcontrast ENDP
PUBLIC bsame
;bsame(d, count)
;find out how many bytes in a row are the same value
bsame PROC far d:dword, count: word
push di
cld
les di, d
mov cx, count
mov ax,es:[di]
inc cx
repe scasb
mov ax, count
sub ax,cx
pop di
ret
bsame ENDP
PUBLIC fii_tnskip, fii_tnsame
;fii_tnskip(s1,s2,bcount,mustmatch)
fii_tnskip proc far s1: dword, s2: dword, bcount: word, mmatch: word
difcount equ [bp-2]
sub sp,4 ;space for locals
push bx
push si
push di
push ds
mov word ptr difcount,0 ;zero out return value
lds si,s1
les di,s2
mov bx,bcount
mov dx,mmatch
tnsloop:
;calculate number of pixels different in s1 and s2 into ax
mov cx,bx
inc cx
repne cmpsb
mov ax,bx
sub ax,cx
dec si ;move source pointers just past this different run
dec di
sub bx,ax
add difcount,ax ;and different count to return value
cmp bx,dx ;see if near the end...
js endcheck
;see if enough in a row match to break out of this
mov cx,dx
repe cmpsb
jz zfii_tnskip ;if all of them match between s1 and s2 go home
inc cx
mov ax,dx ;calc ones that do match into ax
sub ax,cx
add difcount,ax ;add it to difcount return value
sub bx,ax ;sub it from pixels left to examine
dec si ;update s1,s2 pointers
dec di
jmp tnsloop
endcheck:
;check last couple of pixels
mov cx,bx
inc cx
repe cmpsb
jcxz zfii_tnskip ;if all of them match between s1 and s2 go home
add difcount,bx ;otherwise assume no skip this time around
zfii_tnskip:
mov ax,difcount
pop ds
pop di
pop si
pop bx
mov sp,bp
ret
fii_tnskip endp
;fii_tnsame(s2x,wcount,mustmatch)
fii_tnsame PROC far s2x: dword, wcount: word, mumatch: word
push ds
push si
push di
push bx
les di,s2x ;get starting address in es:di
mov dx,wcount ;dx is 'dif_count' return value
mov bx,dx ;bx is # of pixels left
mov si,0 ;si is # of pixels examined
alp:
;break out of loop if less than 4 pixels
;left to examine
cmp bx,mumatch
js zalp
;same_count = i86_bsame(s2x,wcount)
mov cx,bx
mov al,es:[di]
rep scasb
inc cx
sub di,2
mov ax,bx
sub ax,cx
cmp ax,mumatch ;if mustmatch or more
jns gotsame ;go truncate dif_count
add si,ax
add di,ax
sub bx,ax
jmp alp
gotsame:
mov dx,si
zalp:
mov ax,dx ;return dif_count
pop bx
pop di
pop si
pop ds
ret
fii_tnsame ENDP
END