; Assembler. Task №1.
; 13. Malashenkov Anton. group 1538. ITMO, KT.
; Variant 1. HashTable

;cl - key/value
;ch - enter?
;bx - hash

	org 100h
	xor cl, cl
	xor bx, bx
	xor ch, ch

ReadChar:
	mov ah, 01h
	int 21h
	cmp al, CODE_SPACE
		je Space

	cmp al, CODE_ENTER
		je Enter_1

	mov ch, 0
	cmp cl, 1
		call InsertNextCharOfValue

	cmp cl, 0
		call CalcHash

	jmp ReadChar

Enter_1:
	cmp ch, 1
		je Start

	mov byte[si], '$'
	mov cl, 0
	xor ch, 1
	jmp ReadChar

InsertNextCharOfValue:
	mov [si], al
	inc si
	ret

Space:
;-------------------
;	mov ah, 02h
;	mov dx, bx
;	int 21h
;	jmp exit0
;-------------------
	mov cl, 1
	mov di, HashTable
	mov si, HashTable
	while_bx_nz_1:
		cmp bx, 0
			je end_while_1

		add di, LENGTH_WORDS
		dec bx
		jmp while_bx_nz_1

	end_while_1:
		mov si, di
		jmp ReadChar

CalcHash:
	;hash = (hash * 29 + s[i]) % 1543, where s[i] - iый символ ключа
	push cx

	imul bx, 29
	mov di, SIZE_HASH_TABLE
	mov ax, bx
	div di
	mov bx, dx

	pop cx
	ret

Start:
	xor ch, ch
	xor bx, bx

ReadQuery:
	mov ah, 01h
	int 21h
	cmp al, CODE_ENTER
		je Enter_2

	call CalcHash
	mov ch, 0
	jmp ReadQuery

Enter_2:
	cmp ch, 1
		je exit0

	mov ch, 1

FindValue:
	mov di, HashTable
	while_bx_nz_2:
		cmp bx, 0
			je end_while_2

		add di, LENGTH_WORDS
		dec bx
		jmp while_bx_nz_2

	end_while_2:
		mov ah, 9
		mov dx, di
		int 21h

		mov ah, 9
		mov dx, NewLine
		int 21h

		jmp ReadQuery

exit0:
	mov ax, 4c00h
	int 21h

HashTable: rb (SIZE_HASH_TABLE * LENGTH_WORDS)
NewLine: db 13, 10, '$'

CODE_ENTER = 13
CODE_SPACE = 32
LENGTH_WORDS = 16
SIZE_HASH_TABLE = 1543
