( binary tree node layout: +--+--+ | ' | incoming-ptr* +--+--+ key: null optional v left right terminated binary | ptr ptr string data \ +--+--+--+--+---------+--+----- - - ---> | ' | ' | U x n .00| +--+--+--+--+---------+--+----- - - All of the pointers (ptr) are shorts that have the value of the memory location of the next node, or 0000 to mean that pointer is empty. The very simplest tree is one where the incoming-ptr* is empty: +--+--+ |00'00| incoming-ptr* +--+--+ traverse-tree does two jobs at once, depending on whether the search-key is found: * if the search-key exists in the tree, return a pointer to the binary data that follows that node's key string; * if the search-key is not present in the key, return the incoming-ptr* that should be written when adding this node yourself. ) @traverse-tree ( incoming-ptr* search-key* -- binary-ptr* 00 if key found OR node-incoming-ptr* 01 if key not found ) STH2 &loop ( incoming-ptr* / search-key* ) LDA2k ORA ,&valid-node JCN POP2r #01 JMP2r &valid-node ( incoming-ptr* / search-key* ) LDA2 ( node* / search-key* ) DUP2 #0004 ADD2 ( node* node-key* / search-key* ) STH2kr ( node* node-key* search-key* / search-key* ) ,strcmp JSR ( node* node-end* search-end* order nomatch / search-key* ) ,&nomatch JCN ( node* node-end* search-end* order / search-key* ) POP POP2 ( node* node-end* / search-key* ) INC2 NIP2 ( binary-ptr* / search-key* ) POP2r #00 ( binary-ptr* 00 ) JMP2r &nomatch ( node* node-end* search-end* order / search-key* ) #80 AND #06 SFT #00 SWP STH2 ( node* node-end* search-end* / search-key* node-offset^ ) POP2 POP2 ( node* / search-key* node-offset^ ) STH2r ADD2 ( incoming-ptr* / search-key* ) ,&loop JMP @strcmp ( a* b* -- a-end* b-end* order nonzero if strings differ OR a-end* b-end* 00 00 if strings match ) STH2 ,&entry JMP &loop ( a* a b / b* ) SUB ,&nomatch JCNk ( a* a-b nonzero / b* ) POP2 ( a* / b* ) INC2 INC2r &entry ( a* / b* ) LDAk LDAkr STHr ( a* a b / b* ) ORAk ,&loop JCN &nomatch ( a* a-b flag / b* ) STH2r SWP2 ( a* b* a-b flag ) JMP2r