; version 1.0
; +0: size of data buffer (N)
; +1: number of valid bytes in buffer
; +2...2+N-1: N data bytes
; r0->fifo a=fifo size
fifo_init: mov @r0,a
inc r0
mov @r0,#0
ret
; r0->fifo
fifo_clear: inc r0
mov @r0,#0
ret
if 0
inc r0
clr a
xch a,@r0
jz fc_ret
mov b,a
push p3
push bits1
call switch_out
call puts_nf
db cr,'gsm: ',0
inc r0
fc_lp1: mov a,@r0
call put_chr
inc r0
djnz b,fc_lp1
mov a,#cr
call put_chr
pop bits1
pop p3
fc_ret: ret
endif
; r0->fifo
fifo_bytes: inc r0
mov a,@r0
ret
; r0->fifo
fifo_left: mov a,@r0
inc r0
clr c
subb a,@r0
ret
; r0->fifo
fifo_full: mov a,@r0
inc r0
xrl a,@r0
jz ff_yes
clr c
ret
ff_yes: setb c
ret
; r0->fifo a=data
fifo_write: mov r1,a
mov b,@r0
inc r0
mov a,@r0
cjne a,b,fw_ok
add a,r0
mov r0,a
mov a,r1
fw_lp: xch a,@r0
dec r0
djnz b,fw_lp
ret
fw_ok: inc a
mov @r0,a
add a,r0
mov r0,a
mov a,r1
mov @r0,a
ret
; r0->fifo
fifo_show_first:
inc r0
mov a,@r0
jz fr_empty
inc r0
mov a,@r0
setb c
ret
; r0->fifo
fifo_show_last: inc r0
mov a,@r0
jz fr_empty
add a,r0
mov r0,a
mov a,@r0
setb c
ret
; r0->fifo
fifo_read: clr ea
inc r0
mov a,@r0
jz fr_empty
mov r1,a
dec @r0
add a,r0
mov r0,a
fr_lp: xch a,@r0
dec r0
djnz r1,fr_lp
setb c
setb ea
ret
fr_empty: clr c
setb ea
ret
; a=format r0->value
fifo_match: cjne a,#'*',fm_skip1
fm_yes: setb c
ret
fm_skip1: cjne a,#'#',fm_skip2
mov a,@r0
jmp asc_hex
fm_skip2: xrl a,@r0
jz fm_yes
clr c
ret
; r0->fifo dptr->string returns a=last char of first occurence
fifo_pos: inc r0
mov a,@r0
jz fp_ret
mov r2,a
mov a,r0
mov r3,a
inc r0
mov r1,#0
fp_lp: mov a,r1
movc a,@a+dptr
call fifo_match
jc fp_match
clr a
mov r1,a
movc a,@a+dptr
call fifo_match
jnc fp_drain
fp_match: inc r1
mov a,r1
movc a,@a+dptr
jz fp_yes
fp_drain: inc r0
djnz r2,fp_lp
clr a
ret
fp_yes: mov a,r0
clr c
subb a,r3
fp_ret: ret
find_nf: mov r0,#srl_fifo
; r0->fifo returns c=found r0->last char of first occurence
fifo_find_nf: pop dph
pop dpl
call fifo_pos
clr c
jz ffnf_lp
setb c
ffnf_lp: clr a
movc a,@a+dptr
inc dptr
jnz ffnf_lp
jmp @a+dptr