mem.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. Memory access facilities
  3. */
  4. /* $Header$ */
  5. /******** Memory address & location defines ********/
  6. #define data_loc(a) (*(data + (p2i(a))))
  7. #define stack_loc(a) (*(stack + (ML - (a))))
  8. #define mem_loc(a) (in_stack(a) ? stack_loc(a) : data_loc(a))
  9. #define loc_addr(o) (((o) < 0) ? (LB + (o)) : (AB + (o)))
  10. /******** Checks on adresses and ranges ********/
  11. #define is_aligned(a,n) ((p2i(a)) % (n) == 0)
  12. #define ch_aligned(a,n) { if (!is_aligned(a, min(n, wsize))) \
  13. { trap(EBADPTR); } }
  14. #define in_gda(p) ((p) < HB)
  15. #define in_stack(p) (SP <= (p) && (p) <= ML)
  16. #define is_in_data(a,n) ((a) + (n) <= HP)
  17. #define ch_in_data(a,n) { if (!is_in_data(a, n)) { trap(EMEMFLT); } }
  18. #define is_in_stack(a,n) (SP <= (a) && (a) + (n) - 1 <= ML)
  19. #define ch_in_stack(a,n) { if (!is_in_stack(a, n)) { trap(EMEMFLT); } }
  20. #define is_in_FRA(a,n) ((a) + (n) <= FRASize)
  21. /******* Address-depending memory defines *******/
  22. #define is_in_mem(a,n) (is_in_data(a, n) || is_in_stack(a, n))
  23. #define mem_stn(a,l,n) { if (in_stack(a)) st_stn(a, l, n); else dt_stn(a, l, n); }
  24. #define mem_lddp(a) (in_stack(a) ? st_lddp(a) : dt_lddp(a))
  25. #define mem_ldip(a) (in_stack(a) ? st_ldip(a) : dt_ldip(a))
  26. #define mem_ldu(a,n) (in_stack(a) ? st_ldu(a, n) : dt_ldu(a, n))
  27. #define mem_lds(a,n) (in_stack(a) ? st_lds(a, n) : dt_lds(a, n))
  28. #define push_m(a,n) { if (in_stack(a)) push_st(a, n); else push_dt(a, n); }
  29. #define pop_m(a,n) { if (in_stack(a)) pop_st(a, n); else pop_dt(a, n); }
  30. /******** Simple stack manipulation ********/
  31. #define st_inc(n) newSP(SP - (n)) /* stack grows */
  32. #define st_dec(n) newSP(SP + (n)) /* stack shrinks */
  33. /******** Function return types ********/
  34. extern ptr st_ldip(), dt_ldip();
  35. extern ptr st_lddp(), dt_lddp(), dppop();
  36. extern long st_lds(), dt_lds(), spop(), wpop();
  37. extern unsigned long st_ldu(), dt_ldu(), upop();