ブランチ「label-local」をマージ
[YACASL2.git] / src / macro.c
1 #include "casl2.h"
2 #include "assemble.h"
3
4 /*マクロ命令「IN IBUF,LEN」をメモリに書込  
5         PUSH 0,GR1
6         PUSH 0,GR2
7         LAD GR1,IBUF
8         LAD GR2,LEN
9         SVC 1
10         POP GR2
11         POP GR1
12 */
13 bool writeIN(const char *ibuf, const char *len, PASS pass)
14 {
15     bool status = false;
16
17     /* PUSH 0,GR1 */
18     writememory(0x7001, ptr++, pass);
19     writememory(0x0, ptr++, pass);
20     /* PUSH 0,GR2 */
21     writememory(0x7002, ptr++, pass);
22     writememory(0x0, ptr++, pass);
23     /* LAD GR1,IBUF */
24     writememory(0x1210, ptr++, pass);
25     writememory(getadr(prog, ibuf, pass), ptr++, pass);
26     /* LAD GR2,LEN */
27     writememory(0x1220, ptr++, pass);
28     writememory(getadr(prog, len, pass), ptr++, pass);
29     /* SVC 1 */
30     writememory(0xF000, ptr++, pass);
31     writememory(0x0001, ptr++, pass);
32     /* POP GR2 */
33     writememory(0x7120, ptr++, pass);
34     /* POP GR1 */
35     writememory(0x7110, ptr++, pass);
36     if(cerrno == 0) {
37         status = true;
38     }
39     return status;
40 }
41
42 /* マクロ命令「OUT OBUF,LEN」をメモリに書込
43         PUSH 0,GR1
44         PUSH 0,GR2
45         LAD GR1,OBUF
46         LD GR2,LEN
47         SVC 2
48         LAD GR1,=#A
49         LAD GR2,1
50         SVC 2
51         POP GR2
52         POP GR1
53 */
54 bool writeOUT(const char *obuf, const char *len, PASS pass)
55 {
56     bool status = false;
57
58     /* PUSH 0,GR1 */
59     writememory(0x7001, ptr++, pass);
60     writememory(0x0, ptr++, pass);
61     /* PUSH 0,GR2 */
62     writememory(0x7002, ptr++, pass);
63     writememory(0x0, ptr++, pass);
64     /* LAD GR1,OBUF */
65     writememory(0x1210, ptr++, pass);
66     writememory(getadr(prog, obuf, pass), ptr++, pass);
67     /* LD GR2,OLEN */
68     writememory(0x1020, ptr++, pass);
69     writememory(getadr(prog, len, pass), ptr++, pass);
70     /* SVC 2 */
71     writememory(0xF000, ptr++, pass);
72     writememory(0x0002, ptr++, pass);
73     /* LAD GR1,=#A */ 
74     writememory(0x1210, ptr++, pass);
75     if(pass == FIRST) {
76         ptr++;
77     } else {
78         writememory(lptr, ptr++, pass);    /* リテラルのアドレスを書込 */
79     }
80     writememory(0xA, lptr++, pass);
81     /* LAD GR2,1 */
82     writememory(0x1220, ptr++, pass);
83     writememory(0x0001, ptr++, pass);
84     /* SVC 2 */
85     writememory(0xF000, ptr++, pass);
86     writememory(0x0002, ptr++, pass);
87     /* POP GR2 */
88     writememory(0x7120, ptr++, pass);
89     /* POP GR1 */
90     writememory(0x7110, ptr++, pass);
91     if(cerrno == 0) {
92         status = true;
93     }
94     return status;
95 }
96
97 /* マクロ命令「RPUSH」をメモリに書き込む
98         PUSH 0,GR1
99         PUSH 0,GR2
100         PUSH 0,GR3
101         PUSH 0,GR4
102         PUSH 0,GR5
103         PUSH 0,GR6
104         PUSH 0,GR7
105  */
106 bool writeRPUSH(PASS pass) {
107     int i;
108     bool status = false;
109
110     for(i = 1; i <= 7; i++) {
111         writememory(0x7000 + i, ptr++, pass);   /* PUSH GRn */
112         writememory(0x0, ptr++, pass);
113     }
114     if(cerrno == 0) {
115         status = true;
116     }
117     return status;
118 }
119
120 /* マクロ命令「RPOP」をメモリに書き込む
121         POP GR7
122         POP GR6
123         POP GR5
124         POP GR4
125         POP GR3
126         POP GR3
127         POP GR2
128         POP GR1
129  */
130 bool writeRPOP(PASS pass) {
131     int i;
132     bool status = false;
133     for(i = 7; i >= 1; i--) {
134         writememory((0x7100 + (i << 4)), ptr++, pass);  /* POP GRn */
135     }
136     if(cerrno == 0) {
137         status = true;
138     }
139     return status;
140 }