comet2monitorの追加と、モニター機能作成
[YACASL2.git] / include / assemble.h
index 15d314c..78f5b8a 100644 (file)
 #ifndef YACASL2_ASSEMBLE_INCLUDED
 #define YACASL2_ASSEMBLE_INCLUDED
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <stdbool.h>
+#include <ctype.h>
+#include <assert.h>
+#include <errno.h>
+#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,         /** ラベルの最大文字数 */
-    OPDSIZE = 40,          /** オペラントの最大数。CASL IIシミュレータの制限 */
+    LABELSIZE = 8,         /**<ラベルの最大文字数 */
+    OPDSIZE = 40,          /**<オペラントの最大数。CASL IIシミュレータの制限 */
 };
 
 /**
- * YACASL2の制限
+ * @brief YACASL2の制限
  */
 enum {
-    LINESIZE = 1024,       /* 行の最大文字数 */
-    TOKENSIZE = 256,       /* トークンの最大文字数 */
+    LINESIZE = 1024,       /**<行の最大文字数 */
+    TOKENSIZE = 256,       /**<トークンの最大文字数 */
 };
 
 /**
- * アセンブルモード
+ * @brief アセンブルモードを表すデータ型
  */
 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;
-
 /**
- * アセンブルのプロパティ
+ * @brief アセンブルモード: src, label, onlylabel, asdetail, onlyassemble
  */
-typedef struct {
-    WORD ptr;     /* 現在のポインタ */
-    WORD lptr;    /* リテラル(=付きの値)を格納するポインタ */
-    char *prog;   /* 他のプログラムで参照する入口名 */
-} ASPROP;
-
-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;
+extern ASMODE asmode;
 
 /**
- * マクロ命令を表す番号
+ * @brief アセンブル時の現在およびリテラルのアドレスとプログラム入口名を表すデータ型
  */
-typedef enum {
-    IN = 011,
-    OUT = 012,
-    RPUSH = 013,
-    RPOP = 014,
-} MACROCMDID;
+typedef struct {
+    WORD ptr;     /**<現在のアドレス */
+    WORD lptr;    /**<リテラル(=付きの値)のアドレス */
+    char *prog;   /**<他のプログラムで参照する入口名 */
+} ASPTR;
 
 /**
- * マクロ命令を表す配列
+ * @brief アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog
  */
-typedef struct {
-    MACROCMDID cmdid;
-    int opdc_min;
-    int opdc_max;
-    char *cmd;
-} MACROCMD;
+extern ASPTR *asptr;
 
 /**
- * ラベル配列
+ * @brief ラベル配列を表すデータ型
  */
 typedef struct {
-    char *prog;
-    char *label;
-    WORD adr;
+    char *prog;                 /**<プログラム  */
+    char *label;                /**<ラベル */
+    WORD adr;                   /**<アドレス */
 } LABELARRAY;
 
 /**
- * ラベル表
+ * @brief ラベル表を表すデータ型
  */
 typedef struct _LABELTAB {
-    struct _LABELTAB *next;
-    char *prog;
-    char *label;
-    WORD adr;
+    struct _LABELTAB *next;     /**<リスト次項目へのポインタ */
+    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;
-    char *opdv[OPDSIZE];
+    int opdc;                   /**<オペランド数 */
+    char *opdv[OPDSIZE];        /**<オペランド配列 */
 } OPD;
 
 /**
- * 命令行
+ * @brief 命令行を表すデータ型
  */
 typedef struct {
-    char *label;
-    char *cmd;
-    OPD *opd;
+    char *label;                /**<ラベル */
+    char *cmd;                  /**<コマンド */
+    OPD *opd;                   /**<オペランド */
 } CMDLINE;
 
 /**
- * 1行を解析する
+ * @brief トークン取得のエラーを追加する
+ *
+ * @return なし
+ */
+void addcerrlist_tok();
+
+/**
+ * @brief 行から、ラベル・コマンド・オペランドを取得する
+ *
+ * @return ラベル・コマンド・オペランド
+ *
+ * @param *line 行
  */
 CMDLINE *linetok(const char *line);
 
 /**
- * 指定された名前のファイルをアセンブル
- * 2回実行される
+ * @brief アセンブルエラーをエラーリストに追加する
+ *
+ * @return なし
+ */
+void addcerrlist_assemble();
+
+/**
+ * @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);