X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=include%2Fassemble.h;h=1a3c566541016d4889b7f43d4af1e3b3ef918cb8;hb=a42ca0f2dfcdcde9e5aebccc3754e91a8206e1f9;hp=15d314c789dd2b47eae011fd961a47a382dc5f2f;hpb=d1f82970bf7d41db2fea11b08cd8e308f6cb8138;p=YACASL2.git diff --git a/include/assemble.h b/include/assemble.h index 15d314c..1a3c566 100644 --- a/include/assemble.h +++ b/include/assemble.h @@ -9,99 +9,59 @@ * CASL IIの仕様 */ enum { - LABELSIZE = 8, /** ラベルの最大文字数 */ - OPDSIZE = 40, /** オペラントの最大数。CASL IIシミュレータの制限 */ + LABELSIZE = 8, /**<ラベルの最大文字数 */ + OPDSIZE = 40, /**<オペラントの最大数。CASL IIシミュレータの制限 */ }; /** * YACASL2の制限 */ enum { - LINESIZE = 1024, /* 行の最大文字数 */ - TOKENSIZE = 256, /* トークンの最大文字数 */ + LINESIZE = 1024, /**<行の最大文字数 */ + TOKENSIZE = 256, /**<トークンの最大文字数 */ }; /** * アセンブルモード */ typedef struct { - bool src; /* ソースを表示する場合はtrue */ - bool label; /* ラベル表を表示する場合はtrue */ - bool onlylabel; /* ラベル表を表示して終了する場合はtrue */ - bool asdetail; /* アセンブラ詳細結果を表示する場合はtrue */ - bool onlyassemble; /* アセンブルだけを行う場合はtrue */ + bool src; /**<ソースを表示する場合はtrue */ + bool label; /**<ラベル表を表示する場合はtrue */ + bool onlylabel; /**<ラベル表を表示して終了する場合はtrue */ + bool asdetail; /**<アセンブラ詳細結果を表示する場合はtrue */ + bool onlyassemble; /**<アセンブルだけを行う場合はtrue */ } ASMODE; extern ASMODE asmode; /** - * アセンブルのプロパティ + * アセンブル時の、現在およびリテラルのアドレスとプログラム入口名 */ typedef struct { - WORD ptr; /* 現在のポインタ */ - WORD lptr; /* リテラル(=付きの値)を格納するポインタ */ - char *prog; /* 他のプログラムで参照する入口名 */ -} ASPROP; + WORD ptr; /**<現在のアドレス */ + WORD lptr; /**<リテラル(=付きの値)のアドレス */ + char *prog; /**<他のプログラムで参照する入口名 */ +} ASPTR; -extern ASPROP *asprop; - -/** - * アセンブラ命令を表す番号 - */ -typedef enum { - START = 01, - END = 02, - DS = 03, - DC = 04, -} ASCMDID; - -/** - * アセンブラ命令を表す配列 - */ -typedef struct { - ASCMDID cmdid; - int opdc_min; - int opdc_max; - char *cmd; -} ASCMD; - -/** - * マクロ命令を表す番号 - */ -typedef enum { - IN = 011, - OUT = 012, - RPUSH = 013, - RPOP = 014, -} MACROCMDID; - -/** - * マクロ命令を表す配列 - */ -typedef struct { - MACROCMDID cmdid; - int opdc_min; - int opdc_max; - char *cmd; -} MACROCMD; +extern ASPTR *asptr; /** * ラベル配列 */ typedef struct { - char *prog; - char *label; - WORD adr; + char *prog; /**<プログラム */ + char *label; /**<ラベル */ + WORD adr; /**<アドレス */ } LABELARRAY; /** * ラベル表 */ typedef struct _LABELTAB { - struct _LABELTAB *next; - char *prog; - char *label; - WORD adr; + struct _LABELTAB *next; /**<リスト次項目へのポインタ */ + char *prog; /**<プログラム名 */ + char *label; /**<ラベル名 */ + WORD adr; /**<アドレス */ } LABELTAB; enum { @@ -112,20 +72,25 @@ enum { }; /** - * アセンブラが、1回目か、2回目か、を表す + * アセンブラが、1回目か2回目か */ typedef enum { FIRST = 0, SECOND = 1, } PASS; +/** + * ラベルのエラーをエラーリストに追加 + */ +void addcerrlist_label(); + /** * プログラム名とラベルに対応するアドレスをラベル表から検索する */ WORD getlabel(const char *prog, const char *label); /** - * ラベルを表に追加する + * プログラム名、ラベル、アドレスをラベル表に追加する */ bool addlabel(const char *prog, const char *label, WORD word); @@ -143,32 +108,43 @@ void freelabel(); * オペランド */ typedef struct { - int opdc; - char *opdv[OPDSIZE]; + int opdc; /**<オペランド数 */ + char *opdv[OPDSIZE]; /**<オペランド配列 */ } OPD; /** * 命令行 */ typedef struct { - char *label; - char *cmd; - OPD *opd; + char *label; /**<ラベル */ + char *cmd; /**<コマンド */ + OPD *opd; /**<オペランド */ } CMDLINE; /** - * 1行を解析する + * トークン取得のエラーを追加 + */ +void addcerrlist_tok(); + +/** + * 空白またはタブで区切られた1行から、トークンを取得する */ CMDLINE *linetok(const char *line); +/** + * アセンブルエラーをエラーリストに追加 + */ +void addcerrlist_assemble(); + /** * 指定された名前のファイルをアセンブル - * 2回実行される + * 1回目ではラベルを登録し、2回目ではラベルからアドレスを読み込む + * アセンブル完了時はtrue、エラー発生時はfalseを返す */ -bool assemble(const char *file, PASS pass); +bool assemblefile(const char *file, PASS pass); /** - * 指定されたファイルにアセンブル結果を書込 + * 引数で指定したファイルにアセンブル結果を書込 */ void outassemble(const char *file);