-/* CASL IIの制限 */
+#ifndef YACASL2_ASSEMBLE_INCLUDED
+#define YACASL2_ASSEMBLE_INCLUDED
+
+/* 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 {
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);
+
+/* プログラム名とラベルに対応するアドレスをラベル表から検索する */
WORD getlabel(const char *prog, const char *label);
/* ラベルを表に追加する */
/* 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に変換 */
/* アドレスを返す */
/* アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */
-WORD getadr(const char *str, PASS pass);
+WORD getadr(const char *prog, const char *str, PASS pass);
/* 定数の前に等号(=)をつけて記述される、リテラルを返す */
/* リテラルには、10進定数/16進定数/文字定数が含まれる */
/* アセンブラ命令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行のアセンブル */
/* マクロ命令「RPOP」をメモリに書込 */
bool writeRPOP(PASS pass);
+
+#endif /* YACASL2_ASSEMBLE_INCLUDEDの終端 */