X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=include%2Fassemble.h;h=78f5b8abce185a1f06a2b726de2cc6c3448fcfd6;hp=8ab4255d10aef3a4fd12c873019e7947df518b16;hb=065d340f994652a9759c496b4c024e1f9a3a6783;hpb=de18494f8acd2f8ca87b86c54bfee1c2094c0d83 diff --git a/include/assemble.h b/include/assemble.h index 8ab4255..78f5b8a 100644 --- a/include/assemble.h +++ b/include/assemble.h @@ -1,12 +1,22 @@ #ifndef YACASL2_ASSEMBLE_INCLUDED #define YACASL2_ASSEMBLE_INCLUDED +#include +#include +#include #include +#include +#include +#include +#include "cerr.h" +#include "cmem.h" +#include "exec.h" +#include "hash.h" #include "struct.h" #include "word.h" /** - * CASL IIの仕様 + * @brief CASL IIの仕様 */ enum { LABELSIZE = 8, /**<ラベルの最大文字数 */ @@ -14,7 +24,7 @@ enum { }; /** - * YACASL2の制限 + * @brief YACASL2の制限 */ enum { LINESIZE = 1024, /**<行の最大文字数 */ @@ -22,7 +32,7 @@ enum { }; /** - * アセンブルモード + * @brief アセンブルモードを表すデータ型 */ typedef struct { bool src; /**<ソースを表示する場合はtrue */ @@ -32,64 +42,27 @@ typedef struct { bool onlyassemble; /**<アセンブルだけを行う場合はtrue */ } ASMODE; -extern ASMODE asmode; - /** - * アセンブルのプロパティ + * @brief アセンブルモード: src, label, onlylabel, asdetail, onlyassemble */ -typedef struct { - WORD ptr; /**<現在のポインタ */ - WORD lptr; /**<リテラル(=付きの値)を格納するポインタ */ - char *prog; /**<他のプログラムで参照する入口名 */ -} ASPROP; +extern ASMODE asmode; /** - * アセンブルのプロパティ: ptr, lptr, *prog + * @brief アセンブル時の現在およびリテラルのアドレスとプログラム入口名を表すデータ型 */ -extern ASPROP *asprop; - -/** - * アセンブラ命令を表す番号 - */ -typedef enum { - START = 01, - END = 02, - DS = 03, - DC = 04, -} ASCMDID; - -/** - * アセンブラ命令を表す配列 - */ typedef struct { - ASCMDID cmdid; /**<アセンブル命令のID */ - int opdc_min; /**<最小オペランド数 */ - int opdc_max; /**<最大オペランド数 */ - char *cmd; /**<コマンド名 */ -} ASCMD; - -/** - * マクロ命令を表す番号 - */ -typedef enum { - IN = 011, - OUT = 012, - RPUSH = 013, - RPOP = 014, -} MACROCMDID; + WORD ptr; /**<現在のアドレス */ + WORD lptr; /**<リテラル(=付きの値)のアドレス */ + char *prog; /**<他のプログラムで参照する入口名 */ +} ASPTR; /** - * マクロ命令を表す配列 + * @brief アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog */ -typedef struct { - MACROCMDID cmdid; /**<アセンブル命令のID */ - int opdc_min; /**<最小オペランド数 */ - int opdc_max; /**<最大オペランド数 */ - char *cmd; /**<コマンド名 */ -} MACROCMD; +extern ASPTR *asptr; /** - * ラベル配列 + * @brief ラベル配列を表すデータ型 */ typedef struct { char *prog; /**<プログラム */ @@ -98,52 +71,72 @@ typedef struct { } LABELARRAY; /** - * ラベル表 + * @brief ラベル表を表すデータ型 */ typedef struct _LABELTAB { struct _LABELTAB *next; /**<リスト次項目へのポインタ */ - char *prog; /**<プログラム名 */ - char *label; /**<ラベル名 */ - WORD adr; /**<アドレス */ + LABELARRAY *label; /**<ラベル配列 */ } LABELTAB; +/** + * ラベル表のサイズ + */ enum { - /** - * ラベル表のサイズ - */ - LABELTABSIZE = 251, + LABELTABSIZE = 251, /**<ラベル表のサイズ */ }; /** - * アセンブラが、1回目か2回目か + * @brief アセンブラが、1回目か2回目かを表す数値 */ typedef enum { - FIRST = 0, - SECOND = 1, + FIRST = 0, /**<アセンブラ1回目 */ + SECOND = 1, /**<アセンブラ2回目 */ } PASS; /** - * プログラム名とラベルに対応するアドレスをラベル表から検索する + * @brief ラベルのエラーをエラーリストに追加する + * + * @return なし + */ +void addcerrlist_label(); + +/** + * @brief プログラム名とラベルに対応するアドレスをラベル表から検索する + * + * @return プログラム名とラベルに対応するアドレス + * + * @param *prog プログラム名 + * @param *label ラベル */ WORD getlabel(const char *prog, const char *label); /** - * プログラム名、ラベル、アドレスをラベル表に追加する + * @brief プログラム名、ラベル、アドレスをラベル表に追加する + * + * @return 追加に成功した時はtrue、失敗した時はfalse + * + * @param *prog プログラム名 + * @param *label ラベル + * @param adr アドレス */ -bool addlabel(const char *prog, const char *label, WORD word); +bool addlabel(const char *prog, const char *label, WORD adr); /** - * ラベル表を表示する + * @brief ラベル表を表示する + * + * @return なし */ void printlabel(); /** - * ラベル表を解放する + * @brief ラベル表を解放する + * + * @return なし */ void freelabel(); /** - * オペランド + * @brief オペランドを表すデータ型 */ typedef struct { int opdc; /**<オペランド数 */ @@ -151,7 +144,7 @@ typedef struct { } OPD; /** - * 命令行 + * @brief 命令行を表すデータ型 */ typedef struct { char *label; /**<ラベル */ @@ -160,28 +153,57 @@ typedef struct { } CMDLINE; /** - * トークン取得のエラーを追加 + * @brief トークン取得のエラーを追加する + * + * @return なし */ void addcerrlist_tok(); /** - * 空白またはタブで区切られた1行から、トークンを取得する + * @brief 行から、ラベル・コマンド・オペランドを取得する + * + * @return ラベル・コマンド・オペランド + * + * @param *line 行 */ CMDLINE *linetok(const char *line); /** - * アセンブルエラーをエラーリストに追加 + * @brief アセンブルエラーをエラーリストに追加する + * + * @return なし */ void addcerrlist_assemble(); /** - * 指定された名前のファイルをアセンブル - * 2回実行される + * @brief 指定された名前のファイルをアセンブル\n + * + * 1回目ではラベルを登録し、2回目ではラベルからアドレスを読み込む + * + * @return アセンブル完了時はtrue、エラー発生時はfalseを返す + * + * @param *file ファイル名 + * @param pass アセンブラが何回目かを表す数 + */ +bool assemblefile(const char *file, PASS pass); + +/** + * @brief 指定された1つまたは複数のファイルを2回アセンブル + * + * @return なし + * + * @param filec アセンブルするファイルの数 + * @param filev アセンブルするファイル名の配列 + * @param adr アセンブル結果を格納するアドレス */ -bool assemble(const char *file, PASS pass); +void assemble(int filec, char *filev[], WORD adr); /** - * 引数で指定したファイルにアセンブル結果を書込 + * @brief ファイルにアセンブル結果を書き込む + * + * @return なし + * + * @param *file ファイル名 */ void outassemble(const char *file);