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

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