+ return true;
+}
+
+/**
+ * マクロ命令「IN IBUF,LEN」をアセンブル
+ * PUSH 0,GR1
+ * PUSH 0,GR2
+ * LAD GR1,IBUF
+ * LAD GR2,LEN
+ * SVC 1
+ * POP GR2
+ * POP GR1
+ */
+void assemble_in(const CMDLINE *cmdl, PASS pass)
+{
+ char *line = malloc_chk(LINESIZE + 1, "assemble_in.line");
+ if(cmdl->opd->opdc == 0 || cmdl->opd->opdc > 2) {
+ setcerr(106, NULL); /* operand count mismatch */
+ return;
+ }
+ assembleline(" PUSH 0,GR1", pass);
+ assembleline(" PUSH 0,GR2", pass);
+ sprintf(line, " LAD GR1,%s", cmdl->opd->opdv[0]);
+ assembleline(line, pass);
+ sprintf(line, " LAD GR2,%s", cmdl->opd->opdv[1]);
+ assembleline(line, pass);
+ assembleline(" SVC 1", pass);
+ assembleline(" POP GR2", pass);
+ assembleline(" POP GR1", pass);
+ FREE(line);
+}
+
+/**
+ * マクロ命令「OUT OBUF,LEN」をアセンブル
+ * PUSH 0,GR1
+ * PUSH 0,GR2
+ * LAD GR1,OBUF
+ * LAD GR2,LEN
+ * SVC 2
+ * LAD GR1,=#A
+ * LAD GR2,=1
+ * SVC 2
+ * POP GR2
+ * POP GR1
+ */
+void assemble_out(const CMDLINE *cmdl, PASS pass)
+{
+ char *line = malloc_chk(LINESIZE + 1, "assemble_out.line");
+ if(cmdl->opd->opdc == 0 || cmdl->opd->opdc > 2) {
+ setcerr(106, NULL); /* operand count mismatch */
+ return;
+ }
+ assembleline(" PUSH 0,GR1", pass);
+ assembleline(" PUSH 0,GR2", pass);
+ sprintf(line, " LAD GR1,%s", cmdl->opd->opdv[0]);
+ assembleline(line, pass);
+ sprintf(line, " LAD GR2,%s", cmdl->opd->opdv[1]);
+ assembleline(line, pass);
+ assembleline(" SVC 2", pass);
+ assembleline(" LAD GR1,=#A", pass);
+ assembleline(" LAD GR2,=1", pass);
+ assembleline(" SVC 2", pass);
+ assembleline(" POP GR2", pass);
+ assembleline(" POP GR1", pass);
+ FREE(line);