;; ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ;; ██░▄▄▀██▄██▀▄▀█▄░▄██▄██▀▄▄▀█░▄▄▀█░▄▄▀█░▄▄▀█░██░██ ;; ██░██░██░▄█░█▀██░███░▄█░██░█░██░█░▀▀░█░▀▀▄█░▀▀░██ ;; ██░▀▀░█▄▄▄██▄███▄██▄▄▄██▄▄██▄██▄█▄██▄█▄█▄▄█▀▀▀▄██ ;; ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ;; This file contains all the functions to interact with the dictionary. ;; Therefore, a random word can be selected and it is possible to check if an entered word exists. ; Selects a random entry from the dictionary and saves it. ; ; Note: ; In the dictionary, entries with a word length of five are stored with only four bytes. ; n+0: 11111122 ; n+1: 22223333 ; n+2: 33444444 ; n+3: 55555500 ; ~> 00111111 00222222 00333333 00444444 00555555 ; ; -> [random_number]: depends on the current random number ; <- [currend_word]: five characters, index starts at one select_word: ld de, current_word ; determine the starting address of the dictionary entry ; (start address + random * word length) ld a, [random_number+0] and %00011111 ld h, a ld l, a srl h srl h sla l sla l sla l sla l sla l sla l ld a, [random_number+1] and %00111111 add a, l ld l, a ld b, h ld c, l add hl, bc add hl, bc add hl, bc ld bc, dictionary add hl, bc ; first char ld a, [hl] ; byte 0 and %11111100 srl a srl a ld [de], a ; second char ld a, [hl] ; byte 0 and %00000011 sla a sla a sla a sla a ld b, a inc hl ld a, [hl] ; byte 1 and %11110000 srl a srl a srl a srl a add a, b inc de ld [de], a ; third char ld a, [hl] ; byte 1 and %00001111 sla a sla a ld b, a inc hl ld a, [hl] ; byte 2 and %11000000 srl a srl a srl a srl a srl a srl a add a, b inc de ld [de], a ; fourth char ld a, [hl] ; byte 2 and %00111111 inc de ld [de], a ; fifth char inc hl ld a, [hl] ; byte 3 and %11111100 srl a srl a inc de ld [de], a ret ; In order to check whether an entered word exists in the dictionary, ; it must first be compressed according to the dictionary. ; -> [current guess]: current rate attempt, stored in five bytes ; <- bc: first two bytes of the compression ; <- de: second two bytes of the compression compress_guess: call get_guess_offset ; first byte ld a, [hl+] ; letter 1 and %00111111 sla a sla a ld b, a ld a, [hl] ; letter 2 and %00110000 sra a sra a sra a sra a add a, b ld d, a ; second byte ld a, [hl+] ; letter 2 and %00001111 sla a sla a sla a sla a ld b, a ld a, [hl] ; letter 3 and %00111100 sra a sra a add a, b ld e, a push de ; third byte ld a, [hl+] ; letter 3 and %00000011 sla a sla a sla a sla a sla a sla a ld b, a ld a, [hl+] ; letter 4 and %00111111 add a, b ld d, a ; fourth byte ld a, [hl] ; letter 5 and %00111111 sla a sla a ld e, a pop bc ret ; Try to find the current guess within the dictionary ; -> bc: first two bytes of the compression ; -> de: second two bytes of the compression ; <- a: whether the entry exists find_guess: ld hl, dictionary .loop: ; check if the end of the dictionary is reached push bc ld bc, dictionary_end ld a, h cp a, b jp nz, .not_eof ld a, l cp a, c jp nz, .not_eof pop bc jp .return .not_eof: pop bc ld a, [hl+] cp a, b jp nz, .add3 ld a, [hl+] cp a, c jp nz, .add2 ld a, [hl+] cp a, d jp nz, .add1 ld a, [hl+] cp a, e jp nz, .add0 ld a, 1 ret .add3: inc hl .add2: inc hl .add1: inc hl .add0: jp .loop .return: ld a, 0 ret