;*; 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. .OFINI .OFDEF TT.HSH, 4 ; Saved hash value. .OFDEF TT.NEW, 4 ; New hash value. .OFDEF TT.NUM, 12. ; String. .OFDEF TT.OCR, 4 ; Number of matches. .OFSIZ TT.SIZ ; Impure size. ; Demonstrate Alternative hashing routine. ; START: PHDR -1,0,PH$REE!PH$REU GETIMP TT.SIZ, A5 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. 99$: JMP 5$ ; Try next number sequence. QUIT: CRLF PRTTAB -1,12. CRLF TYPE <Total Duplicates = > MOV TT.OCR(A5), D1 DCVT 0,OT$TRM CRLF EXIT ; 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. ;; ADDB 22(A3), D6 ; Add read security value. ;; ADDB 23(A3), D6 ; Add Write security value. REST A6, D7 ; Restore buffer address & count. SWAP D6 ; Swap Words. CLR D1 ; Preclear hasher. ; 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. 40$: LSLW D6, #1 ; Shift. XORW #^O10041, D6 ; Rattle. 50$: DBF D7, 30$ ; Do all bits. POP D7 ; Restore current count. DBF D7, 20$ ; Do all chars. 99$: RTN ; Return to caller. END