comet2monitorの追加と、モニター機能作成
[YACASL2.git] / include / struct.h
index ec4f52b..e36c13f 100644 (file)
@@ -1,10 +1,16 @@
 #ifndef YACASL2_CASL2_INCLUDED
 #define YACASL2_CASL2_INCLUDED
 
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <time.h>
 #include "word.h"
+#include "cmem.h"
+#include "hash.h"
 
 /**
- * COMET IIの規格
+ * @brief COMET IIの規格値
  */
 enum {
     CMDSIZE = 4,              /**<命令の最大文字数 */
@@ -14,7 +20,7 @@ enum {
 };
 
 /**
- * COMET II フラグのマスク値
+ * @brief COMET II フラグのマスク値
  */
 enum {
     OF = 0x4,    /**<Overflow Flag */
@@ -23,7 +29,7 @@ enum {
 };
 
 /**
- * COMET IIのCPU
+ * @brief COMET IIのCPUを表すデータ型
  */
 typedef struct {
     WORD gr[GRSIZE]; /**<汎用レジスタ */
@@ -33,79 +39,79 @@ typedef struct {
 } CPU;
 
 /**
- * COMET IIの仮想実行マシンシステム
+ * @brief COMET IIの仮想実行マシンシステムを表すデータ型
  */
 typedef struct {
     CPU *cpu;        /**<CPU */
     WORD *memory;    /**<メモリ */
     int memsize;     /**<メモリサイズ */
-    int clocks;      /**<クロック周波数 */
+    clock_t clocks;  /**<クロック周波数 */
 } SYSTEM;
 
+/**
+ * @brief COMET IIの仮想実行マシンシステム
+ */
 extern SYSTEM *sys;
 
 /**
  * COMET II 命令
- * 命令タイプは、オペランドにより6種類に分類
+ * 命令タイプは、オペランドにより5種類に分類
  */
 typedef enum {
     /**
      *  オペランド数2または3
-     *     第1オペランド: 汎用レジスタ
-     *     第2オペランド: アドレス
-     *     第3オペランド: 指標レジスタ
-     */
-    R_ADR_X = 010,
-    /**
-     *  オペランド数2または3
-     *     第1オペランド: 汎用レジスタ
-     *     第2オペランド: アドレスに格納されている内容
-     *     第3オペランド: 指標レジスタ
+     *  - 第1オペランド: 汎用レジスタ。必須
+     *  - 第2オペランド: アドレス。必須
+     *  - 第3オペランド: 指標レジスタとして用いる汎用レジスタ。任意
      */
-    R_ADR_X_ = 011,
+    R_ADR_X = 01,
     /**
      *  オペランド数2
-     *     第1オペランド: 汎用レジスタ
-     *     第2オペランド: 汎用レジスタ
+     *  - 第1オペランド: 汎用レジスタ。必須
+     *  - 第2オペランド: 汎用レジスタ。必須
      */
-    R1_R2 = 020,
+    R1_R2 = 02,
     /**
      * オペランド数1または2
-     *     第1オペランド: アドレス
-     *     第2オペランド: 指標レジスタ
+     * - 第1オペランド: アドレス。必須
+     * - 第2オペランド: 指標レジスタとして用いる汎用レジスタ。任意
      */
-    ADR_X = 030,
+    ADR_X = 03,
     /**
-     *   オペランド数1
-     *     第1オペランド: 汎用レジスタ
+     * オペランド数1
+     * - 第1オペランド: 汎用レジスタ。必須
      */
-    R_ = 040,
+    R_ = 04,
     /**
-     *  オペランドなし
+     * オペランドなし
      */
     NONE = 0,
-    /**
-     *  COMET II命令以外
-     */
-    NOTCMD = 077,
 } CMDTYPE;
 
 /**
  * 命令コード表の項目
  */
+typedef struct {
+    char *name;                 /**<命令名 */
+    const void (*ptr);          /**<命令の関数ポインタ */
+} CMD;
+
+/**
+ * COMET II命令コード表の項目
+ */
 typedef struct {
     char *name;                 /**<命令名 */
     CMDTYPE type;               /**<命令タイプ */
     WORD code;                  /**<命令コード */
-    const void (*ptr);                   /**<命令の関数ポインタ */
-} CMD;
+    const void (*ptr);          /**<命令の関数ポインタ */
+} COMET2CMD;
 
 /**
  * 命令コードのハッシュ表
  */
 typedef struct _CMDTAB {
     struct _CMDTAB *next;       /**<リスト次項目へのポインタ */
-    CMD *cmd;                   /**<命令コード表の項目 */
+    COMET2CMD *cmd;             /**<命令コード表の項目 */
 } CMDTAB;
 
 /**
@@ -119,6 +125,15 @@ typedef struct {
 
 extern EXECPTR *execptr;
 
+/**
+ * @brief 汎用レジスタの番号からレジスタを表す文字列を返す
+ *
+ * @return 汎用レジスタを表す文字列。「GR0」「GR1」・・・「GR7」のいずれか
+ *
+ * @param word レジスタ番号[0-7]を表すWORD値
+ */
+char *grstr(WORD word);
+
 /**
  * COMET II仮想マシンのリセット
  */
@@ -148,22 +163,26 @@ void free_cmdtype_code();
 /**
  * コードがキーの命令ハッシュ表を作成する
  */
-bool create_code_type();
+bool create_code_cmdtype();
+
+/**
+ * 命令コードから命令の関数ポインタを返す
+ */
+const void (*getcmdptr(WORD code));
 
 /**
- * 命令コードから命令タイプを返す
- * 無効な場合はNONEを返す
+ * 命令コードから命令のタイプを返す
  */
 CMDTYPE getcmdtype(WORD code);
 
 /**
- * 命令コードから命令の関数ポインタを返す
+ * 命令コードから命令の名前を返す
  */
-const void (*getcmdptr(WORD code));
+char *getcmdname(WORD code);
 
 /**
  * コードがキーの命令ハッシュ表を解放する
  */
-void free_code_type();
+void free_code_cmdtype();
 
 #endif            /* YACASL2_CASL2_INCLUDEDの終端 */