home *** CD-ROM | disk | FTP | other *** search
- /* ---------------------------------------------------------------------- */
- /* Copyright (C) 1991 by Natürlich! */
- /* This file is copyrighted! */
- /* Refer to the documentation for details. */
- /* ---------------------------------------------------------------------- */
- #ifndef _LABELS_
- #define _LABELS_
-
- #if LINKER || LIBRARIAN
- #define SEP 31
- #else
- #define SEP 30
- #endif
-
- /* number of different symbol tables */
-
- #define L_NORMAL 0x0 /* Like FOO = $4000 */
- #define L_ZERO 0x1 /* Like FOO = $40 */
- #define L_EQU 0x2 /* Like FOO .= $4 */
- #define L_SPECIAL 0x8 /* LIKE __RUN */
- #define L_LINKZERO 0x10 /* Like FOO == $40 */
- #define L_REF 0x40
- #define L_PC 0x8000 /* is label PC-relative ?? */
- #define L_MASK1 (L_PC | L_LINKZERO)
- #define L_MASK2 (L_EQU | L_SPECIAL)
- #define q_pcrel( p) ((sword)((p)->type) < 0)
- #define dumpable( x) (((x)->type & L_MASK1) && ! ((x)->type & L_MASK2))
-
- #define FIX_WCODE 0x1 /* Fix 6502 word */
- #define FIX_ZCODE 0x2 /* Fix 6502 byte */
- #define FIX_SZCODE 0x3 /* Fix ATARI screen character */
- #define FIX_BRANCH 0x4 /* Fix a 6502 branch byte */
- #define FIX_DCODE 0x5 /* Fix 68000 word */
- #define FIX_NOTHING 0x6 /* Fix nothing (for copexpr f.i.) */
- #define FIX_LABEL 0x10 /* Fix a label */
- #define FIX_NOTYET 0x20 /* For linker (obsolete) */
-
- #define unvalued( x) ((x)->l || (x)->label) /* for expressions */
- #define valued( x) (! unvalued( x))
- #define e_pcrel( p) ((signed char)((p)->op) < 0)
- #define is_msb( p) (((p)->op & O_BITS) == O_MSB)
- /* ----------------------------------------------------- */
- /* Search for a label that fits the description */
- /* ----------------------------------------------------- */
- #define found( p, x) (p && p->hash == x)
-
- #define einlinker( head, tail, last, used, p) \
- if( last) \
- { \
- MESS("last was there"); \
- if( last->before) \
- { \
- MESS("last->before exists"); \
- last->before->next = p; \
- p->before = last->before; \
- p->next = last; \
- } \
- else \
- { \
- MESS("last->before does not exist"); \
- p->before = 0; \
- p->next = head[used]; \
- head[ used] = p; \
- } \
- p->next->before = p; \
- } \
- else \
- if( tail[used]) \
- { \
- MESS("tail exists"); \
- tail[used]->next = p; \
- p->before = tail[used]; \
- p->next = 0; \
- tail[used] = p; \
- } \
- else \
- { \
- MESS("head & tail created"); \
- head[used] = tail[used] = p; \
- p->next = p->before = 0; \
- }
-
- #define auslinker( head, tail, last, used, p) \
- if( head[ used] == p) \
- { \
- if( head[ used] = p->next) \
- p->next->before = 0; \
- } \
- else \
- p->before->next = p->next; \
- if( tail[ used] == p) \
- { \
- if( tail[ used] = p->before) \
- tail[ used]->next = 0; \
- } \
- else \
- p->next->before = p->before
-
- #endif
-
-