X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=include%2Fcasl2.h;h=49f4c8c6e14552417660d1918e95bc00b8467c1c;hp=fde1207654d697679b45b6b24e5e14a983c536ea;hb=373540e9b114c01712121c36b40f47a98e12d263;hpb=fda1563ea37180835e0b9c6e7a9c7ae607895446 diff --git a/include/casl2.h b/include/casl2.h index fde1207..49f4c8c 100644 --- a/include/casl2.h +++ b/include/casl2.h @@ -1,32 +1,27 @@ +#ifndef YACASL2_CASL2_INCLUDED +#define YACASL2_CASL2_INCLUDED + #include #include -#include -#include -#include -#include #include #include -#include "hash.h" +#include +#include +#include -#define ARRAYSIZE(array) (sizeof(array)/sizeof(array[0])) +#include "word.h" +#include "hash.h" +#include "cmem.h" +#include "cerr.h" /* COMET IIの規格 */ enum { - CMDSIZE = 4, /* 命令の最大文字数 */ - REGSIZE = 8, /* 汎用レジスタの数 */ + CMDSIZE = 4, /* 命令の最大文字数 */ + GRSIZE = 8, /* 汎用レジスタの数。COMET II規格で、7 */ DEFAULT_MEMSIZE = 512, /* デフォルトのメモリ容量。COMET II規格では、65536語 */ DEFAULT_CLOCKS = 5000000, /* デフォルトのクロック周波数。COMET II規格では、未定義 */ }; -/* COMET IIの基本データサイズ */ -typedef unsigned short WORD; - -/* COMET IIのメモリ */ -extern WORD *memory; - -/* COMET IIのCPUレジスタ */ -extern WORD GR[REGSIZE], SP, PR, FR; - /* COMET II フラグのマスク値 */ enum { OF = 0x4, /* Overflow Flag */ @@ -34,89 +29,93 @@ enum { ZF = 0x1, /* Zero Flag */ }; -/* エラー番号 */ -extern int cerrno; - -/* エラーメッセージ */ -extern char *cerrmsg; - -/* レジストリの内容を表示する場合はTRUE */ -extern bool tracemode; - -/* レジストリの内容を論理値(0〜65535)で表示する場合はTRUE */ -extern bool logicalmode; - -/* メモリの内容を表示する場合はTRUE */ -extern bool dumpmode; - -/* ソースを表示する場合はTRUE */ -extern bool srcmode; - -/* ラベル表を表示する場合はTRUE */ -extern bool labelmode; - -/* ラベル表を表示して終了する場合はTRUE */ -extern bool onlylabelmode; - -/* アセンブラ詳細結果を表示するならTRUE */ -extern bool asdetailmode; - -/* アセンブルだけを行う場合はTRUE */ -extern bool onlyassemblemode; - -/* メモリーサイズ */ -extern int memsize; - -/* クロック周波数 */ -extern int clocks; +/* COMET IIのCPU */ +typedef struct { + WORD gr[GRSIZE]; /* 汎用レジスタ */ + WORD sp; /* スタックポインタ */ + WORD pr; /* プログラムレジスタ */ + WORD fr; /* フラグレジスタ */ +} CPU; -/* 実行開始番地 */ -extern WORD startptr; +/* COMET IIの仮装実行マシンシステム */ +typedef struct { + CPU *cpu; /* CPU */ + WORD *memory; /* メモリ */ + int memsize; /* メモリサイズ */ + int clocks; /* クロック周波数 */ +} SYSTEM; -/* 実行終了番地 */ -extern WORD endptr; +extern SYSTEM *sys; -/* COMET II 命令 - 命令タイプは、オペランドにより6つに分類 - R_ADR_X = 010: オペランド数2または3。 - 第1オペランドは汎用レジスタ、第2オペランドはアドレス、第3オペランドは指標レジスタ - R_ADR_X_ = 011: 同上。ただし、実効アドレスに格納されている内容を示す - R1_R2 = 020: オペランド数2。第1オペランド、第2オペランドともに汎用レジスタ - ADR_X = 030: オペランド数1または2。第1オペランドはアドレス、第2オペランドは指標レジスタ - R_ = 040: オペランド数1。第1オペランドはGR - NONE = 0: オペランドなし -*/ +/* COMET II 命令 */ +/* 命令タイプは、オペランドにより6種類に分類 */ typedef enum { + /* オペランド数2または3 */ + /* 第1オペランド: 汎用レジスタ */ + /* 第2オペランド: アドレス */ + /* 第3オペランド: 指標レジスタ */ R_ADR_X = 010, + /* オペランド数2または3 */ + /* 第1オペランド: 汎用レジスタ、*/ + /* 第2オペランド: アドレスに格納されている内容 */ + /* 第3オペランド: 指標レジスタ */ R_ADR_X_ = 011, + /* オペランド数2 */ + /* 第1オペランド: 汎用レジスタ */ + /* 第2オペランド: 汎用レジスタ */ R1_R2 = 020, + /* オペランド数1または2 */ + /* 第1オペランド: アドレス */ + /* 第2オペランド: 指標レジスタ */ ADR_X = 030, + /* オペランド数1 */ + /* 第1オペランド: 汎用レジスタ */ R_ = 040, + /* オペランドなし */ NONE = 0, } CMDTYPE; +/* 命令コード配列 */ typedef struct { - char *cmd; + char *name; CMDTYPE type; WORD code; -} CMDCODEARRAY; +} CMD; + +/* 命令コード配列のサイズ */ +extern int comet2cmdsize; /* 命令コードのハッシュ表 */ -typedef struct _CMDCODETAB { - struct _CMDCODETAB *next; - CMDCODEARRAY *cca; -} CMDCODETAB; +typedef struct _CMDTAB { + struct _CMDTAB *next; + CMD *cmd; +} CMDTAB; + +extern CMDTAB **cmdtype_code; +extern CMDTAB **code_type; +extern int cmdtabsize; + +/* CASL2プログラムのプロパティ */ +typedef struct { + WORD start; /* プログラムの開始番地 */ + WORD end; /* プログラムの終了番地 */ +} PROGPROP; + +extern PROGPROP *prog; + +/* COMET II仮想マシンのリセット */ +void reset(int memsize, int clocks); + +/* COMET II仮想マシンのシャットダウン */ +void shutdown(); /* 命令と命令タイプがキーのハッシュ表を作成する */ bool create_cmdtype_code(); -/* 命令と命令タイプから、命令コードを取得する。 - 無効な場合は0xFFFFを返す */ +/* 命令と命令タイプから、命令コードを取得する */ +/* 無効な場合は0xFFFFを返す */ WORD getcmdcode(const char *cmd, CMDTYPE type); -/* 命令と命令タイプからハッシュ値を生成する */ -unsigned hash_cmdtype(const char *cmd, CMDTYPE type); - /* 命令と命令タイプがキーのハッシュ表を表示する */ void print_cmdtype_code(); @@ -126,11 +125,8 @@ void free_cmdtype_code(); /* 命令コードがキーのハッシュ表を作成する */ bool create_code_type(); -/* 命令コードからハッシュ値を生成する */ -unsigned hash_code(WORD code); - -/* 命令コードから命令タイプを取得する。 - 無効な場合はNONEを返す */ +/* 命令コードから命令タイプを取得する */ +/* 無効な場合はNONEを返す */ CMDTYPE getcmdtype(WORD code); /* 命令コードがキーのハッシュ表を表示する */ @@ -139,26 +135,7 @@ void print_code_type(); /* 命令コードがキーのハッシュ表を解放する */ void free_code_type(); -/* エラー番号とエラーメッセージを設定 */ -void setcerr(int num, const char *val); - -/* エラー番号からメッセージを返す */ -char *getcerrmsg(int num); - -/* WORD値を文字列に変換 */ -char *wtoa(WORD word); - -/* エラーを解放する */ -void freecerr(); - /* 指定されたファイルにアセンブル結果を書込 */ -void outassemble(char *file); - -/* WORD値を2進数表記に変換 */ -char *word2bit(const WORD word); - -/* COMET IIのメモリを表示 */ -void dumpmemory(); +void outassemble(const char *file); -/* COMET IIのレジスタを表示 */ -void dspregister(); +#endif /* YACASL2_CASL2_INCLUDEDの終端 */