42 lines
854 B
C
42 lines
854 B
C
#include "mbrmake.h"
|
|
WORD HashAtomStr (char *pStr) {
|
|
|
|
WORD hash = 0;
|
|
while (*pStr)
|
|
hash += (hash << 5) + *pStr++;
|
|
|
|
return (hash % (MAXSYMPTRTBLSIZ-1));
|
|
}
|
|
|
|
#if rjsa
|
|
HashAtomStr PROC NEAR USES DS SI, npsz:DWORD
|
|
xor ax,ax ; (ax) = byte-extended-to-word
|
|
mov cx,ax ; (cx) = hash
|
|
mov dx,ax ; (dx) = high part for later div
|
|
cld
|
|
lds si,npsz ; (si) = pointer to string
|
|
align 4
|
|
hfs1: lodsb ; get next byte
|
|
or al,al ; are we at end of string?
|
|
jz hfs2 ; yes, compute div and we're done
|
|
mov bx,cx
|
|
shl bx,1
|
|
shl bx,1
|
|
shl bx,1
|
|
shl bx,1
|
|
shl bx,1
|
|
add cx,bx ; (newcx) = (oldcx) + (oldcx) << 5
|
|
add cx,ax ; (cx) += (cx) << 5 + (ax)
|
|
jmp hfs1
|
|
|
|
hfs2: mov ax,4094 ; magic divider
|
|
xchg ax,cx ; (dx:ax) = number, (cx) = dividend
|
|
div cx
|
|
mov ax,dx
|
|
ret
|
|
HashAtomStr ENDP
|
|
|
|
end
|
|
|
|
#endif
|