Pristine Ack-5.5
[Ack-5.5.git] / util / int / mem.h
1 /*
2         Memory access facilities
3 */
4
5 /* $Id: mem.h,v 2.4 1994/06/24 10:48:10 ceriel Exp $ */
6
7
8 /******** Memory address & location defines ********/
9
10 #define data_loc(a)     (*(data + (p2i(a))))
11 #define stack_loc(a)    (*(stackML - (a)))
12 #define mem_loc(a)      (in_stack(a) ? stack_loc(a) : data_loc(a))
13
14 #define loc_addr(o)     (((o) < 0) ? (LB + (o)) : (AB + (o)))
15
16
17 /******** Checks on adresses and ranges ********/
18
19 #define is_aligned(a,n) ((p2i(a)) % (n) == 0)
20 #define is_wordaligned(a) \
21                         (((p2i(a)) & wsizem1) == 0)
22
23 #define ch_aligned(a,n) { if (!is_aligned(a, min(n, wsize))) \
24                                                 { trap(EBADPTR); } }
25 #define ch_wordaligned(a) \
26                         { if (!is_wordaligned(a)) \
27                                                 { trap(EBADPTR); } }
28
29 #define in_gda(p)       ((p) < HB)
30 #define in_stack(p)     (SP <= (p) && (p) <= ML)
31
32 #define is_in_data(a,n) ((a) + (n) <= HP)
33 #define ch_in_data(a,n) { if (!is_in_data(a, n)) { trap(EMEMFLT); } }
34
35 #define is_in_stack(a,n) (SP <= (a) && (a) + (n) - 1 <= ML)
36 #define ch_in_stack(a,n) { if (!is_in_stack(a, n)) { trap(EMEMFLT); } }
37
38 #define w_is_in_stack(a) (SP <= (a) && (a) + wsizem1 <= ML)
39 #define ch_w_in_stack(a) { if (!w_is_in_stack(a)) { trap(EMEMFLT); } }
40
41 #define is_in_FRA(a,n)  ((a) + (n) <= FRASize)
42
43
44 /******* Address-depending memory defines *******/
45
46 #define is_in_mem(a,n)  (is_in_data(a, n) || is_in_stack(a, n))
47
48 #define mem_stn(a,l,n)  { if (in_stack(a)) st_stn(a, l, n); else dt_stn(a, l, n); }
49
50 #define mem_lddp(a)     (in_stack(a) ? st_lddp(a) : dt_lddp(a))
51 #define mem_ldip(a)     (in_stack(a) ? st_ldip(a) : dt_ldip(a))
52 #define mem_ldu(a,n)    (in_stack(a) ? st_ldu(a, n) : dt_ldu(a, n))
53 #define mem_lduw(a)     (in_stack(a) ? st_lduw(a) : dt_lduw(a))
54 #define mem_lds(a,n)    (in_stack(a) ? st_lds(a, n) : dt_lds(a, n))
55 #define mem_ldsw(a)     (in_stack(a) ? st_ldsw(a) : dt_ldsw(a))
56
57 #define push_m(a,n)     { if (in_stack(a)) push_st(a, n); else push_dt(a, n); }
58 #define pushw_m(a)      { if (in_stack(a)) pushw_st(a); else pushw_dt(a); }
59 #define pop_m(a,n)      { if (in_stack(a)) pop_st(a, n); else pop_dt(a, n); }
60 #define popw_m(a)       { if (in_stack(a)) popw_st(a); else popw_dt(a); }
61
62
63 /******** Simple stack manipulation ********/
64
65 #define st_inc(n)       newSP(SP - (n)) /* stack grows */
66 #define st_dec(n)       newSP(SP + (n)) /* stack shrinks */
67
68
69 /******** Function return types ********/
70
71 extern ptr st_ldip(), dt_ldip();
72 extern ptr st_lddp(), dt_lddp(), dppop();
73 extern long st_lds(), st_ldsw(), dt_lds(), dt_ldsw(), spop(), swpop(), wpop();
74 extern unsigned long st_ldu(), st_lduw(), dt_ldu(), dt_lduw(), upop(), uwpop();
75