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     const void (*ptr);          /**<命令の関数ポインタ */
 110 } CMD;
 111 
 112 /**
 113  * COMET II命令コード表の項目
 114  */
 115 typedef struct {
 116     char *name;                 /**<命令名 */
 117     CMDTYPE type;               /**<命令タイプ */
 118     WORD code;                  /**<命令コード */
 119     const void (*ptr);          /**<命令の関数ポインタ */
 120 } COMET2CMD;
 121 
 122 /**
 123  * 命令コードのハッシュ表
 124  */
 125 typedef struct _CMDTAB {
 126     struct _CMDTAB *next;       /**<リスト次項目へのポインタ */
 127     const COMET2CMD *cmd;       /**<命令コード表の項目 */
 128 } CMDTAB;
 129 
 130 /**
 131  * プログラム実行時の開始と終了のアドレス
 132  */
 133 typedef struct {
 134     WORD start;   /**<開始アドレス */
 135     WORD end;     /**<終了アドレス */
 136     bool stop;    /**<終了フラグ */
 137 } EXECPTR;
 138 
 139 extern EXECPTR *execptr;
 140 
 141 /**
 142  * @brief 実行モードを表すデータ型
 143  */
 144 typedef struct {
 145     bool trace;           /**<レジストリの内容をステップごとに表示する場合はtrue */
 146     bool logical;         /**<レジストリの内容を論理値(0から65535)で表示する場合はtrue */
 147     bool dump;            /**<メモリの内容をステップごとに表示する場合はtrue */
 148     int dump_start;       /**<メモリの内容をステップごとに表示する場合の開始アドレス */
 149     int dump_end;         /**<メモリの内容をステップごとに表示する場合の終了アドレス */
 150     bool monitor;         /**<モニターモードの場合はtrue */
 151     bool step;            /**<ステップ実行の場合はtrue */
 152 } EXECMODE;
 153 
 154 /**
 155  * @brief 実行モード: trace, logical, dump, monitor, step
 156  */
 157 extern EXECMODE execmode;
 158 
 159 /**
 160  * @brief 汎用レジスタの番号からレジスタを表す文字列を返す
 161  *
 162  * @return 汎用レジスタを表す文字列。「GR0」「GR1」・・・「GR7」のいずれか
 163  *
 164  * @param word レジスタ番号[0-7]を表すWORD値
 165  */
 166 char *grstr(WORD word);
 167 
 168 /**
 169  * @brief メモリーサイズを表す数値文字列をWORD値に変換して返す。WORD値に変換できない場合は、エラーを表示して0を返す
 170  *
 171  * @return メモリーサイズのWORD値である、1から65536までの範囲の整数。エラー時は0
 172  *
 173  * @param str メモリーサイズを表す数値文字列
 174  */
 175 WORD memsize_str2word(const char *str);
 176 
 177 /**
 178  * @brief COMET II仮想マシンの初期化
 179  *
 180  * @param memsize メモリーサイズ。1から65535までの範囲の整数
 181  * @param clocks クロック数。1から1000000までの範囲の整数
 182  */
 183 void comet2_init(WORD memsize, CLOCK clocks);
 184 
 185 /**
 186  * @brief COMET II仮想マシンのCPUをリセット
 187   */
 188 void comet2_reset();
 189 
 190 /**
 191  * COMET II仮想マシンのCPUとメモリをリセット
 192  */
 193 void comet2_resetall();
 194 
 195 /**
 196  * @brief COMET II仮想マシンのシャットダウン
 197  */
 198 void comet2_shutdown();
 199 
 200 /**
 201  * @brief 命令ハッシュ表を作成する
 202  *
 203  * @param hash ハッシュ値
 204  */
 205 bool create_cmdtable(CMDTAB_HASH hash);
 206 
 207 /**
 208  * 命令ハッシュ表を解放する
 209  */
 210 void free_cmdtable(CMDTAB_HASH hash);
 211 
 212 /**
 213  * 命令の名前とタイプから、命令コードを返す
 214  * 無効な場合は0xFFFFを返す
 215  */
 216 WORD getcmdcode(const char *cmd, CMDTYPE type);
 217 
 218 /**
 219  * 命令コードから命令の関数ポインタを返す
 220  */
 221 const void (*getcmdptr(WORD code));
 222 
 223 /**
 224  * 命令コードから命令のタイプを返す
 225  */
 226 CMDTYPE getcmdtype(WORD code);
 227 
 228 /**
 229  * 命令コードから命令の名前を返す
 230  */
 231 char *getcmdname(WORD code);
 232 
 233 #endif

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