Merge branch 'master' of dragon:/home/dav/yacasl2
[YACASL2.git] / include / assemble.h
index 594157c..eb0ab28 100644 (file)
@@ -1,43 +1,76 @@
 #ifndef YACASL2_ASSEMBLE_INCLUDED
 #define YACASL2_ASSEMBLE_INCLUDED
 
-/* CASL IIの制限 */
+/* CASL IIの仕様 */
+enum {
+    LABELSIZE = 8,         /* ラベルの最大文字数 */
+    OPDSIZE = 40,          /* オペラントの最大数。CASL IIシミュレータの制限 */
+};
+
+/* YACASL2の制限 */
 enum {
     LINESIZE = 1024,       /* 行の最大文字数 */
     TOKENSIZE = 256,       /* トークンの最大文字数 */
-    LABELSIZE = 8,         /* ラベルの最大文字数 */
-    LABELTABSIZE = 256,    /* ラベルの最大数 */
-    OPDSIZE = 40,          /* オペラントの最大数 */
 };
 
-/* 値を格納するポインタ */
-extern WORD ptr;
+/* アセンブルモード */
+typedef struct {
+    bool src;             /* ソースを表示する場合はtrue */
+    bool label;           /* ラベル表を表示する場合はtrue */
+    bool onlylabel;       /* ラベル表を表示して終了する場合はtrue */
+    bool asdetail;        /* アセンブラ詳細結果を表示する場合はtrue */
+    bool onlyassemble;    /* アセンブルだけを行う場合はtrue */
+} ASMODE;
+
+extern ASMODE asmode;
 
-/* リテラル(=付きの値)を格納するポインタ */
-extern WORD lptr;
+/* アセンブル時のプロパティ */
+typedef struct {
+    WORD ptr;     /* 現在のポインタ */
+    WORD lptr;    /* リテラル(=付きの値)を格納するポインタ */
+    char *prog;   /* 他のプログラムで参照する入口名 */
+} ASPROP;
 
-/* 他のプログラムで参照する入口名 */
-extern char *prog;
+extern ASPROP *asprop;
 
-/* ã\82¢ã\82»ã\83³ã\83\96ã\83©å\91½ä»¤ã\81¨ã\83\9eã\82¯ã\83­å\91½ä»¤ã\82\92表ã\81\99ç\95ªå\8f· */
+/* アセンブラ命令を表す番号 */
 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,
-} CASLCMD;
+} MACROCMDID;
 
-/* ã\82¢ã\82»ã\83³ã\83\96ã\83©å\91½ä»¤ã\81¨ã\83\9eã\82¯ã\83­å\91½ä»¤ã\82\92表ã\81\99é\85\8då\88\97 */
+/* マクロ命令を表す配列 */
 typedef struct {
-    CASLCMD cmdid;
+    MACROCMDID cmdid;
     int opdc_min;
     int opdc_max;
     char *cmd;
-} CMDARRAY;
+} MACROCMD;
+
+/* ラベル配列 */
+typedef struct {
+    char *prog;
+    char *label;
+    WORD adr;
+} LABELARRAY;
 
 /* ラベル表 */
 typedef struct _LABELTAB {
@@ -47,12 +80,19 @@ typedef struct _LABELTAB {
     WORD adr;
 } LABELTAB;
 
+enum {
+    LABELTABSIZE = 251,    /* ラベル表のサイズ */
+};
+
 /* アセンブラが、1回目か、2回目か、を表す */
 typedef enum {
     FIRST = 0,
     SECOND = 1,
 } PASS;
 
+/* アセンブルのエラー定義 */
+bool addcerrlist_assemble();
+
 /* プログラム名とラベルに対応するハッシュ値を返す */
 unsigned labelhash(const char *prog, const char *label);
 
@@ -91,9 +131,9 @@ OPD *opdtok(const char *str);
 /* 1行を解析する */
 CMDLINE *linetok(const char *line);
 
-/* æ±\8eç\94¨ã\83¬ã\82¸ã\82¹ã\82¿ã\82\92表ã\81\99æ\96\87å­\97å\88\97ã\80\8cGR[0-7]ã\80\8dã\82\92WORDå\80¤ã\81«å¤\89æ\8f\9b
-   is_xがTRUEの場合は、指標レジスタとして用いる汎用レジスタ
-   文字列が汎用レジスタを表さない場合は、0xFFFFを返す */
+/* æ±\8eç\94¨ã\83¬ã\82¸ã\82¹ã\82¿ã\82\92表ã\81\99æ\96\87å­\97å\88\97ã\80\8cGR[0-7]ã\80\8dã\81\8bã\82\89ã\80\81ã\83¬ã\82¸ã\82¹ã\82¿ç\95ªå\8f·[0-7]ã\82\92WORDå\80¤ã\81§è¿\94ã\81\99 */
+/* 文字列が汎用レジスタを表さない場合は、0xFFFFを返す */
+/* is_xがtrueの場合は指標レジスタ。GR0は、COMET IIの仕様により、エラー発生 */
 WORD getgr(const char *str, bool is_x);
 
 /* 10進定数をWORDに変換 */
@@ -120,16 +160,16 @@ void writestr(const char *str, bool literal, PASS pass);
 /* アセンブラ命令DCをメモリに書込 */
 void writeDC(const char *str, PASS pass);
 
-/* 命令がアセンブラ命令の場合は処理を実行する。
-   実行に成功した場合TRUE、それ以外の場合はFALSEを返す */
+/* 命令がアセンブラ命令の場合は処理を実行する。 */
+/* 実行に成功した場合TRUE、それ以外の場合はFALSEを返す */
 bool assemblecmd(const CMDLINE *cmdl, PASS pass);
 
 /* 命令のコードを返す
    命令が無効な場合は0xFFFF */
 WORD getcmd(CMDTYPE type, const char *cmd);
 
-/* 命令が機械語命令の場合は処理を実行
-   実行に成功した場合TRUE、それ以外の場合はFALSEを返す */
+/* 命令が機械語命令の場合は処理を実行 */
+/* 実行に成功した場合TRUE、それ以外の場合はFALSEを返す */
 bool cometcmd(const CMDLINE *cmdl, PASS pass);
 
 /* 1行のアセンブル */
@@ -152,4 +192,4 @@ bool writeRPUSH(PASS pass);
 /* マクロ命令「RPOP」をメモリに書込 */
 bool writeRPOP(PASS pass);
 
-#endif
+#endif            /* YACASL2_ASSEMBLE_INCLUDEDの終端 */