;; list

;; linked-list
;; list
;;   data
;;   next

;; search for d in list x
;; return 1 found, 0 not found

;; search(x,d) 
;;   int flag
;;   flag = 0
;;   while x != nil 
;;     if x.data == d
;;       flag = 1
;;       break
;;     else
;;       x = x.next
;;   return flag

;; test list (7,8,9)
;;      1000:7, 1001:1002, 1002:8, 1003:1004,
;;      1004:9, 1005:0

;; main
;;   print search(list,8)

;; let x=r1, d=r2, flag=r3, t=r4, x.data=r5
;; let retval=r29, link=r30, sp=r31

;; let search_x, search_d, list

.s
	search_x 1010
	search_d 1011
	list 1000	;; to 1005
.a 0
.c
	ld r31 #2000
	ld r1 #7
	st 1000 r1
	ld r1 #1002
	st 1001 r1
	ld r1 #8
	st 1002 r1
	ld r1 #1004
	st 1003 r1
	ld r1 #9
	st 1004 r1
	ld r1 #0
	st 1005 r1	;; list (7,8,9)
:main	ld r1 #1000
	st search_x r1
	ld r1 #8
	st search_d r1
	jal r30 search
	trap print r29
	trap stop r0

:search	st @1 r31 r1
	st @2 r31 r2
	st @3 r31 r3
	st @4 r31 r4
	st @5 r31 r5
	add r31 r31 #5	;; push r1..r5
	ld r1 search_x
	ld r2 search_d	;; pass x d
	ld r3 #0	;; flag=0
:loop	sub r4 r1 r0	;; x != nil
	jmp eq ret	
	ld r5 @0 r1	;; x.data
	sub r4 r5 r2	;; x.data == d
	jmp neq else
	ld r3 #1	;; flag=1
	jmp always ret
:else	ld r1 @1 r1	;; x=x.next
	jmp always loop
:ret	or r29 r3 r0	;; return flag
	ld r5 @0 r31
	ld r4 @-1 r31
	ld r3 @-2 r31
	ld r2 @-3 r31
	ld r1 @-4 r31
	sub r31 r31 #5	;; pop r5..r1
	jr r30
.e
