#ifndef YACASL2_ASSEMBLE_INCLUDED
#define YACASL2_ASSEMBLE_INCLUDED
-/* CASL IIの仕様 */
+#include <stdbool.h>
+#include "struct.h"
+#include "word.h"
+
+/**
+ * CASL IIの仕様
+ */
enum {
- LABELSIZE = 8, /* ラベルの最大文字数 */
- OPDSIZE = 40, /* オペラントの最大数。CASL IIシミュレータの制限 */
+ LABELSIZE = 8, /**<ラベルの最大文字数 */
+ OPDSIZE = 40, /**<オペラントの最大数。CASL IIシミュレータの制限 */
};
-/* YACASL2の制限 */
+/**
+ * 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;
-
-extern ASPROP *asprop;
+ WORD ptr; /**<現在のアドレス */
+ WORD lptr; /**<リテラル(=付きの値)のアドレス */
+ char *prog; /**<他のプログラムで参照する入口名 */
+} ASPTR;
-/* アセンブラ命令とマクロ命令を表す番号 */
-typedef enum {
- START = 01,
- END = 02,
- DS = 03,
- DC = 04,
- IN = 011,
- OUT = 012,
- RPUSH = 013,
- RPOP = 014,
-} CASLCMD;
-
-/* アセンブラ命令とマクロ命令を表す配列 */
-typedef struct {
- CASLCMD cmdid;
- int opdc_min;
- int opdc_max;
- char *cmd;
-} CMDARRAY;
+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 {
- LABELTABSIZE = 251, /* ラベル表のサイズ */
+ /**
+ * ラベル表のサイズ
+ */
+ LABELTABSIZE = 251,
};
-/* アセンブラが、1回目か、2回目か、を表す */
+/**
+ * アセンブラが、1回目か2回目か
+ */
typedef enum {
FIRST = 0,
SECOND = 1,
} PASS;
-/* アセンブルのエラー定義 */
-bool addcerrlist_assemble();
-
-/* プログラム名とラベルに対応するハッシュ値を返す */
-unsigned labelhash(const char *prog, const char *label);
+/**
+ * ラベルのエラーをエラーリストに追加
+ */
+void addcerrlist_label();
-/* プログラム名とラベルに対応するアドレスをラベル表から検索する */
+/**
+ * プログラム名とラベルに対応するアドレスをラベル表から検索する
+ */
WORD getlabel(const char *prog, const char *label);
-/* ラベルを表に追加する */
+/**
+ * プログラム名、ラベル、アドレスをラベル表に追加する
+ */
bool addlabel(const char *prog, const char *label, WORD word);
-/* ラベル表を表示する */
+/**
+ * ラベル表を表示する
+ */
void printlabel();
-/* ラベル表を解放する */
+/**
+ * ラベル表を解放する
+ */
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;
-/* 命令がマクロ命令の場合はメモリに書込
- 書込に成功した場合TRUE、それ以外の場合はFALSEを返す */
-bool macrocmd(const CMDLINE *cmdl, PASS pass);
-
-/* 「,」区切りの文字列から、オペランドを取得する */
-OPD *opdtok(const char *str);
+/**
+ * トークン取得のエラーを追加
+ */
+void addcerrlist_tok();
-/* 1行を解析する */
+/**
+ * 空白またはタブで区切られた1行から、トークンを取得する
+ */
CMDLINE *linetok(const char *line);
-/* 汎用レジスタを表す文字列「GR[0-7]」から、レジスタ番号[0-7]をWORD値で返す */
-/* 文字列が汎用レジスタを表さない場合は、0xFFFFを返す */
-/* is_xがtrueの場合は指標レジスタ。GR0は、COMET IIの仕様により、エラー発生 */
-WORD getgr(const char *str, bool is_x);
-
-/* 10進定数をWORDに変換 */
-WORD getint(const char *str);
-
-/* 16進定数をWORDに変換 */
-WORD gethex(const char *str);
-
-/* アドレスを返す */
-/* アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */
-WORD getadr(const char *prog, const char *str, PASS pass);
-
-/* 定数の前に等号(=)をつけて記述される、リテラルを返す */
-/* リテラルには、10進定数/16進定数/文字定数が含まれる */
-WORD getliteral(const char *str, PASS pass);
-
-/* COMET IIのメモリにアドレス値を書き込む */
-bool writememory(WORD word, WORD adr, PASS pass);
-
-/* ' 'で囲まれた、文字定数をメモリに書込 */
-/* DC命令とリテラルで使い、リテラルの場合はリテラル領域に書込 */
-void writestr(const char *str, bool literal, PASS pass);
-
-/* アセンブラ命令DCをメモリに書込 */
-void writeDC(const char *str, PASS pass);
-
-/* 命令がアセンブラ命令の場合は処理を実行する。
- 実行に成功した場合TRUE、それ以外の場合はFALSEを返す */
-bool assemblecmd(const CMDLINE *cmdl, PASS pass);
-
-/* 命令のコードを返す
- 命令が無効な場合は0xFFFF */
-WORD getcmd(CMDTYPE type, const char *cmd);
-
-/* 命令が機械語命令の場合は処理を実行
- 実行に成功した場合TRUE、それ以外の場合はFALSEを返す */
-bool cometcmd(const CMDLINE *cmdl, PASS pass);
-
-/* 1行のアセンブル */
-/* アセンブル完了時はTRUE、未完了時はFALSEを返す */
-bool assembleline(const CMDLINE *cmdl, PASS pass);
-
-/* 指定された名前のファイルをアセンブル */
-/* 2回実行される */
-bool assemble(const char *file, PASS pass);
-
-/* マクロ命令「IN IBUF,LEN」をメモリに書込 */
-bool writeIN(const char *ibuf, const char *len, PASS pass);
-
-/* マクロ命令「OUT OBUF,LEN」をメモリに書込 */
-bool writeOUT(const char *obuf, const char *len, PASS pass);
-
-/* マクロ命令「RPUSH」をメモリに書込 */
-bool writeRPUSH(PASS pass);
-
-/* マクロ命令「RPOP」をメモリに書込 */
-bool writeRPOP(PASS pass);
+/**
+ * アセンブルエラーをエラーリストに追加
+ */
+void addcerrlist_assemble();
+
+/**
+ * 指定された名前のファイルをアセンブル
+ * 1回目ではラベルを登録し、2回目ではラベルからアドレスを読み込む
+ * アセンブル完了時はtrue、エラー発生時はfalseを返す
+ */
+bool assemblefile(const char *file, PASS pass);
+
+/**
+ * 引数で指定したファイルにアセンブル結果を書込
+ */
+void outassemble(const char *file);
#endif /* YACASL2_ASSEMBLE_INCLUDEDの終端 */