root/include/struct.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 #ifndef YACASL2_STRUCT_H_INCLUDED
   2 #define YACASL2_STRUCT_H_INCLUDED
   3 
   4 #include <stdio.h>
   5 #include <assert.h>
   6 #include <string.h>
   7 #include <time.h>
   8 #include "word.h"
   9 #include "cmem.h"
  10 #include "hash.h"
  11 
  12 /**
  13  * @brief COMET IIの規格値
  14  */
  15 enum {
  16     CMDSIZE = 4,              /**<命令の最大文字数 */
  17     GRSIZE = 8,               /**<汎用レジスタの数。COMET II規格では、8(0から7) */
  18     DEFAULT_MEMSIZE = 512,    /**<デフォルトのメモリ容量。COMET II規格では、65535語(word) */
  19     DEFAULT_CLOCKS = 5000000, /**<デフォルトのクロック周波数。COMET II規格では、未定義 */
  20 };
  21 
  22 /**
  23  * @brief COMET II フラグのマスク値
  24  */
  25 enum {
  26     OF = 0x4,    /**<Overflow Flag */
  27     SF = 0x2,    /**<Sign Flag */
  28     ZF = 0x1,    /**<Zero Flag */
  29 };
  30 
  31 /**
  32  * @brief COMET IIのCPUを表すデータ型
  33  */
  34 typedef struct {
  35     WORD gr[GRSIZE]; /**<汎用レジスタ */
  36     WORD sp;         /**<スタックポインタ */
  37     WORD pr;         /**<プログラムレジスタ */
  38     WORD fr;         /**<フラグレジスタ */
  39 } CPU;
  40 
  41 /**
  42  * @brief COMET IIの仮想実行マシンシステムを表すデータ型
  43  */
  44 typedef struct {
  45     CPU *cpu;        /**<CPU */
  46     WORD *memory;    /**<メモリ */
  47     int memsize;     /**<メモリサイズ */
  48     clock_t clocks;  /**<クロック周波数 */
  49 } SYSTEM;
  50 
  51 /**
  52  * @brief COMET IIの仮想実行マシンシステム
  53  */
  54 extern SYSTEM *sys;
  55 
  56 /**
  57  * 命令ハッシュ表のハッシュの種類
  58  */
  59 typedef enum {
  60     HASH_CMDTYPE,
  61     HASH_CODE,
  62     HASH_MAX,
  63 } CMDTAB_HASH;
  64 
  65 /**
  66  * COMET II 命令
  67  * 命令タイプは、オペランドにより5種類に分類
  68  */
  69 typedef enum {
  70     /**
  71      *  オペランド数2または3
  72      *  - 第1オペランド: 汎用レジスタ。必須
  73      *  - 第2オペランド: アドレス。必須
  74      *  - 第3オペランド: 指標レジスタとして用いる汎用レジスタ。任意
  75      */
  76     R_ADR_X = 01,
  77     /**
  78      *  オペランド数2
  79      *  - 第1オペランド: 汎用レジスタ。必須
  80      *  - 第2オペランド: 汎用レジスタ。必須
  81      */
  82     R1_R2 = 02,
  83     /**
  84      * オペランド数1または2
  85      * - 第1オペランド: アドレス。必須
  86      * - 第2オペランド: 指標レジスタとして用いる汎用レジスタ。任意
  87      */
  88     ADR_X = 03,
  89     /**
  90      * オペランド数1
  91      * - 第1オペランド: 汎用レジスタ。必須
  92      */
  93     R_ = 04,
  94     /**
  95      * オペランドなし
  96      */
  97     NONE = 0,
  98 } CMDTYPE;
  99 
 100 /**
 101  * 命令コード表の項目
 102  */
 103 typedef struct {
 104     char *name;                 /**<命令名 */
 105     const void (*ptr);          /**<命令の関数ポインタ */
 106 } CMD;
 107 
 108 /**
 109  * COMET II命令コード表の項目
 110  */
 111 typedef struct {
 112     char *name;                 /**<命令名 */
 113     CMDTYPE type;               /**<命令タイプ */
 114     WORD code;                  /**<命令コード */
 115     const void (*ptr);          /**<命令の関数ポインタ */
 116 } COMET2CMD;
 117 
 118 /**
 119  * 命令コードのハッシュ表
 120  */
 121 typedef struct _CMDTAB {
 122     struct _CMDTAB *next;       /**<リスト次項目へのポインタ */
 123     const COMET2CMD *cmd;       /**<命令コード表の項目 */
 124 } CMDTAB;
 125 
 126 /**
 127  * プログラム実行時の開始と終了のアドレス
 128  */
 129 typedef struct {
 130     WORD start;   /**<開始アドレス */
 131     WORD end;     /**<終了アドレス */
 132     bool stop;    /**<終了フラグ */
 133 } EXECPTR;
 134 
 135 extern EXECPTR *execptr;
 136 
 137 /**
 138  * @brief 実行モードを表すデータ型
 139  */
 140 typedef struct {
 141     bool trace;           /**<レジストリの内容をステップごとに表示する場合はtrue */
 142     bool logical;         /**<レジストリの内容を論理値(0から65535)で表示する場合はtrue */
 143     bool dump;            /**<メモリの内容をステップごとに表示する場合はtrue */
 144     int dump_start;       /**<メモリの内容をステップごとに表示する場合の開始アドレス */
 145     int dump_end;         /**<メモリの内容をステップごとに表示する場合の終了アドレス */
 146     bool monitor;         /**<モニターモードの場合はtrue */
 147     bool step;            /**<ステップ実行の場合はtrue */
 148 } EXECMODE;
 149 
 150 /**
 151  * @brief 実行モード: trace, logical, dump, monitor, step
 152  */
 153 extern EXECMODE execmode;
 154 
 155 /**
 156  * @brief 汎用レジスタの番号からレジスタを表す文字列を返す
 157  *
 158  * @return 汎用レジスタを表す文字列。「GR0」「GR1」・・・「GR7」のいずれか
 159  *
 160  * @param word レジスタ番号[0-7]を表すWORD値
 161  */
 162 char *grstr(WORD word);
 163 
 164 /**
 165  * COMET II仮想マシンのリセット
 166  */
 167 void comet2_init(int memsize, int clocks);
 168 
 169 /**
 170  * COMET II仮想マシンのCPUをリセット
 171  */
 172 void comet2_reset();
 173 
 174 /**
 175  * COMET II仮想マシンのCPUとメモリをリセット
 176  */
 177 void comet2_resetall();
 178 
 179 /**
 180  * COMET II仮想マシンのシャットダウン
 181  */
 182 void comet2_shutdown();
 183 
 184 /**
 185  * @brief 命令ハッシュ表を作成する
 186  *
 187  * @param hash ハッシュ値
 188  */
 189 bool create_cmdtable(CMDTAB_HASH hash);
 190 
 191 /**
 192  * 命令ハッシュ表を解放する
 193  */
 194 void free_cmdtable(CMDTAB_HASH hash);
 195 
 196 /**
 197  * 命令の名前とタイプから、命令コードを返す
 198  * 無効な場合は0xFFFFを返す
 199  */
 200 WORD getcmdcode(const char *cmd, CMDTYPE type);
 201 
 202 /**
 203  * 命令コードから命令の関数ポインタを返す
 204  */
 205 const void (*getcmdptr(WORD code));
 206 
 207 /**
 208  * 命令コードから命令のタイプを返す
 209  */
 210 CMDTYPE getcmdtype(WORD code);
 211 
 212 /**
 213  * 命令コードから命令の名前を返す
 214  */
 215 char *getcmdname(WORD code);
 216 
 217 #endif

/* [<][>][^][v][top][bottom][index][help] */