Fix relative addressing
This commit is contained in:
parent
b3ea9f7ad9
commit
ab1a2fbb5a
@ -303,8 +303,6 @@ static double deg2rad(double x)
|
|||||||
}
|
}
|
||||||
/*}}}*/
|
/*}}}*/
|
||||||
|
|
||||||
#define INTPATIBLE(t) (t.type == INT || t.type == EMPTY)
|
|
||||||
|
|
||||||
typedef enum {ABSOLUTE, RELATIVE} LocConvention;
|
typedef enum {ABSOLUTE, RELATIVE} LocConvention;
|
||||||
|
|
||||||
/* & */ /*{{{*/
|
/* & */ /*{{{*/
|
||||||
@ -321,12 +319,19 @@ static Token adr_func(int argc, const Token argv[], LocConvention lcon)
|
|||||||
/*}}}*/
|
/*}}}*/
|
||||||
|
|
||||||
LOCATION_GETS(result.u.location, upd_l);
|
LOCATION_GETS(result.u.location, upd_l);
|
||||||
if (argc == 1 && argv[0].type == LOCATION) return argv[0];
|
if (argc == 1 && argv[0].type == LOCATION)
|
||||||
|
if (lcon == ABSOLUTE) return argv[0];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOCATION_ADD(result.u.location, argv[0].u.location);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
for (i = 0; i < argc && i < HYPER; ++i)
|
for (i = 0; i < argc && i < HYPER; ++i)
|
||||||
{
|
{
|
||||||
if (!INTPATIBLE(argv[i])) break;
|
if (argv[i].type == INT)
|
||||||
if (lcon == ABSOLUTE) result.u.location[i] = argv[i].u.integer;
|
if (lcon == ABSOLUTE) result.u.location[i] = argv[i].u.integer;
|
||||||
else result.u.location[i] += argv[i].u.integer;
|
else result.u.location[i] += argv[i].u.integer;
|
||||||
|
else if (argv[i].type != EMPTY) break;
|
||||||
}
|
}
|
||||||
if (i < argc)
|
if (i < argc)
|
||||||
{
|
{
|
||||||
@ -477,6 +482,8 @@ static Token z_func(int argc, const Token argv[])
|
|||||||
|
|
||||||
typedef enum { LOG_AND, LOG_OR } LogicalFunction;
|
typedef enum { LOG_AND, LOG_OR } LogicalFunction;
|
||||||
|
|
||||||
|
#define INTPATIBLE(t) (t.type == INT || t.type == EMPTY)
|
||||||
|
|
||||||
static Token bitwise_func(int argc, const Token argv[], LogicalFunction lop)
|
static Token bitwise_func(int argc, const Token argv[], LogicalFunction lop)
|
||||||
{
|
{
|
||||||
Token result;
|
Token result;
|
||||||
|
@ -31,6 +31,7 @@ typedef enum { X=0, Y=1, Z=2, HYPER} Dimensions;
|
|||||||
#define LOCATION_GETS(la,lb) ((void)memcpy(la, lb, sizeof(Location)))
|
#define LOCATION_GETS(la,lb) ((void)memcpy(la, lb, sizeof(Location)))
|
||||||
#define SAME_LOC(la,lb) (memcmp(la,lb,sizeof(Location))==0)
|
#define SAME_LOC(la,lb) (memcmp(la,lb,sizeof(Location))==0)
|
||||||
#define LOCATION_SUB(la,lb) (la)[X]-=(lb)[X]; (la)[Y]-=(lb)[Y]; (la)[Z]-=(lb)[Z];
|
#define LOCATION_SUB(la,lb) (la)[X]-=(lb)[X]; (la)[Y]-=(lb)[Y]; (la)[Z]-=(lb)[Z];
|
||||||
|
#define LOCATION_ADD(la,lb) (la)[X]+=(lb)[X]; (la)[Y]+=(lb)[Y]; (la)[Z]+=(lb)[Z];
|
||||||
|
|
||||||
bool loc_in_box(const Location test,
|
bool loc_in_box(const Location test,
|
||||||
const Location b, const Location c);
|
const Location b, const Location c);
|
||||||
|
Loading…
Reference in New Issue
Block a user