;*; Updated on 17-Sep-92 at 5:55 AM by James A. Jarboe I V; edit time: 0:00:30
;*; Created on 17-Sep-92 at 5:01 AM by James A. Jarboe I V; edit time: 0:08:19
;
; TBXHS2 - Demonstrates possible fix in TOOLBX hashing routine,
;
; This program will create a hash for a number and then compare that
; hash against a sequence of hashes for all numbers between that number
; and a maximum number. This program uses IRV style hashing.
;
; If a match is found withing that sequence then the bell will ring and
; the number will be output in low intensity.
;
; The bright number is the one we are checking against.
;
; [100] 17-Sep-92 by James A. Jarboe IV
SEARCH SYS
SEARCH SYSSYM
DEFINE PRTTAB ROW, COL
MOVW #<ROW_8.+COL>, D1
TCRT
ENDM
VMAJOR = 1
VMINOR = 0
VEDIT = 100. ; 17-Sep-92
S..BOT = 10000. ; Starting number
S..TOP = 20000. ; Top number.
PRTTAB -1,0 ; Clear screen
TYPECR <Testing NEW Hashing routine.>
TYPECR <Using IRV style hashing.>
CRLF ; Bump line
TYPECR <String Hash Hash >
CRLF
MOV #S..BOT, D3 ; Set starting number.
5$: CTRLC QUIT ; Quit on ^C.
CRLF ; Bump line
INC D3 ; Bump number
CMP D3, #S..TOP ; Greater than top?
JEQ QUIT ; Yes..quit.
PRTTAB -1,12. ; Set bright.
MOV D3, D1 ; Set number to convert.
LEA A2, TT.NUM(A5) ; Index buffer.
DCVT 0,OT$MEM ; Make ASCII.
LEA A6, TT.NUM(A5) ; Index first string.
MOV #5, D6 ; Set number of chars.
CALL DO.ME ; Do hashing and display.
MOV #S..BOT, D4 ; Set starting number.
10$:
CTRLC 99$ ; Exit on ^C
INC D4 ; Bump count.
CMP D3, D4 ; Same as number we are checking.
BEQ 10$ ; Try another.
CMP D4, #S..TOP ; At top yet?
BEQ 99$ ; Then stop and do next.
MOV D4, D1 ; Set number/
LEA A2, TT.NUM(A5) ; Index buffer.
DCVT 0,OT$MEM ; Make ascii.
CLRB @A2 ; Clear end of buffer.
LEA A6, TT.NUM(A5) ; Index number.
MOV #5., D6 ; Set number of char.
CALL IRVHSH ; Call hashing.
MOV D6, TT.NEW(A5) ; Save number.
CMP D6, TT.HSH(A5) ; Same as number we are testing?
BNE 10$ ; No..try next.
PRTTAB -1,11.
LEA A6, TT.NUM(A5) ; Yes..index buffer.
MOV #5, D6 ; Set size.
CALL DO.ME ; Display hash match.
MOV #7, D1 ; Ring bell.
TTY
ADD #1, TT.OCR(A5)
BR 10$ ; Try again.
; Do hashing and display. Using another hashing method.
;
; Incoming:
; D6 =: Number of chars to hash
; A6 -> Indexes buffer of string to hash.
; Outgoing:
; D6 =: Hash total of string.
; A6 -> Indexes end of buffer.
;
DO.ME:
PUSH A6 ; Save buffer address.
CALL IRVHSH ; Call hashing routine.
MOV D6, D1 ; Save hash total
MOV D1, TT.HSH(A5) ; Save hash total
POP A6 ; Restore buffer address.
TTYL @A6 ; Output string.
TYPE < = > ; Output seperator.
DCVT 0, OT$TRM ; Output in decimal.
TAB ;
OCVT 0,OT$TRM ; Output in current base.
CRLF ; Bump line.
RTN ; Return to caller.
;IRVHSH:
;
; Part of this hashing routine was taken from JOBSTS.LIT by Irv Bromberg
; off the AMUS Newtork. It always appeared to work without any problems.
; I am sure some mathmematicion could verify it's redundency occurance of
; likely hash matches for different string values.
;
; Incoming:
; D6 =: Number of characters to hash.
;
; A6 -> Indexes buffer to hash.
;
; Outgoing:
; D6 =: Hash total of field.
; A6 -> Indexes end of buffer.
IRVHSH:
MOV D6, D7 ; Save number of chars.
BEQ 99$ ; Opps..none there..quit.
SUB #1, D7 ; Dbf adjust count.
ASL D6, #8. ; Mul * 256.
SAVE A6, D7 ; Save address of buffer & count.
10$: ADDB (A6)+, D6 ; Add ascii value byte to number.
DBF D7, 10$ ; For all chars.
; Here's a modified adaptation of Irv's hashing routine. Actually he only
; stored and checked the resulting word value. Assuming that ESP stores this
; as a long word, we just tack it on to what is done above since it appears
; that the TOOLBX version does about the same thing.
;
20$: MOVB (A6)+, D1 ; Get next char.
LSLW D1, #8. ; Shift to high byte.
XORW D1, D6 ; Rattle.
PUSH D7 ; Save current char count.
MOVW #<8.-1>, D7 ; Set number of bits (dbf adj).
30$: TSTW D6 ; Is hash word negative?
BMI 40$ ; Yes..
LSLW D6, #1 ; No..shift.
BR 50$ ; Try next bits.