1 /*
2   Var
3 */
4 
5 #include "var.h"
6 
7 #include "head.h"
8 #include "jump.h"
9 #include "mem.h"
10 #include "pc.h"
11 #include "stack.h"
12 
address(word var)13 static long_word address(word var)
14 {
15   return hd_global() + (((long_word) var - LOCAL_VARS) << 1);
16 }
17 
get_var(word var)18 void get_var(word var)
19 {
20   store(load_var(var));
21 }
22 
load_var(word var)23 word load_var(word var)
24 {
25   if(var == 0)
26     return stk_get_top();
27   else if(var < LOCAL_VARS)
28     return stk_get_var(var);
29   else
30     return rd_word_addr(address(var));
31 }
32 
put_var(word var,word value)33 void put_var(word var, word value)
34 {
35   if(var == 0)
36     stk_set_top(value);
37   else if(var < LOCAL_VARS)
38     stk_set_var(var, value);
39   else
40     wr_word_addr(address(var), value);
41 }
42 
push(word value)43 void push(word value)
44 {
45   stk_push(value);
46 }
47 
pop(word var)48 void pop(word var)
49 {
50   put_var(var, stk_pop());
51 }
52 
inc_var(word var)53 void inc_var(word var)
54 {
55   put_var(var, load_var(var) + 1);
56 }
57 
dec_var(word var)58 void dec_var(word var)
59 {
60   put_var(var, load_var(var) - 1);
61 }
62 
inc_chk(word var,word threshold)63 void inc_chk(word var, word threshold)
64 {
65   word value = load_var(var) + 1;
66   put_var(var, value);
67   ret_value((signed_word) value > (signed_word) threshold);
68 }
69 
dec_chk(word var,word threshold)70 void dec_chk(word var, word threshold)
71 {
72   word value = load_var(var) - 1;
73   put_var(var, value);
74   ret_value((signed_word) value < (signed_word) threshold);
75 }
76 
load(int mode)77 word load(int mode)
78 {
79   if(mode <= 0)
80   {
81     return next_word();
82   }
83   else if(mode == 1)
84   {
85     return next_byte();
86   }
87   else
88   {
89     word var = next_byte();
90     if(var == 0)
91       return stk_pop();
92     else
93       return load_var(var);
94   }
95 }
96 
store(word value)97 void store(word value)
98 {
99   word var = next_byte();
100   if(var == 0)
101     stk_push(value);
102   else
103     put_var(var, value);
104 }
105