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