;*; Updated on 17-Sep-92 at 5:55 AM by James A. Jarboe I V; edit time: 0:13:42
;
; TBXHS1 - Demonstrates bug 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 ESP 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.
; Loop for string to check against.
;
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.IT ; Do hashing and display.
MOV #S..BOT, D4 ; Set starting number.
; Loop to create hash for all numbers between s..bot & s..top to compare
; against number we are checking.
;
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 TBXHSH ; 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.IT ; Display hash match.
MOV #7, D1 ; Ring bell.
TTY
ADD #1, TT.OCR(A5) ; Bump match count.
BR 10$ ; Try again.
; Do hashing and display.
;
; 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.IT:
PUSH A6 ; Save buffer address.
CALL TBXHSH ; 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.
; What appears to be TOOLBX's Hashing routine.
;
; Incoming:
; D6 =: Number of characters to hash.
;
; A6 -> Indexes buffer to hash.
;
; Outgoing:
; D6 =: Hash total of field.
; A6 -> Indexes end of buffer.
TBXHSH:
; It appears that the first step is to save the number of char in a field
; in the high byte of the low word and then save the total ASCII value
; of the string in the low byte of the low word, then save all of that
; in the high word.
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.
; The following code represents what appears to be adding in
; the ESP field's Read and Write security level.
;
; Which for most of the time is a constant unless it is changed in
; an ESP screen. While changing this value would create a different
; hash total than a previous one with different field security levels, it
; would create the same hash total on the next pass if the values for Read
; and Write security remain the same. Soooo for this example we assume
; that the Read and Write security is 0. Thus we comment it out because
; any number + 0 is still that number.