# SFBMacros.h

Go to the documentation of this file.

    00001 /*                                              -*- mode:C++; fill-column:100 -*-
    00002   SFBMacros.h - Standalone early macros requiring no constants.
    00003   Copyright (C) 2008 The Regents of the University of New Mexico.  All rights reserved.
    00004
    00005   This library is free software; you can redistribute it and/or
    00006   modify it under the terms of the GNU Lesser General Public
    00007   License as published by the Free Software Foundation; either
    00008   version 2.1 of the License, or (at your option) any later version.
    00009
    00010   This library is distributed in the hope that it will be useful,
    00011   but WITHOUT ANY WARRANTY; without even the implied warranty of
    00012   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    00013   Lesser General Public License for more details.
    00014
    00015   You should have received a copy of the GNU General Public License
    00016   along with this library; if not, write to the Free Software
    00017   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
    00018   USA
    00019 */
    00020
    00027 #ifndef SFBMACROS_H_
    00028 #define SFBMACROS_H_
    00029
    00030 #include "SFBTypes.h"
    00031
    00032
    00037 #define CLOCKWISE_FACE(dir)        GET_MAP4BY2(MAP4BY2(EAST,WEST,SOUTH,NORTH),dir)
    00040 #define COUNTERCLOCKWISE_FACE(dir) GET_MAP4BY2(MAP4BY2(WEST,EAST,NORTH,SOUTH),dir)
    00043 #define ANTICLOCKWISE_FACE(dir) COUNTERCLOCKWISE_FACE(dir)
    00044 #define OPPOSITE_FACE(dir)         GET_MAP4BY2(MAP4BY2(SOUTH,NORTH,WEST,EAST),dir)
    00048 extern const char * const faceNames[];
    00049 #define FACE_NAME(face) (faceNames[face])
    00050 #define FACE_CODE(face) GET_MAP4BY8(MAP4BY8('N','S','E','W'),face)
    00052 #define FACE_NUMBER_FROM_CODE(code) (((((code)&~0x20)^(((code)&~0x20)>>1))-1)&0x3)
    00057 #define IS_FACE_CODE(code) ((((code)>>6)==1) && ((0x00884020>>((code)&0x1f))&1))
    00064
    00065
    00069
    00080 #define SET_BIT(value,bitNum) ((value) |= (1<<(bitNum)))
    00081
    00092 #define CLEAR_BIT(value,bitNum) ((value) &= ~(1<<(bitNum)))
    00093
    00105 #define GET_BIT(value,bitNum) (((value)>>(bitNum))&1)
    00106
    00119 #define TEST_BIT(value,bitNum) ((value)&(1<<(bitNum)))
    00120
    00136 #define BIT_PAIR_AT_POSITION(bits,newValue,position) \
    00137   ((bits) = ((bits)&(~(3<<(position))))|((newValue)<<(position)))
    00138
    00140 /****************** Structured H/W register access *****************/
    00141
    00146 #define REGISTER_OFFSET(baseAddress,byteOffset) \
    00147   (*((uv32 *) (((u32)(baseAddress))+(byteOffset))))
    00148
    00169 #define MAP4BY2(a, b, c, d) ((((((((u8) d)<<2)|(c))<<2)|(b))<<2)|(a))
    00170
    00185 #define GET_MAP4BY2(map, idx) (((map)>>((idx)<<1))&0x3)
    00186
    00203 #define MAP4BY4(a, b, c, d) ((((((((u16) d)<<4)|(c))<<4)|(b))<<4)|(a))
    00204
    00219 #define GET_MAP4BY4(map, idx) (((map)>>((idx)<<2))&0xf)
    00220
    00237 #define MAP4BY8(a, b, c, d) ((((((((u32) d)<<8)|(c))<<8)|(b))<<8)|(a))
    00238
    00252 #define GET_MAP4BY8(map, idx) (((map)>>((idx)<<3))&0xff)
    00253
    00282 #define MAP3BY3(a, b, c) ((((((u16) c)<<3)|(b))<<3)|(a))
    00283
    00297 #define GET_MAP3BY3(map, idx) (((map)>>((idx)*3))&0x7)
    00298
    00315 #define BLINK_MAP(red,green,blue) MAP3BY3(blue,green,red)
    00316
    00317
    00331 #define GET_BLINK_MAP_COLOR(code,color) GET_MAP3BY3(code,2-(color))
    00332
    00404 #define IS_EARLIER(a,b)          ((((u32)(a))-((u32)(b))) > 0x80000000UL)
    00405
    00406 #define IS_LATER_OR_EQUAL(a,b)   ((((u32)(a))-((u32)(b))) < 0x80000000UL)
    00409 #define IS_LATER(a,b)            ((((u32)(b))-((u32)(a))) > 0x80000000UL)
    00412 #define IS_EARLIER_OR_EQUAL(a,b) ((((u32)(b))-((u32)(a))) < 0x80000000UL)
    00416 #define IS_EARLIER16(a,b)        ((u16)(((u16)(a))-((u16)(b))) > 0x8000UL)
    00419 #define IS_LATER_OR_EQUAL16(a,b) ((u16)(((u16)(a))-((u16)(b))) < 0x8000UL)
    00422 #define IS_LATER16(a,b)          ((u16)(((u16)(b))-((u16)(a))) > 0x8000UL)
    00425 #define IS_EARLIER_OR_EQUAL16(a,b) ((u16)(((u16)(b))-((u16)(a))) < 0x8000UL)
    00429
    00430
    00433
    00452 #define STRUCT_MEMBER_OFFSET(structure,member) ((uptr) &(((structure *) 0)->member))
    00453
    00454 #define XSTR(arg) STR(arg)
    00457 #define STR(arg) #arg
    00461 #define MIN(a,b) (((a)<(b))?(a):(b))
    00467 #define MAX(a,b) (((a)>(b))?(a):(b))
    00474 #define FILEPOS __FILE__ ":" XSTR(__LINE__)
    00475
    00478 /****************** B36 constants macros ******************/
    00479
    00481 #define B36_CONST_0 0u
    00482 #define B36_CONST_1 1u
    00483 #define B36_CONST_2 2u
    00484 #define B36_CONST_3 3u
    00485 #define B36_CONST_4 4u
    00486 #define B36_CONST_5 5u
    00487 #define B36_CONST_6 6u
    00488 #define B36_CONST_7 7u
    00489 #define B36_CONST_8 8u
    00490 #define B36_CONST_9 9u
    00491 #define B36_CONST_A 10u
    00492 #define B36_CONST_a 10u
    00493 #define B36_CONST_B 11u
    00494 #define B36_CONST_b 11u
    00495 #define B36_CONST_C 12u
    00496 #define B36_CONST_c 12u
    00497 #define B36_CONST_D 13u
    00498 #define B36_CONST_d 13u
    00499 #define B36_CONST_E 14u
    00500 #define B36_CONST_e 14u
    00501 #define B36_CONST_F 15u
    00502 #define B36_CONST_f 15u
    00503 #define B36_CONST_G 16u
    00504 #define B36_CONST_g 16u
    00505 #define B36_CONST_H 17u
    00506 #define B36_CONST_h 17u
    00507 #define B36_CONST_I 18u
    00508 #define B36_CONST_i 18u
    00509 #define B36_CONST_J 19u
    00510 #define B36_CONST_j 19u
    00511 #define B36_CONST_K 20u
    00512 #define B36_CONST_k 20u
    00513 #define B36_CONST_L 21u
    00514 #define B36_CONST_l 21u
    00515 #define B36_CONST_M 22u
    00516 #define B36_CONST_m 22u
    00517 #define B36_CONST_N 23u
    00518 #define B36_CONST_n 23u
    00519 #define B36_CONST_O 24u
    00520 #define B36_CONST_o 24u
    00521 #define B36_CONST_P 25u
    00522 #define B36_CONST_p 25u
    00523 #define B36_CONST_Q 26u
    00524 #define B36_CONST_q 26u
    00525 #define B36_CONST_R 27u
    00526 #define B36_CONST_r 27u
    00527 #define B36_CONST_S 28u
    00528 #define B36_CONST_s 28u
    00529 #define B36_CONST_T 29u
    00530 #define B36_CONST_t 29u
    00531 #define B36_CONST_U 30u
    00532 #define B36_CONST_u 30u
    00533 #define B36_CONST_V 31u
    00534 #define B36_CONST_v 31u
    00535 #define B36_CONST_W 32u
    00536 #define B36_CONST_w 32u
    00537 #define B36_CONST_X 33u
    00538 #define B36_CONST_x 33u
    00539 #define B36_CONST_Y 34u
    00540 #define B36_CONST_y 34u
    00541 #define B36_CONST_Z 35u
    00542 #define B36_CONST_z 35u
    00543
    00545 #define B36_1(a) B36_CONST_##a
    00546 #define B36_2(a,b) (B36_1(a)*36u+B36_1(b))
    00547 #define B36_3(a,b,c) (B36_2(a,b)*36u+B36_1(c))
    00548 #define B36_4(a,b,c,d) (B36_3(a,b,c)*36u+B36_1(d))
    00549 #define B36_5(a,b,c,d,e) (B36_4(a,b,c,d)*36u+B36_1(e))
    00550 #define B36_6(a,b,c,d,e,f) (B36_5(a,b,c,d,e)*36u+B36_1(f))
    00551 #define B36_7(a,b,c,d,e,f,g) (B36_6(a,b,c,d,e,f)*36u+B36_1(g))
    00552
    00553 /****************** Memory placement macros ******************/
    00554
    00555 #ifndef HOST_MODE
    00556
    00557 #define IN_BODYRAM  __attribute__((section (".bodyram")))
    00558 #define IN_TALKRAM  __attribute__((section (".talkram")))
    00559 #define IN_FASTRAM  __attribute__((section (".fastram")))
    00560
    00561 #define IN_BODYRAM_BSS  __attribute__((section (".bss.bodyram")))
    00562 #define IN_TALKRAM_BSS  __attribute__((section (".bss.talkram")))
    00563 #define IN_FASTRAM_BSS  __attribute__((section (".bss.fastram")))
    00564
    00565 #else
    00566
    00567 #define IN_BODYRAM  /* in host mode */
    00568 #define IN_TALKRAM  /* no special ram regions */
    00569 #define IN_FASTRAM  /* are defined */
    00570
    00571 #define IN_BODYRAM_BSS  /* for */
    00572 #define IN_TALKRAM_BSS  /* any */
    00573 #define IN_FASTRAM_BSS  /* thing */
    00574
    00575 #endif
    00576
    00577 #endif /*SFBMACROS_H_*/