;****************************************************************************
;* Copyright 1991 MBARI                                                     *
;****************************************************************************
;****************************************************************************
;* Summary  : Assembly language routines for OASIS Microcontroller          *
;* Filename : ring.s                                                        *
;* Author   : Robert Herlien                                                *
;* Project  : OASIS Mooring Controller                                      *
;* Version  : 1.0                                                           *
;* Created  : 11/10/91                                                      *
;* Modified : 05/15/92                                                      *
;****************************************************************************
;* Modification History:                                                    *
;* $Header: /usr/tiburon/.cvsroot/micro/lib/ring.s,v 1.1.1.1 1997/05/02 17:16:01 pean Exp $
;* $Log: ring.s,v $
;* Revision 1.1.1.1  1997/05/02 17:16:01  pean
;* Initial release of the microcontroller software after Tiburon
;* Moolpool Dive to test IView, Lapboxes, modified Power can
;* GF/5V using bus capacitance mode.
;*
;Revision 1.1  92/05/14  09:21:11  09:21:11  pean (Andrew Pearce 408-647-3746)
;Initial revision
;
;*
;****************************************************************************
;
$TITLE("Ring Buffer Routines")
;
RING            MODULE
;
;*****************************************************************************
;
PUBLIC  ring_init               ;Init ring buffer function
PUBLIC  ring_put                ;Put byte to ring buffer function
PUBLIC  ring_get                ;Get byte from ring buffer function
PUBLIC  ring_entries            ;Get number of bytes in ring buffer

;******************** 80C196KB Internal Register Map. ************************
;
; There are 256 registers mapped at addresses 0000H to 0100H. Registers from
; address 0000H to 0019H are pre-defined special purpose registers (SFR).
; Registers from 001AH to 0100H are user definable.
;----------------------------------------------------------------------------
RB0             EQU     00H:BYTE        ;Zero register used as byte here
R0              EQU     00H:WORD        ;Zero register as word
SP              EQU     18H:WORD        ;Stack pointer
plmreg          EQU     1CH:WORD        ;PLMREG is return register
tmp2            EQU     plmreg+2:WORD   ;Scratch registers
tmp4            EQU     plmreg+4:WORD
tmp6            EQU     plmreg+6:WORD


;******************** Ring Buffer Structure *********************************
;
BASE_PTR        EQU     0               ;First word is ptr to base of buffer
IN_PTR          EQU     2               ;Input pointer
OUT_PTR         EQU     4               ;Output pointer
END_PTR         EQU     6               ;Pointer to end of buffer + 1

                        CSEG

;*****************************************************************************
; RING_INIT - Initialize Ring Buffer
;
; Void ring_init( Ring *ring_ptr, Byte *buffer, Nat16 size );
;
ring_init:
        ld      tmp2, 2[SP]
        ld      plmreg, 4[SP]
        st      plmreg, BASE_PTR[tmp2]
        st      plmreg, IN_PTR[tmp2]
        st      plmreg, OUT_PTR[tmp2]
        add     plmreg, 6[SP]
        st      plmreg, END_PTR[tmp2]
        ret

;*****************************************************************************
; RING_PUT - Put a byte in ring buffer
;            Returns number bytes left in ring buffer
;            Zero means no room for byte, error
;
; Int16 ring_put( Ring *ring_ptr, Byte byte )
;

ring_put:
        ld      tmp2, 2[SP]
        ld      plmreg, IN_PTR[tmp2]
        ld      tmp4,  OUT_PTR[tmp2]
        sub     plmreg, tmp4
        jh      rp1
        add     plmreg, END_PTR[tmp2]
        sub     plmreg, BASE_PTR[tmp2]
rp1:
        dec     plmreg
        jle     rp_ret
        ld      tmp6, 4[SP]
        stb     tmp6, [tmp4]+
        cmp     tmp4, END_PTR[tmp2]
        jnc     rp2
        ld      tmp4, BASE_PTR[tmp2]
rp2:
        st      tmp4, OUT_PTR[tmp2]
rp_ret:
        ret

;*****************************************************************************
; RING_GET - Get a byte from ring buffer
;            Returns byte fetched, or ERROR if ring empty
;
; Int16 ring_get( Ring *ring_ptr )
;
ring_get:
        ld      plmreg, #0ffffh
        ld      tmp2, 2[SP]
        ld      tmp4, IN_PTR[tmp2]
        cmp     tmp4, OUT_PTR[tmp2]
        je      rg_ret
        ldbze   plmreg, [tmp4]+
        cmp     tmp4, END_PTR[tmp2]
        jnc     rg1
        ld      tmp4, BASE_PTR[tmp2]
rg1:
        st      tmp4, IN_PTR[tmp2]
rg_ret:
        ret

;*****************************************************************************
; RING_ENTRIES - Return number of bytes in ring buffer
;
; Int16 ring_entries( Ring *ring_ptr )
;
ring_entries:
        ld      tmp2, 2[SP]
        ld      plmreg,OUT_PTR[tmp2]
        ld      tmp4,  IN_PTR[tmp2]
        sub     plmreg, tmp4
        jge      re1
        add     plmreg, END_PTR[tmp2]
        sub     plmreg, BASE_PTR[tmp2]
re1:
        ret

;*****************************************************************************
        END
