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