root/include/struct.h

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

INCLUDED FROM


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

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