X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=wordlists.asm;h=705f360927b5dd001be626ecdde81721efa63b12;hb=43ce8fb4d65924e1bcf21cac510f8e48fc1d451d;hp=4862dd1ec8994ef32dfe3cd949cedd484473d1ce;hpb=ab545d1d4c68b46af77ed241cfba6ada83bbb459;p=rrq%2Frrqforth.git diff --git a/wordlists.asm b/wordlists.asm index 4862dd1..705f360 100644 --- a/wordlists.asm +++ b/wordlists.asm @@ -98,39 +98,40 @@ p_strncmp_end: push rcx next - WORD p_find,'FIND' - ;; ( chars length -- [ chars 0 | cfa 1 ) + WORD p_find,'FIND',fasm + ;; ( chars* length -- [ chars* length 0 ]|[ tfa ] ) ;; Search the current wordlists for the given pname pushr rsi mov rcx,[p_wordlist_DFA] - mov rcx,qword [rcx] - mov rbx,[rsp] - mov rax,[rsp+8] + mov rcx,qword [rcx] ; use rcx for word list traversing + mov rbx,qword [rsp] ; rbx is input length + mov rsi,qword [rsp+8] ; rsi is input chars* p_find_loop: cmp rcx,0 - je p_find_done + je p_find_notfound ; jump at end of word list cmp rbx,qword [rcx+16] ; compare lengths - jne p_find_nextword - push rcx + jne p_find_nextword ; jump on length mismatch + push rcx ; save tfa for later ;; check word - push rax + push rsi ; input chars tfa2pname rcx - push rcx - push rbx + push rcx ; word chars + push rbx ; length DOFORTH p_strncmp pop rax ; return value - pop rcx + pop rcx ; restore tfa cmp rax,0 - je p_find_done - mov rbx,[rsp] - mov rax,[rsp+8] + je p_find_found + mov rbx,qword [rsp] + mov rsi,qword [rsp+8] p_find_nextword: - mov rcx,[rcx] + mov rcx,qword [rcx] jmp p_find_loop +p_find_notfound: + xor rcx,rcx + sub rsp,16 p_find_found: - mov qword [rsp+8],rcx ; replace chars with tfa - mov rcx,1 -p_find_done: - push rcx + add rsp,8 + mov qword [rsp],rcx ; replace with tfa / 0 popr rsi next