    IFND EXEC_LISTS_I@
EXEC_LISTS_I@ = 1
;*********************************************************************
;
;   Commodore Amiga -- ROM Operating System Executive Include File
;
;*********************************************************************
;
;   Source Control:
;
;       $Header: lists.i,v 33.1 86/03/07 17:30:54 neil Exp $
;
;       $Locker:  $
;
;*********************************************************************

    IFND EXEC_NODES_I@
    INCLUDE "exec/nodes.i"
    ENDIF


;---------------------------------------------------------------------
;
;   List Structures
;
;---------------------------------------------------------------------

; normal, full featured list
 STRUCTURE  LH,0
    APTR    LH_HEAD
    APTR    LH_TAIL
    APTR    LH_TAILPRED
    UBYTE   LH_TYPE
    UBYTE   LH_pad
    LABEL   LH_SIZE

; minimal list, no type checking possible
 STRUCTURE  MLH,0
    APTR    MLH_HEAD
    APTR    MLH_TAIL
    APTR    MLH_TAILPRED
    LABEL   MLH_SIZE


NEWLIST     MACRO   $\1  ; list
            MOVE.L  \1,(\1)
            ADDQ.L  #LH_TAIL,(\1)
            CLR.L   LH_TAIL(\1)
            MOVE.L  \1,(LH_TAIL+LN_PRED)(\1)
            ENDM

TSTLIST     MACRO   $\1  ; [list]
            IFND     \1
            CMP.L   LH_TAIL+LN_PRED(A0),A0
            ELSE
            CMP.L   LH_TAIL+LN_PRED(\1),\1
            ENDIF
            ENDM

SUCC        MACRO   $\1,$\2  ; node,succ
            MOVE.L  (\1),\2
            ENDM

PRED        MACRO   $\1,$\2  ; node,pred
            MOVE.L  LN_PRED(\1),\2
            ENDM

IFEMPTY     MACRO   $\1,$\2  ; list,label
            CMP.L   LH_TAIL+LN_PRED(\1),\1
            BEQ     \2
            ENDM

IFNOTEMPTY  MACRO   $\1,$\2  ; list,label
            CMP.L   LH_TAIL+LN_PRED(\1),\1
            BNE     \2
            ENDM

TSTNODE     MACRO   $\1,$\2  ; node,next
            MOVE.L  (\1),\2
            TST.L   (\2)
            ENDM

NEXTNODE    MACRO   $\1,$\2,$\3  ; next,current,exit_label (DX,AX,DISP16)
            MOVE.L  \1,\2
            MOVE.L  (\2),\1
            BEQ     \3
            ENDM

ADDHEAD     MACRO
            MOVE.L  (A0),D0
            MOVE.L  A1,(A0)
            MOVEM.L D0/A0,(A1)
            MOVE.L  D0,A0
            MOVE.L  A1,LN_PRED(A0)
            ENDM

ADDTAIL     MACRO
            LEA     LH_TAIL(A0),A0
            MOVE.L  LN_PRED(A0),D0
            MOVE.L  A1,LN_PRED(A0)
            MOVE.L  A0,(A1)
            MOVE.L  D0,LN_PRED(A1)
            MOVE.L  D0,A0
            MOVE.L  A1,(A0)
            ENDM

REMOVE      MACRO
            MOVE.L  (A1),A0
            MOVE.L  LN_PRED(A1),A1
            MOVE.L  A0,(A1)
            MOVE.L  A1,LN_PRED(A0)
            ENDM

REMHEAD     MACRO
            MOVE.L  (A0),A1
            MOVE.L  (A1),D0
            BEQ.S   \A
            MOVE.L  D0,(A0)
            EXG.L   D0,A1
            MOVE.L  A0,LN_PRED(A1)
\A:
            ENDM

;----------------------------------------------------------------
;
;  REMHEADQ -- remove-head quickly
;
;       Useful when a scratch register is available, and
;       list is known to contain at least one node.
;
;----------------------------------------------------------------

REMHEADQ    MACRO   $\1,$\2,$\3  ; head,node,scratchReg
            MOVE.L  (\1),\2
            MOVE.L  (\2),\3
            MOVE.L  \3,(\1)
            MOVE.L  \1,LN_PRED(\3)
            ENDM

REMTAIL     MACRO
            MOVE.L  LH_TAIL+LN_PRED(A0),A1
            MOVE.L  LN_PRED(A1),D0
            BEQ.S   \A
            MOVE.L  D0,LH_TAIL+LN_PRED(A0)
            EXG.L   D0,A1
            MOVE.L  A0,(A1)
            ADDQ.L  #4,(A1)
\A:
            ENDM

    ENDIF
    END
 