1 #ifndef YACASL2_CASL2_INCLUDED
2 #define YACASL2_CASL2_INCLUDED
11 CMDSIZE = 4, /**<命令の最大文字数 */
12 GRSIZE = 8, /**<汎用レジスタの数。COMET II規格では、8(0から7) */
13 DEFAULT_MEMSIZE = 512, /**<デフォルトのメモリ容量。COMET II規格では、65535語(word) */
14 DEFAULT_CLOCKS = 5000000, /**<デフォルトのクロック周波数。COMET II規格では、未定義 */
18 * @brief COMET II フラグのマスク値
21 OF = 0x4, /**<Overflow Flag */
22 SF = 0x2, /**<Sign Flag */
23 ZF = 0x1, /**<Zero Flag */
27 * @brief COMET IIのCPUを表すデータ型
30 WORD gr[GRSIZE]; /**<汎用レジスタ */
31 WORD sp; /**<スタックポインタ */
32 WORD pr; /**<プログラムレジスタ */
33 WORD fr; /**<フラグレジスタ */
37 * @brief COMET IIの仮想実行マシンシステムを表すデータ型
41 WORD *memory; /**<メモリ */
42 int memsize; /**<メモリサイズ */
43 clock_t clocks; /**<クロック周波数 */
47 * @brief COMET IIの仮想実行マシンシステム
53 * 命令タイプは、オペランドにより5種類に分類
58 * - 第1オペランド: 汎用レジスタ。必須
60 * - 第3オペランド: 指標レジスタとして用いる汎用レジスタ。任意
65 * - 第1オペランド: 汎用レジスタ。必須
66 * - 第2オペランド: 汎用レジスタ。必須
72 * - 第2オペランド: 指標レジスタとして用いる汎用レジスタ。任意
77 * - 第1オペランド: 汎用レジスタ。必須
90 char *name; /**<命令名 */
91 const void (*ptr); /**<命令の関数ポインタ */
98 char *name; /**<命令名 */
99 CMDTYPE type; /**<命令タイプ */
100 WORD code; /**<命令コード */
101 const void (*ptr); /**<命令の関数ポインタ */
107 typedef struct _CMDTAB {
108 struct _CMDTAB *next; /**<リスト次項目へのポインタ */
109 COMET2CMD *cmd; /**<命令コード表の項目 */
113 * プログラム実行時の開始と終了のアドレス
116 WORD start; /**<開始アドレス */
117 WORD end; /**<終了アドレス */
118 bool stop; /**<終了フラグ */
121 extern EXECPTR *execptr;
126 void reset(int memsize, int clocks);
129 * COMET II仮想マシンのシャットダウン
134 * 名前とタイプがキーの命令ハッシュ表を作成する
136 bool create_cmdtype_code();
139 * 命令の名前とタイプから、命令コードを返す
142 WORD getcmdcode(const char *cmd, CMDTYPE type);
145 * 名前とタイプがキーの命令ハッシュ表を解放する
147 void free_cmdtype_code();
150 * コードがキーの命令ハッシュ表を作成する
152 bool create_code_type();
155 * 命令コードから命令の関数ポインタを返す
157 const void (*getcmdptr(WORD code));
160 * コードがキーの命令ハッシュ表を解放する
162 void free_code_type();
164 #endif /* YACASL2_CASL2_INCLUDEDの終端 */