exec.cの実行ルーチンを関数ポインタでの記述に変更し、整理
[YACASL2.git] / include / exec.h
index 1da878d..171b188 100644 (file)
 #ifndef YACASL2_EXEC_INCLUDED
 #define YACASL2_EXEC_INCLUDED
 
-/* コードから命令のパターンを取得 */
-CMDTYPE getcmdtype(WORD code);
+#include <stdbool.h>
+#include "struct.h"
+#include "word.h"
 
 enum {
-    INSIZE = 256    /* CASL IIの、IN命令入力領域 */
+    INSIZE = 256    /**<IN命令の、入力領域 */
 };
 
-/* 指定されたファイルからアセンブル結果を読込 */
-bool inassemble(char *file);
+/**
+ * 実行モード型
+ */
+typedef struct {
+    bool trace;           /**<レジストリの内容を表示する場合はtrue */
+    bool logical;         /**<レジストリの内容を論理値(0から65535)で表示する場合はtrue */
+    bool dump;            /**<メモリの内容を表示する場合はtrue */
+} EXECMODE;
 
-/* 標準入力から文字データを読込(SVC 1) */
-void svcin();
+/**
+ * 実行モード: trace, logical, dump
+ */
+extern EXECMODE execmode;
 
-/* 標準出力へ文字データを書出(SVC 2) */
-void svcout();
+/**
+ * 実行エラーをエラーリストに追加
+ */
+void addcerrlist_exec();
 
-/* ロード/論理積/論理和/排他的論理和のフラグ設定。OFは常に0 */
-void setfr(WORD val);
+/**
+ * アセンブル結果読み込みエラーをエラーリストに追加
+ */
+void addcerrlist_load();
 
-/* 算術加算。フラグを設定して値を返す */
-WORD adda(WORD val0, WORD val1);
+/**
+ * 指定されたファイルからアセンブル結果を読み込む
+ */
+bool loadassemble(char *file);
 
-/* 算術減算。フラグを設定して値を返す */
-WORD suba(WORD val0, WORD val1);
+/**
+ * COMET II仮想マシンのリセット
+ */
+void reset();
 
-/* 論理加算。フラグを設定して値を返す */
-WORD addl(WORD val0, WORD val1);
+/**
+ * NOP命令。語長1(OPのみ)
+ */
+void nop();
 
-/* 論理減算。フラグを設定して値を返す */
-WORD subl(WORD val0, WORD val1);
+/**
+ * LD命令 - オペランドr,adr,x。語長2
+ */
+void ld_r_adr_x();
 
-/* 算術比較のフラグ設定。OFは常に0 */
-void cpa(WORD val0, WORD val1);
+/**
+ * LD命令 - オペランドr1,r2。語長1
+ */
+void ld_r1_r2();
 
-/* 論理比較のフラグ設定。OFは常に0 */
-void cpl(WORD val0, WORD val1);
+/**
+ * ST命令。語長2
+ */
+void st();
 
-/* 算術左シフト。フラグを設定して値を返す */
-WORD sla(WORD val0, WORD val1);
+/**
+ * LAD命令。語長2
+ */
+void lad();
 
-/* 算術右シフト。フラグを設定して値を返す */
-WORD sra(WORD val0, WORD val1);
+/**
+ * ADDA命令 - オペランドr,adr,x。語長2
+ */
+void adda_r_adr_x();
 
-/* 論理左シフト。フラグを設定して値を返す */
-WORD sll(WORD val0, WORD val1);
+/**
+ * ADDA命令 - オペランドr1,r2。語長1
+ */
+void adda_r1_r2();
 
-/* 論理右シフト。フラグを設定して値を返す */
-WORD srl(WORD val0, WORD val1);
+/**
+ * SUBA命令 - オペランドr,adr,x。語長2
+ */
+void suba_r_adr_x();
 
