;; search

.org 0
  jmp main
flag: 0
retads: 0
retads2: 0
ea: 0
ax: 10   ;; &x
d: 0
xp: 0
x: 7 12 8 14 9 0
md: 0
c: 0
;; list x ( [10:7, 11:12] [12:8, 13:14] [14:9, 15:0] )

.org 100H
main:
  lda ax
  psh 
  lda #8
  psh
  jsr search
  pop
  sta c       ;; c = search(x, 8)
  jmp exit
;; search in written as a subroutine with two parameters
search:
  pop
  sta retads
  pop
  sta retads2
  pop 
  sta d
  pop
  sta xp     ;;  x is pointer
  lda d
  xor #-1
  add #1
  sta md  ;; do (-d) for comparison
  lda #0
  sta flag
loop:
  lda xp
  jpz ret   ;; test x == nil
  sta ea    ;; x is already in ac, do &x
  lda (ea)  ;; get x.info
  add md  ;; test x.info == d
  jpz then
else:
  lda xp
  add 1
  sta ea    ;; &(x.next)
  lda (ea)  ;; x.next
  sta xp    ;; x = x.next
  jmp loop
then:
  lda #1
  sta flag
ret:
  lda flag  ;; return flag
  psh
  lda retads2
  psh
  lda retads 
  psh
  rts        ;; return
exit:
  jsr 1001
  .end