1 /*
2   Compare
3 */
4 
5 #include "compare.h"
6 
7 #include "jump.h"
8 #include "mem.h"
9 #include "var.h"
10 
compare(void)11 void compare(void)
12 {
13   extern word param_stack[];
14 
15   word num_params = param_stack[0];
16   word param1     = param_stack[1];
17   word *param_ptr = &param_stack[2];
18 
19   while(--num_params != 0)
20     if(param1 == *param_ptr++)
21     {
22       ret_value(1);
23       return;
24     }
25   ret_value(0);
26 }
27 
plus_compare2(void)28 void plus_compare2(void)
29 {
30   extern word param_stack[];
31   word data         = param_stack[1];
32   long_word address = param_stack[2];
33   word num_words    = param_stack[3];
34   while(num_words-- != 0)
35   {
36     word val = rd_word_addr(address);
37     address += 2;
38     if(data == val)
39     {
40       store((word) address);
41       ret_value(1);
42       return;
43     }
44   }
45   store(0);
46   ret_value(0);
47 }
48 
adv_compare2(void)49 void adv_compare2(void)
50 {
51   extern word param_stack[];
52 
53   int params     = param_stack[0];
54   word data      = param_stack[1];
55   word address   = param_stack[2];
56   word num_words = param_stack[3];
57   word inc       = params > 3 ? param_stack[4] & 0x7F : 0x02;
58   word data_size = params > 3 ? param_stack[4] & 0x80 : 0x80;
59 
60   while(num_words--)
61   {
62     if(data_size != 0
63     ?  (data == rd_word_addr(address))
64     :  ((byte) data == rd_byte_addr(address)))
65     {
66       store(address);
67       ret_value(1);
68       return;
69     }
70     address += inc;
71   }
72   store(0);
73   ret_value(0);
74 }
75