*/
If you have a PH account, you can customize your PH profile.
*/

View \FIFO.ASM

BANEL GSM

Submitted By: jaroban
Rating: starstarstarstar (Rate It)


; 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

corner
© 1996-2008 CommunityHeaven LLC. All rights reserved. Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
North American business development: Nicolai Wadstrom. Publisher: Lars Hagelin.