-/* 仮想マシンのリセット */
-void reset();
+/**
+ * SUBA命令 - オペランドr1,r2。語長1
+ */
+void suba_r1_r2();
+
+/**
+ * ADDL命令のテンプレート
+ */
+void addl(const WORD r, const WORD val);
+
+/**
+ * ADDL命令 - オペランドr,adr,x。語長2
+ */
+void addl_r_adr_x();
+
+/**
+ * ADDL命令 - オペランドr1,r2。語長1
+ */
+void addl_r1_r2();
+
+/**
+ * SUBL命令 - オペランドr,adr,x。語長2
+ */
+void subl_r_adr_x();
+
+/**
+ * SUBL命令 - オペランドr1,r2。語長1
+ */
+void subl_r1_r2();
+
+/**
+ * AND命令 - オペランドr,adr,x。語長2
+ */
+void and_r_adr_x();
+
+/**
+ * AND命令 - オペランドr1,r2。語長1
+ */
+void and_r1_r2();
+
+/**
+ * OR命令 - オペランドr,adr,x。語長2
+ */
+void or_r_adr_x();
+
+/**
+ * OR命令 - オペランドr1,r2。語長1
+ */
+void or_r1_r2();
+
+/**
+ * XOR命令 - オペランドr,adr,x。語長2
+ */
+void xor_r_adr_x();
+
+/**
+ * XOR命令 - オペランドr1,r2。語長1
+ */
+void xor_r1_r2();
+
+/**
+ * CPA命令 - オペランドr,adr,x。語長2
+ */
+void cpa_r_adr_x();
+
+/**
+ * CPA命令 - オペランドr1,r2。語長1
+ */
+void cpa_r1_r2();
+
+/**
+ * CPL命令のテンプレート
+ */
+void cpl(const WORD r, const WORD val);
+
+/**
+ * CPL命令 - オペランドr,adr,x。語長2
+ */
+void cpl_r_adr_x();
+
+/**
+ * CPL命令 - オペランドr1,r2。語長1
+ */
+void cpl_r1_r2();
+
+/**
+ * SLA命令 - オペランドr,adr,x。語長2
+ * 算術演算なので、第15ビットは送り出されない
+ */
+void sla();
+
+/**
+ * SRA命令 - オペランドr,adr,x。語長2
+ * 算術演算なので、第15ビットは送り出されない
+ * 空いたビット位置には符号と同じものが入る
+ */
+void sra();
+
+/**
+ * SLL命令 - オペランドr,adr,x。語長2
+ */
+void sll();
+
+/**
+ * SRL命令 - オペランドr,adr,x。語長2
+ */
+void srl();
+
+/**
+ * JPL命令。語長2
+ */
+void jpl();
+
+/**
+ * JMI命令。語長2
+ */
+void jmi();
+
+/**
+ * JNZ命令。語長2
+ */
+void jnz();
+
+/**
+ * JZE命令。語長2
+ */
+void jze();
+
+/**
+ * JOV命令。語長2
+ */
+void jov();
+
+/**
+ * JUMP命令。語長2
+ */
+void jump();
+
+/**
+ * PUSH命令。語長2
+ */
+void push();
+
+/**
+ * POP命令。語長1
+ */
+void pop();
+
+/**
+ * CALL命令。語長2
+ */
+void call();
+
+/**
+ * RET命令。語長1(OPのみ)
+ */
+void ret();
+
+/**
+ * SVC命令。語長2
+ */
+void svc();
 
-/* コードの実行 */
-void exec();
+/**
+ * COMET II仮想マシンの実行
+ */
+bool exec();
 
-/* COMET IIのメモリを表示 */
+/**
+ * COMET IIのメモリを表示
+ */
 void dumpmemory();
 
-/* COMET IIのレジスタを表示 */
+/**
+ * COMET IIのレジスタを表示
+ */
 void dspregister();
 
-#endif
+#endif            /* YACASL2_EXEC_INCLUDEDの終端 */