From 1708c99d4b6263863304d48ebca3b3473d6a0112 Mon Sep 17 00:00:00 2001 From: j8takagi Date: Sun, 21 Apr 2013 17:52:20 +0900 Subject: [PATCH] =?utf8?q?Doxygen=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1?= =?utf8?q?=E3=83=B3=E3=83=88=E3=81=A7=E9=96=A2=E6=95=B0=E3=81=AA=E3=81=A9?= =?utf8?q?=E3=81=AB=E6=A6=82=E8=A6=81=E3=81=A8=E3=83=91=E3=83=A9=E3=83=A1?= =?utf8?q?=E3=83=BC=E3=82=BF=E3=83=BC=E3=80=81=E8=BF=94=E3=82=8A=E5=80=A4?= =?utf8?q?=E3=81=8C=E8=A1=A8=E7=A4=BA=E3=81=95=E3=82=8C=E3=82=8B=E3=82=88?= =?utf8?q?=E3=81=86=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- include/assemble.h | 94 +++++++--- include/cerr.h | 40 +++-- include/cmem.h | 30 +++- include/exec.h | 233 +++++++++++++++++++------ include/hash.h | 16 +- include/struct.h | 11 +- include/word.h | 33 +++- src/assemble.c | 415 ++++++++++++++++++++++++++++----------------- src/casl2.c | 46 +++-- src/cerr.c | 32 +--- src/cmem.c | 11 -- src/comet2.c | 9 +- src/dump.c | 10 +- src/dumpword.c | 9 +- src/exec.c | 350 ++++++++++++-------------------------- src/hash.c | 3 - src/label.c | 75 ++++---- src/token.c | 34 ++-- src/word.c | 52 +++--- 19 files changed, 847 insertions(+), 656 deletions(-) diff --git a/include/assemble.h b/include/assemble.h index 1a3c566..257fe37 100644 --- a/include/assemble.h +++ b/include/assemble.h @@ -6,7 +6,7 @@ #include "word.h" /** - * CASL IIの仕様 + * @brief CASL IIの仕様 */ enum { LABELSIZE = 8, /**<ラベルの最大文字数 */ @@ -14,7 +14,7 @@ enum { }; /** - * YACASL2の制限 + * @brief YACASL2の制限 */ enum { LINESIZE = 1024, /**<行の最大文字数 */ @@ -22,7 +22,7 @@ enum { }; /** - * アセンブルモード + * @brief アセンブルモードを表すデータ型 */ typedef struct { bool src; /**<ソースを表示する場合はtrue */ @@ -32,10 +32,13 @@ typedef struct { bool onlyassemble; /**<アセンブルだけを行う場合はtrue */ } ASMODE; +/** + * @brief アセンブルモード: src, label, onlylabel, asdetail, onlyassemble + */ extern ASMODE asmode; /** - * アセンブル時の、現在およびリテラルのアドレスとプログラム入口名 + * @brief アセンブル時の現在およびリテラルのアドレスとプログラム入口名を表すデータ型 */ typedef struct { WORD ptr; /**<現在のアドレス */ @@ -43,10 +46,13 @@ typedef struct { char *prog; /**<他のプログラムで参照する入口名 */ } ASPTR; +/** + * @brief アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog + */ extern ASPTR *asptr; /** - * ラベル配列 + * @brief ラベル配列を表すデータ型 */ typedef struct { char *prog; /**<プログラム */ @@ -55,7 +61,7 @@ typedef struct { } LABELARRAY; /** - * ラベル表 + * @brief ラベル表を表すデータ型 */ typedef struct _LABELTAB { struct _LABELTAB *next; /**<リスト次項目へのポインタ */ @@ -64,48 +70,65 @@ typedef struct _LABELTAB { WORD adr; /**<アドレス */ } 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; /**<オペランド数 */ @@ -113,7 +136,7 @@ typedef struct { } OPD; /** - * 命令行 + * @brief 命令行を表すデータ型 */ typedef struct { char *label; /**<ラベル */ @@ -122,29 +145,46 @@ typedef struct { } CMDLINE; /** - * トークン取得のエラーを追加 + * @brief トークン取得のエラーを追加する + * + * @return なし */ void addcerrlist_tok(); /** - * 空白またはタブで区切られた1行から、トークンを取得する + * @brief 行から、ラベル・コマンド・オペランドを取得する + * + * @return ラベル・コマンド・オペランド + * + * @param *line 行 */ CMDLINE *linetok(const char *line); /** - * アセンブルエラーをエラーリストに追加 + * @brief アセンブルエラーをエラーリストに追加する + * + * @return なし */ void addcerrlist_assemble(); /** - * 指定された名前のファイルをアセンブル + * @brief 指定された名前のファイルをアセンブル\n + * * 1回目ではラベルを登録し、2回目ではラベルからアドレスを読み込む - * アセンブル完了時はtrue、エラー発生時はfalseを返す + * + * @return アセンブル完了時はtrue、エラー発生時はfalseを返す + * + * @param *file ファイル名 + * @param pass アセンブラが何回目かを表す数 */ bool assemblefile(const char *file, PASS pass); /** - * 引数で指定したファイルにアセンブル結果を書込 + * @brief ファイルにアセンブル結果を書き込む + * + * @return なし + * + * @param *file ファイル名 */ void outassemble(const char *file); diff --git a/include/cerr.h b/include/cerr.h index 5ff200c..810bf3c 100644 --- a/include/cerr.h +++ b/include/cerr.h @@ -5,7 +5,7 @@ #include "cmem.h" /** - * エラーの構造体 + * @brief エラーを表すデータ型 */ typedef struct _CERR { int num; /**<エラー番号 */ @@ -13,12 +13,12 @@ typedef struct _CERR { } CERR; /** - * 現在のエラー + * @brief 現在のエラー */ extern CERR *cerr; /** - * エラーリスト型 + * @brief エラーリストのデータ型 */ typedef struct _CERRLIST { struct _CERRLIST *next; /**<リスト次項目へのポインタ */ @@ -26,7 +26,7 @@ typedef struct _CERRLIST { } CERRLIST; /** - * エラーリスト + * @brief エラーリスト */ extern CERRLIST *cerrlist; @@ -36,32 +36,52 @@ enum { }; /** - * エラーの初期化 + * @brief エラーを初期化する + * + * @return なし */ void cerr_init(); /** - * エラーリストを作成・追加する + * @brief エラーリストを作成・追加する + * + * @return なし + * + * @param cerrc 作成または追加するエラーの数 + * @param cerrv 作成または追加するエラーの配列 */ void addcerrlist(int cerrc, CERR cerrv[]); /** - * エラーリストを表示する + * @brief エラーリストを表示する + * + * @return なし */ void printcerrlist(); /** - * 現在のエラーを設定する + * @brief 現在のエラーを設定する + * + * @return なし + * + * @param num エラー番号 + * @param *str エラーメッセージに含まれる文字列 */ void setcerr(int num, const char *str); /** - * エラーリストから、エラー番号に対応するメッセージを返す + * @brief エラー番号に対応するエラーメッセージを返す + * + * @return エラーメッセージ + * + * @param num エラー番号 */ char *getcerrmsg(int num); /** - * エラーリストと現在のエラーを解放する + * @brief エラーリストと現在のエラーを解放する + * + * @return なし */ void freecerr(); #endif diff --git a/include/cmem.h b/include/cmem.h index c670226..85cb720 100644 --- a/include/cmem.h +++ b/include/cmem.h @@ -2,34 +2,52 @@ #define YACASL2_CMEM_H_INCLUDED #include -/* - * 配列のサイズを返す +/** + * @brief 配列のサイズを返すマクロ */ #ifndef ARRAYSIZE #define ARRAYSIZE(array) (sizeof(array)/sizeof(array[0])) #endif /** - * メモリを解放 + * @brief メモリを解放するマクロ */ #ifndef FREE #define FREE(ptr) {free(ptr); ptr = NULL;} #endif /** - * mallocを実行し、0で初期化 + * @brief mallocを実行し、0で初期化する + * * メモリを確保できない場合はエラーを出力して終了 + * + * @return なし + * + * @param size メモリーのサイズ + * @param tag エラーメッセージなどで表示されるタグ */ void *malloc_chk(size_t size, char *tag); /** - * callocを実行 + * @brief 領域の数とサイズを指定してメモリーを確保するcallocを実行する + * * メモリを確保できない場合はエラーを出力して終了 + * + * @return なし + * + * @param nmemb 領域の数 + * @param size 領域1個あたりのメモリーサイズ + * @param tag エラーメッセージなどで表示されるタグ */ void *calloc_chk(size_t nmemb, size_t size, char *tag); /** - * malloc_chkを実行してメモリを確保し、コピーした文字列を返す + * @brief malloc_chkを実行してメモリを確保し、コピーした文字列を返す + * + * @return コピーした文字列 + * + * @param s 文字列 + * @param tag エラーメッセージなどで表示されるタグ */ char *strdup_chk(const char *s, char *tag); diff --git a/include/exec.h b/include/exec.h index fea403b..931f799 100644 --- a/include/exec.h +++ b/include/exec.h @@ -2,15 +2,17 @@ #define YACASL2_EXEC_INCLUDED #include +#include #include "struct.h" #include "word.h" +#include "cmem.h" enum { INSIZE = 256 /** -/* WORD - 16ビットデータ型 */ +/** + * @brief 16ビットの数値を表すデータ型 + */ typedef unsigned short WORD; /** - * wordのエラーをエラーリストに追加 + * @brief wordデータ型についてのエラーをエラーリストに追加する + * + * @return なし */ void addcerrlist_word(); /** - * 10進数または16進数の文字列をWORD値に変換 + * @brief 10進数または16進数の文字列をWORD値に変換する + * + * @return WORD値 + * + * @param *str 10進数または16進数の文字列 */ WORD nh2word(const char *str); /** - * WORD値を10進数の文字列に変換 + * @brief WORD値を10進数値を表す文字列に変換する + * + * @return 10進数値を表す文字列 + * + * @param *word WORD値 */ char *word2n(WORD word); /** - * WORD値を2進数の文字列に変換 + * @brief WORD値を2進数の文字列に変換する + * + * @return 2進数値を表す文字列 + * + * @param word WORD値 */ char *word2bit(const WORD word); /** - * WORD値を解析して表示 + * @brief WORD値を解析して表示する + * + * @return なし + * + * @param word WORD値 + * @param logicalmode 論理演算の場合はtrue、算術演算の場合はfalse */ void print_dumpword(WORD word, bool logicalmode); diff --git a/src/assemble.c b/src/assemble.c index a69837f..ee2ca63 100644 --- a/src/assemble.c +++ b/src/assemble.c @@ -9,74 +9,292 @@ #include "cerr.h" /** - * アセンブルモード: src, label, onlylabel, asdetail, onlyassemble + * @brief ファイルストリームの現在行を番号付きで表示する + * + * @return なし + * + * @param *stream ファイルストリーム + * @param *filename ファイル名 + * @param lineno 行番号 + * @param line 行の文字列 */ -ASMODE asmode = {false, false, false, false, false}; +void printline(FILE *stream, const char *filename, int lineno, char *line); /** - * アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog + * @brief アドレスを返す + * + * アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる + * + * @return アドレス + * + * @param *prog プログラム名 + * @param *str アドレスを表す文字列 + * @param pass アセンブラが何回目かを表す数 */ -ASPTR *asptr; +WORD getadr(const char *prog, const char *str, PASS pass); /** - * アセンブルのエラー定義 + * @brief 汎用レジスタを表す文字列 からレジスタ番号を返す + * + * @brief 文字列が汎用レジスタを表さない場合は、0xFFFFを返す + * + * is_xがtrueの場合は指標レジスタとなり、GR0が指定された場合はCOMET IIの仕様によりエラー発生 + * + * @return レジスタ番号[0-7]を表すWORD値 + * + * @param *str 汎用レジスタを表す文字列。「GR0」「GR1」・・・「GR7」のいずれか + * @param is_x trueの場合は指標レジスタ */ -static CERR cerr_assemble[] = { - { 106, "operand mismatch in CASL II command" }, - { 107, "no label in START" }, - { 108, "not command of operand \"r\"" }, - { 109, "not command of operand \"r1,r2\"" }, - { 110, "not command of operand \"r,adr[,x]\"" }, - { 111, "not command of operand \"adr[,x]\"" }, - { 112, "not command of no operand" }, - { 113, "operand too many in COMET II command" }, - { 119, "out of COMET II memory" }, - { 120, "GR0 in operand x" }, - { 122, "cannot create hash table" }, - { 124, "more than one character in literal" }, - { 125, "not GR in operand x" }, -}; - -void printline(FILE *stream, const char *filename, int lineno, char *line); - -WORD getadr(const char *prog, const char *str, PASS pass); - WORD getgr(const char *str, bool is_x); +/** + * @brief リテラルを返す + * + * リテラルには、10進定数/16進定数/文字定数が含まれる + * + * @param *str リテラル。定数の前に等号(=)をつけて記述される + * @param pass アセンブラが何回目かを表す数 + */ WORD getliteral(const char *str, PASS pass); +/** + * @brief アドレス値をメモリに書き込む + * + * @return なし + * + * @param word アドレス値 + * @param adr アドレス + * @param pass アセンブラが何回目かを表す数 + */ void writememory(WORD word, WORD adr, PASS pass); +/** + * @brief 文字をメモリに書き込む + * + * @return なし + * + * @param *str アドレスを表す文字列。リテラル/10進定数/16進定数/アドレス定数が含まれる + * @param literal リテラルの場合はtrue + * @param pass アセンブラが何回目かを表す数 + */ void writestr(const char *str, bool literal, PASS pass); +/** + * @brief DC命令を書込 + * + * @return なし + * + * @param str アドレスを表す文字列。10進定数/16進定数/アドレス定数が含まれる + * @param pass アセンブラが何回目かを表す数 + */ void writedc(const char *str, PASS pass); +/** + * @brief アセンブラ命令STARTの処理 + * @relatesalso Casl2cmd + * + * @return なし + * + * @param *cmdl 1行分のラベル・コマンド・オペランド + * @param pass アセンブラが何回目かを表す数 + */ void assemble_start(const CMDLINE *cmdl, PASS pass); +/** + * @brief アセンブラ命令DSの処理 + * @relatesalso Casl2cmd + * + * @return なし + * + * @param *cmdl 1行分のラベル・コマンド・オペランド + * @param pass アセンブラが何回目かを表す数 + */ void assemble_ds(const CMDLINE *cmdl, PASS pass); +/** + * @brief アセンブラ命令ENDの処理 + * @relatesalso Casl2cmd + * + * @return なし + * + * @param *cmdl 1行分のラベル・コマンド・オペランド + * @param pass アセンブラが何回目かを表す数 + */ void assemble_end(const CMDLINE *cmdl, PASS pass); +/** + * @brief アセンブラ命令DCの処理 + * @relatesalso Casl2cmd + * + * @return なし + * + * @param *cmdl 1行分のラベル・コマンド・オペランド + * @param pass アセンブラが何回目かを表す数 + */ void assemble_dc(const CMDLINE *cmdl, PASS pass); +/** + * @brief マクロ命令 "IN IBUF,LEN" をアセンブル + * + * @code + * PUSH 0,GR1 + * PUSH 0,GR2 + * LAD GR1,IBUF + * LAD GR2,LEN + * SVC 1 + * POP GR2 + * POP GR1 + * @endcode + * @relatesalso Casl2cmd + * + * + * @return なし + * + * @param *cmdl 1行分のラベル・コマンド・オペランド + * @param pass アセンブラが何回目かを表す数 + */ void assemble_in(const CMDLINE *cmdl, PASS pass); +/** + * @brief マクロ命令 "OUT OBUF,LEN" をアセンブル + * + * @code + * PUSH 0,GR1 + * PUSH 0,GR2 + * LAD GR1,OBUF + * LAD GR2,LEN + * SVC 2 + * LAD GR1,=#A + * LAD GR2,=1 + * SVC 2 + * POP GR2 + * POP GR1 + * @endcode + * @relatesalso Casl2cmd + * + * @return なし + * + * @param *cmdl 1行分のラベル・コマンド・オペランド + * @param pass アセンブラが何回目かを表す数 + */ void assemble_out(const CMDLINE *cmdl, PASS pass); +/** + * @brief マクロ命令 "RPUSH" をメモリに書き込む + * + * @code + * PUSH 0,GR1 + * PUSH 0,GR2 + * PUSH 0,GR3 + * PUSH 0,GR4 + * PUSH 0,GR5 + * PUSH 0,GR6 + * PUSH 0,GR7 + * @endcode + * @relatesalso Casl2cmd + * + * @return なし + * + * @param *cmdl 1行分のラベル・コマンド・オペランド + * @param pass アセンブラが何回目かを表す数 + */ void assemble_rpush(const CMDLINE *cmdl, PASS pass); +/** + * @brief マクロ命令 "RPOP" をメモリに書き込む + * + * @code + * POP GR7 + * POP GR6 + * POP GR5 + * POP GR4 + * POP GR3 + * POP GR3 + * POP GR2 + * POP GR1 + * @endcode + * @relatesalso Casl2cmd + * + * @return なし + * + * @param *cmdl 1行分のラベル・コマンド・オペランド + * @param pass アセンブラが何回目かを表す数 + */ void assemble_rpop(const CMDLINE *cmdl, PASS pass); +/** + * @class Casl2cmd + * @brief casl2cmdから関数ポインタで呼び出される関数 + */ + +/** + * @brief アセンブラ言語CASL IIの命令を処理する。 + * + * エラー発生時は、cerrを設定 + * + * @relatesalso Casl2cmd + * + * @return 命令が表で定義されている場合はtrue、それ以外の場合はfalseを返す + * + * @param *cmdtbl アセンブラ言語CASL IIの命令表 + * @param *cmdl 1行分のラベル・コマンド・オペランド + * @param pass アセンブラが何回目かを表す数 + */ bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass); +/** + * @brief システムCOMET IIの命令をアセンブルする + * + * @return アセンブル成功時はtrue、失敗時はfalseを返す + * + * @param *cmdl 1行分のラベル・コマンド・オペランド + * @param pass アセンブラが何回目かを表す数 + */ bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass); +/** + * @brief トークンをアセンブルする + * + * @return アセンブル成功時はtrue、失敗時はfalseを返す + * + * @param *cmdl 1行分のラベル・コマンド・オペランド + * @param pass アセンブラが何回目かを表す数 + */ bool assembletok(const CMDLINE *cmdl, PASS pass); +/** + * @brief 1行をアセンブルする + * + * passが1の場合はラベルを登録し、2の場合はラベルからアドレスを読み込む + * + * @return アセンブル成功時はtrue、失敗時はfalseを返す + * + * @param *line 1行分の文字列 + * @param pass アセンブラが何回目かを表す数 + */ bool assembleline(const char *line, PASS pass); /** - * アセンブラ命令 + * @brief アセンブルのエラー + */ +static CERR cerr_assemble[] = { + { 106, "operand mismatch in CASL II command" }, + { 107, "no label in START" }, + { 108, "not command of operand \"r\"" }, + { 109, "not command of operand \"r1,r2\"" }, + { 110, "not command of operand \"r,adr[,x]\"" }, + { 111, "not command of operand \"adr[,x]\"" }, + { 112, "not command of no operand" }, + { 113, "operand too many in COMET II command" }, + { 119, "out of COMET II memory" }, + { 120, "GR0 in operand x" }, + { 122, "cannot create hash table" }, + { 124, "more than one character in literal" }, + { 125, "not GR in operand x" }, +}; + +/** + * @brief アセンブラ命令 */ static CMD ascmd[] = { { "START", assemble_start }, @@ -87,7 +305,7 @@ static CMD ascmd[] = { }; /** - * マクロ命令 + * @brief マクロ命令 */ static CMD macrocmd[] = { { "OUT", assemble_out }, @@ -97,29 +315,15 @@ static CMD macrocmd[] = { { "", NULL } }; -/** - * アセンブルのエラーをエラーリストに追加 - */ -void addcerrlist_assemble() -{ - addcerrlist_tok(); - addcerrlist_word(); - addcerrlist_label(); - addcerrlist(ARRAYSIZE(cerr_assemble), cerr_assemble); -} +ASPTR *asptr; + +ASMODE asmode = {false, false, false, false, false}; -/** - * ファイルストリームの現在行を番号付きで表示する - */ void printline(FILE *stream, const char *filename, int lineno, char *line) { fprintf(stream, "%s:%5d:%s", filename, lineno, line); } -/** - * アドレスを返す\n - * アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる - */ WORD getadr(const char *prog, const char *str, PASS pass) { WORD adr = 0x0; @@ -138,11 +342,6 @@ WORD getadr(const char *prog, const char *str, PASS pass) return adr; } -/** - * 汎用レジスタを表す文字列 "GR[0-7]" から、レジスタ番号 [0-7] をWORD値で返す\n - * 文字列が汎用レジスタを表さない場合は、0xFFFFを返す\n - * is_xがtrueの場合は指標レジスタ。GR0が指定された場合は、COMET IIの仕様によりエラー発生 - */ WORD getgr(const char *str, bool is_x) { WORD r; @@ -162,10 +361,6 @@ WORD getgr(const char *str, bool is_x) return r; } -/** - * 定数の前に等号(=)をつけて記述されるリテラルを返す\n - * リテラルには、10進定数/16進定数/文字定数が含まれる - */ WORD getliteral(const char *str, PASS pass) { assert(*str == '='); @@ -179,9 +374,6 @@ WORD getliteral(const char *str, PASS pass) return adr; } -/** - * アドレス値をメモリに書き込む - */ void writememory(WORD word, WORD adr, PASS pass) { char *n; @@ -198,9 +390,6 @@ void writememory(WORD word, WORD adr, PASS pass) } } -/** - * 文字をメモリに書き込む - */ void writestr(const char *str, bool literal, PASS pass) { assert(*str == '\''); @@ -230,9 +419,6 @@ void writestr(const char *str, bool literal, PASS pass) } } -/** - * DC命令を書込 - */ void writedc(const char *str, PASS pass) { WORD adr = 0x0; @@ -251,10 +437,6 @@ void writedc(const char *str, PASS pass) } } -/** - * アセンブラ命令STARTの処理 - * \relates casl2cmd - */ void assemble_start(const CMDLINE *cmdl, PASS pass) { if(cmdl->opd->opdc > 1) { @@ -275,10 +457,6 @@ void assemble_start(const CMDLINE *cmdl, PASS pass) } } -/** - * アセンブラ命令ENDの処理 - * \relates casl2cmd - */ void assemble_end(const CMDLINE *cmdl, PASS pass) { if(cmdl->opd->opdc > 0) { @@ -296,10 +474,6 @@ void assemble_end(const CMDLINE *cmdl, PASS pass) *(asptr->prog) = '\0'; } -/** - * アセンブラ命令DSの処理 - * \relates casl2cmd - */ void assemble_ds(const CMDLINE *cmdl, PASS pass) { int i; @@ -315,10 +489,6 @@ void assemble_ds(const CMDLINE *cmdl, PASS pass) } } -/** - * アセンブラ命令DCの処理 - * \relates casl2cmd - */ void assemble_dc(const CMDLINE *cmdl, PASS pass) { int i; @@ -334,19 +504,6 @@ void assemble_dc(const CMDLINE *cmdl, PASS pass) } } -/** - * マクロ命令 "IN IBUF,LEN" をアセンブル\n - * \code - * PUSH 0,GR1 - * PUSH 0,GR2 - * LAD GR1,IBUF - * LAD GR2,LEN - * SVC 1 - * POP GR2 - * POP GR1 - * \endcode - * \relates casl2cmd - */ void assemble_in(const CMDLINE *cmdl, PASS pass) { char *line = malloc_chk(LINESIZE + 1, "assemble_in.line"); @@ -366,22 +523,6 @@ void assemble_in(const CMDLINE *cmdl, PASS pass) FREE(line); } -/** - * マクロ命令 "OUT OBUF,LEN" をアセンブル\n - * \code - * PUSH 0,GR1 - * PUSH 0,GR2 - * LAD GR1,OBUF - * LAD GR2,LEN - * SVC 2 - * LAD GR1,=#A - * LAD GR2,=1 - * SVC 2 - * POP GR2 - * POP GR1 - * \endcode - * \relates casl2cmd - */ void assemble_out(const CMDLINE *cmdl, PASS pass) { char *line = malloc_chk(LINESIZE + 1, "assemble_out.line"); @@ -404,19 +545,6 @@ void assemble_out(const CMDLINE *cmdl, PASS pass) FREE(line); } -/** - * マクロ命令 "RPUSH" をメモリに書き込む - * \code - * PUSH 0,GR1 - * PUSH 0,GR2 - * PUSH 0,GR3 - * PUSH 0,GR4 - * PUSH 0,GR5 - * PUSH 0,GR6 - * PUSH 0,GR7 - * \endcode - * \relates casl2cmd - */ void assemble_rpush(const CMDLINE *cmdl, PASS pass) { int i; @@ -432,20 +560,6 @@ void assemble_rpush(const CMDLINE *cmdl, PASS pass) FREE(line); } -/** - * マクロ命令 "RPOP" をメモリに書き込む\n - * \code - * POP GR7 - * POP GR6 - * POP GR5 - * POP GR4 - * POP GR3 - * POP GR3 - * POP GR2 - * POP GR1 - * \endcode - * \relates casl2cmd - */ void assemble_rpop(const CMDLINE *cmdl, PASS pass) { int i; @@ -461,13 +575,6 @@ void assemble_rpop(const CMDLINE *cmdl, PASS pass) FREE(line); } -/** - * アセンブラ言語CASL IIの命令を処理\n - * 命令が表で定義されている場合はtrue、それ以外の場合はfalseを返す\n - * エラー発生時は、cerrを設定\n - * 関数へのポインタで呼び出す関数は、Class Reference 参照 - * \class casl2cmd - */ bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass) { int i; @@ -482,10 +589,6 @@ bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass) return false; } -/** - * システムCOMET IIの命令をアセンブル\n - * アセンブルに成功した場合はtrue、失敗した場合はfalseを返す - */ bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass) { WORD cmd, r_r1, x_r2, adr; @@ -573,9 +676,6 @@ bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass) return (cerr->num == 0) ? true : false; } -/** - * トークンをアセンブル - */ bool assembletok(const CMDLINE *cmdl, PASS pass) { /* 命令がない場合 */ @@ -594,10 +694,6 @@ bool assembletok(const CMDLINE *cmdl, PASS pass) return (cerr->num == 0) ? true : false; } -/** - * 1行をアセンブル\n - * passが1の場合はラベルを登録し、2の場合はラベルからアドレスを読み込む - */ bool assembleline(const char *line, PASS pass) { CMDLINE *cmdl; @@ -629,7 +725,8 @@ bool assembleline(const char *line, PASS pass) } /** - * 指定された名前のファイルをアセンブル\n + * @brief 指定された名前のファイルをアセンブル + * * アセンブル完了時はtrue、エラー発生時はfalseを返す */ bool assemblefile(const char *file, PASS pass) @@ -660,9 +757,15 @@ bool assemblefile(const char *file, PASS pass) return (cerr->num == 0) ? true : false; } -/** - * 引数で指定したファイルにアセンブル結果を書込 - */ +/* assemble.hで定義された関数群 */ +void addcerrlist_assemble() +{ + addcerrlist_tok(); + addcerrlist_word(); + addcerrlist_label(); + addcerrlist(ARRAYSIZE(cerr_assemble), cerr_assemble); +} + void outassemble(const char *file) { FILE *fp; diff --git a/src/casl2.c b/src/casl2.c index 204d307..6a1d76f 100644 --- a/src/casl2.c +++ b/src/casl2.c @@ -11,7 +11,33 @@ #include "package.h" /** - * casl2コマンドのオプション + * @brief CASL IIのエラーをエラーリストに追加 + * + * @return なし + */ +void addcerrlist_casl2(); + +/** + * @brief アセンブル結果を書き込むファイルの名前 + * + * @return ファイル名 + * + * @param *str ファイル名 + */ +const char *objfile_name(const char *str); + +/** + * @brief 指定された1つまたは複数のファイルを2回アセンブル + * + * @return なし + * + * @param filec アセンブルするファイルの数 + * @param filev アセンブルするファイル名の配列 + */ +void assemble(int filec, char *filev[]); + +/** + * @brief casl2コマンドのオプション */ static struct option longopts[] = { { "source", no_argument, NULL, 's' }, @@ -33,32 +59,23 @@ static struct option longopts[] = { }; /** - * casl2のエラー定義 + * @brief casl2のエラー定義 */ CERR cerr_casl2[] = { { 126, "no source file" }, }; -/** - * CASL IIのエラーをエラーリストに追加 - */ void addcerrlist_casl2() { addcerrlist(ARRAYSIZE(cerr_casl2), cerr_casl2); } -/** - * アセンブル結果を書き込むファイルの名前 - */ const char *objfile_name(const char *str) { const char *default_name = "a.o"; return (str == NULL) ? default_name : str; } -/** - * 指定された1つまたは複数のファイルを2回アセンブル - */ void assemble(int filec, char *filev[]) { int i; @@ -104,7 +121,12 @@ asfin: } /** - * casl2コマンドのメイン + * @brief casl2コマンドのメイン + * + * @return 正常終了時は0、エラー発生時は1 + * + * @param argc コマンドライン引数の数 + * @param *argv[] コマンドライン引数の配列 */ int main(int argc, char *argv[]) { diff --git a/src/cerr.c b/src/cerr.c index 116312b..f1cb09c 100644 --- a/src/cerr.c +++ b/src/cerr.c @@ -5,50 +5,35 @@ #include #include "cerr.h" -/** - * エラーの初期化 - */ void cerr_init() { cerr = malloc_chk(sizeof(CERR), "cerr"); cerr->num = 0; } -/** - * 現在のエラー - */ CERR *cerr; -/** - * エラーリスト - */ CERRLIST *cerrlist = NULL; -/** - * エラーリストを作成または追加する - */ -void addcerrlist(int errc, CERR errv[]) +void addcerrlist(int cerrc, CERR cerrv[]) { int i; CERRLIST *p = NULL, *q = malloc_chk(sizeof(CERRLIST), "cerrlist"); - assert(errc > 0 && errv != NULL); - for(i = 0; i < errc; i++) { + assert(cerrc > 0 && cerrv != NULL); + for(i = 0; i < cerrc; i++) { if(p == NULL) { p = q; } else { p = p->next = malloc_chk(sizeof(CERRLIST), "cerrlist.next"); } - p->cerr = &errv[i]; + p->cerr = &cerrv[i]; p->next = NULL; } p->next = cerrlist; cerrlist = q; } -/** - * エラーリストを表示する - */ void printcerrlist() { CERRLIST *p; @@ -62,9 +47,6 @@ void printcerrlist() } } -/** - * 現在のエラーを設定する - */ void setcerr(int num, const char *str) { /* 現在のエラー番号を設定 */ @@ -78,9 +60,6 @@ void setcerr(int num, const char *str) } } -/** - * エラーリストから、エラー番号に対応するメッセージを返す - */ char *getcerrmsg(int num) { CERRLIST *p; @@ -95,9 +74,6 @@ char *getcerrmsg(int num) return msg; } -/** - * エラーリストと現在のエラーを解放する - */ void freecerr() { CERRLIST *p = cerrlist, *q; diff --git a/src/cmem.c b/src/cmem.c index 3085ea6..6c6ae12 100644 --- a/src/cmem.c +++ b/src/cmem.c @@ -5,10 +5,6 @@ #include #include "cmem.h" -/** - * mallocを実行し、0で初期化\n - * メモリを確保できない場合はエラーを出力して終了 - */ void *malloc_chk(size_t size, char *tag) { void *p; @@ -20,10 +16,6 @@ void *malloc_chk(size_t size, char *tag) return memset(p, 0, size); } -/** - * callocを実行\n - * メモリを確保できない場合はエラーを出力して終了 - */ void *calloc_chk(size_t nmemb, size_t size, char *tag) { void *p; @@ -35,9 +27,6 @@ void *calloc_chk(size_t nmemb, size_t size, char *tag) return p; } -/** - * malloc_chkを実行してメモリを確保し、コピーした文字列を返す - */ char *strdup_chk(const char *s, char *tag) { assert(s != NULL); diff --git a/src/comet2.c b/src/comet2.c index 36060d3..42ba4ba 100644 --- a/src/comet2.c +++ b/src/comet2.c @@ -24,7 +24,12 @@ static struct option longopts[] = { }; /** - * comet2コマンドのメイン + * @brief comet2コマンドのメイン + * + * @return 正常終了時は0、異常終了時は1 + * + * @param argc コマンドライン引数の数 + * @param *argv[] コマンドライン引数の配列 */ int main(int argc, char *argv[]) { @@ -80,7 +85,7 @@ int main(int argc, char *argv[]) } /* COMET II仮想マシンのシャットダウン */ shutdown(); - stat = (cerr->num == 0) ? 0 : -1; + stat = (cerr->num == 0) ? 0 : 1; /* エラーの解放 */ freecerr(); return stat; diff --git a/src/dump.c b/src/dump.c index ab418a8..70d4e2e 100644 --- a/src/dump.c +++ b/src/dump.c @@ -1,11 +1,6 @@ -#include - #include "exec.h" -#include "cmem.h" -/** - * COMET IIのメモリを表示する - */ +/* exec.hに定義された関数群 */ void dumpmemory() { const int col = 16; @@ -30,9 +25,6 @@ void dumpmemory() } } -/** - * COMET IIのレジスタを表示する - */ void dspregister() { int i; diff --git a/src/dumpword.c b/src/dumpword.c index d39dfaf..0c75337 100644 --- a/src/dumpword.c +++ b/src/dumpword.c @@ -7,7 +7,7 @@ #include "package.h" /** - * dumpwordコマンドのオプション + * @brief dumpwordコマンドのオプション */ static struct option longopts[] = { { "arithmetic", no_argument, NULL, 'a' }, @@ -18,7 +18,12 @@ static struct option longopts[] = { }; /** - * dumpwordコマンドのメイン + * @brief dumpwordコマンドのメイン + * + * @return 正常終了時は0、エラー発生時は1 + * + * @param argc コマンドライン引数の数 + * @param *argv[] コマンドライン引数の配列 */ int main(int argc, char *argv[]) { diff --git a/src/exec.c b/src/exec.c index c91fc86..c667598 100644 --- a/src/exec.c +++ b/src/exec.c @@ -6,7 +6,77 @@ #include "cerr.h" /** - * 実行エラーの定義 + * @brief プログラムレジスタ(PR)を表すWORD値を文字列に変換 + * + * @return 文字列「PR:XXXX」(Xは16進数の数字) + * + * @param pr プログラムレジスタ(PR)を表すWORD値 + */ +char *pr2str(WORD pr); + +/** + * @brief 標準入力から文字データを読込(SVC 1) + * + * @return なし + */ +void svcin(); + +/** + * @brief 標準出力へ文字データを書出(SVC 2) + * + * @return なし + */ +void svcout(); + +/** + * @brief ロード/論理積/論理和/排他的論理和のフラグ設定。OFは常に0 + * + * @return なし + * + * @param adr アドレス + */ +void setfr(WORD adr); + +/** + * @brief WORD値からr/r1を取得 + * + * @return r/r1を表すWORD値 + * + * @param oprx オペランドを表すWORD値 + */ +WORD get_r_r1(WORD oprx); + +/** + * @brief WORD値からx/r2を取得 + * + * @return x/r2を表すWORD値 + * + * @param oprx オペランドを表すWORD値 + */ +WORD get_x_r2(WORD oprx); + +/** + * @brief 2つのWORD値からadr[,x]を取得 + * + * @return adr[,x]を表すWORD値 + * + * @param adr アドレスを表すWORD値 + * @param oprx オペランドを表すWORD値 + */ +WORD get_adr_x(WORD adr, WORD oprx); + +/** + * @brief 2つのWORD値からadr[,x]のアドレスに格納されている値を取得 + * + * @return adr[,x]のアドレスに格納されている値を表すWORD値 + * + * @param adr アドレスを表すWORD値 + * @param oprx オペランドを表すWORD値 + */ +WORD get_val_adr_x(WORD adr, WORD oprx); + +/** + * @brief 実行エラーの定義 */ static CERR cerr_exec[] = { { 201, "Program Register (PR) - memory overflow" }, @@ -21,7 +91,7 @@ static CERR cerr_exec[] = { }; /** - * アセンブル結果読み込みエラーの定義 + * @brief アセンブル結果読み込みエラーの定義 */ static CERR cerr_load[] = { { 210, "load - memory overflow" }, @@ -29,62 +99,18 @@ static CERR cerr_load[] = { }; /** - * 実行モード: trace, logical, dump + * @brief 実行モード: trace, logical, dump */ EXECMODE execmode = {false, false, false}; -/** - * アセンブル結果読み込みエラーをエラーリストに追加 - */ -void addcerrlist_load() -{ - addcerrlist(ARRAYSIZE(cerr_load), cerr_load); -} - -/** - * 実行エラーをエラーリストに追加 - */ -void addcerrlist_exec() -{ - addcerrlist(ARRAYSIZE(cerr_exec), cerr_exec); -} -/** - * 指定されたファイルからアセンブル結果を読み込む - */ -bool loadassemble(const char *file) +char *pr2str(WORD pr) { - FILE *fp; - bool stat = true; - - assert(file != NULL); - if((fp = fopen(file, "r")) == NULL) { - perror(file); - return false; - } - execptr->end = execptr->start + - fread(sys->memory, sizeof(WORD), sys->memsize - execptr->start, fp); - if(execptr->end == sys->memsize) { - setcerr(210, file); /* load - memory overflow */ - fprintf(stderr, "Load error - %d: %s\n", cerr->num, cerr->msg); - stat = false; - } - fclose(fp); - return stat; -} - -/** - * プログラムレジスタ(PR)を表す文字列を返す - */ -char *pr2str(WORD pr) { char *str = malloc_chk(CERRSTRSIZE + 1, "pr2str.pr"); sprintf(str, "PR:#%04X", pr); return str; } -/** - * 標準入力から文字データを読込(SVC 1) - */ void svcin() { int i; @@ -109,9 +135,6 @@ void svcin() FREE(buffer); } -/** - * 標準出力へ文字データを書出(SVC 2) - */ void svcout() { int i; @@ -136,9 +159,6 @@ void svcout() } } -/** - * ロード/論理積/論理和/排他的論理和のフラグ設定。OFは常に0 - */ void setfr(WORD adr) { sys->cpu->fr = 0x0; @@ -152,9 +172,6 @@ void setfr(WORD adr) } } -/** - * WORD値からr/r1を取得 - */ WORD get_r_r1(WORD oprx) { WORD r; @@ -168,9 +185,6 @@ WORD get_r_r1(WORD oprx) return r; } -/** - * WORD値からx/r2を取得 - */ WORD get_x_r2(WORD oprx) { WORD x; @@ -184,9 +198,6 @@ WORD get_x_r2(WORD oprx) return x; } -/** - * 2つのWORD値からadr[,x]を取得 - */ WORD get_adr_x(WORD adr, WORD oprx) { WORD a = adr, x; @@ -196,10 +207,6 @@ WORD get_adr_x(WORD adr, WORD oprx) return a; } - -/** - * 2つのWORD値からadr[,x]のアドレスに格納されている内容を取得 - */ WORD get_val_adr_x(WORD adr, WORD oprx) { WORD a; @@ -213,19 +220,43 @@ WORD get_val_adr_x(WORD adr, WORD oprx) return sys->memory[a]; } -/** - * NOP命令。語長1(OPのみ) - * \relates exec - */ +/* exec.hで定義された関数群 */ +void addcerrlist_load() +{ + addcerrlist(ARRAYSIZE(cerr_load), cerr_load); +} + +void addcerrlist_exec() +{ + addcerrlist(ARRAYSIZE(cerr_exec), cerr_exec); +} + +bool loadassemble(const char *file) +{ + FILE *fp; + bool stat = true; + + assert(file != NULL); + if((fp = fopen(file, "r")) == NULL) { + perror(file); + return false; + } + execptr->end = execptr->start + + fread(sys->memory, sizeof(WORD), sys->memsize - execptr->start, fp); + if(execptr->end == sys->memsize) { + setcerr(210, file); /* load - memory overflow */ + fprintf(stderr, "Load error - %d: %s\n", cerr->num, cerr->msg); + stat = false; + } + fclose(fp); + return stat; +} + void nop() { sys->cpu->pr += 1; } -/** - * LD命令 - オペランドr,adr,x。語長2 - * \relates exec - */ void ld_r_adr_x() { WORD w[2]; @@ -235,10 +266,6 @@ void ld_r_adr_x() sys->cpu->pr += 2; } -/** - * LD命令 - オペランドr1,r2。語長1 - * \relates exec - */ void ld_r1_r2() { WORD w[1]; @@ -247,10 +274,6 @@ void ld_r1_r2() sys->cpu->pr += 1; } -/** - * ST命令。語長2 - * \relates exec - */ void st() { WORD w[2]; @@ -260,10 +283,6 @@ void st() sys->cpu->pr += 2; } -/** - * LAD命令。語長2 - * \relates exec - */ void lad() { WORD w[2]; @@ -273,10 +292,6 @@ void lad() sys->cpu->pr += 2; } -/** - * ADDA命令のテンプレート\n - * 汎用レジスタrに値valを算術加算 - */ void adda(WORD r, WORD val) { long tmp; @@ -296,10 +311,6 @@ void adda(WORD r, WORD val) } } -/** - * ADDA命令 - オペランドr,adr,x。語長2 - * \relates exec - */ void adda_r_adr_x() { WORD w[2]; @@ -309,10 +320,6 @@ void adda_r_adr_x() sys->cpu->pr += 2; } -/** - * ADDA命令 - オペランドr1,r2。語長1 - * \relates exec - */ void adda_r1_r2() { WORD w[1]; @@ -321,10 +328,6 @@ void adda_r1_r2() sys->cpu->pr += 1; } -/** - * SUBA命令 - オペランドr,adr,x。語長2 - * \relates exec - */ void suba_r_adr_x() { WORD w[2]; @@ -334,10 +337,6 @@ void suba_r_adr_x() sys->cpu->pr += 2; } -/** - * SUBA命令 - オペランドr1,r2。語長1 - * \relates exec - */ void suba_r1_r2() { WORD w[1]; @@ -346,10 +345,6 @@ void suba_r1_r2() sys->cpu->pr += 1; } -/** - * ADDL命令のテンプレート\n - * 汎用レジスタrに値valを論理加算 - */ void addl(WORD r, WORD val) { long tmp; @@ -365,10 +360,6 @@ void addl(WORD r, WORD val) } } -/** - * ADDL命令 - オペランドr,adr,x。語長2 - * \relates exec - */ void addl_r_adr_x() { WORD w[2]; @@ -378,10 +369,6 @@ void addl_r_adr_x() sys->cpu->pr += 2; } -/** - * ADDL命令 - オペランドr1,r2。語長1 - * \relates exec - */ void addl_r1_r2() { WORD w[1]; @@ -390,10 +377,6 @@ void addl_r1_r2() sys->cpu->pr += 1; } -/** - * SUBL命令 - オペランドr,adr,x。語長2 - * \relates exec - */ void subl_r_adr_x() { WORD w[2]; @@ -403,11 +386,6 @@ void subl_r_adr_x() sys->cpu->pr += 2; } - -/** - * SUBL命令 - オペランドr1,r2。語長1 - * \relates exec - */ void subl_r1_r2() { WORD w[1]; @@ -416,10 +394,6 @@ void subl_r1_r2() sys->cpu->pr += 1; } -/** - * AND命令 - オペランドr,adr,x。語長2 - * \relates exec - */ void and_r_adr_x() { WORD w[2]; @@ -429,10 +403,6 @@ void and_r_adr_x() sys->cpu->pr += 2; } -/** - * AND命令 - オペランドr1,r2。語長1 - * \relates exec - */ void and_r1_r2() { WORD w[1]; @@ -441,10 +411,6 @@ void and_r1_r2() sys->cpu->pr += 1; } -/** - * OR命令 - オペランドr,adr,x。語長2 - * \relates exec - */ void or_r_adr_x() { WORD w[2]; @@ -454,10 +420,6 @@ void or_r_adr_x() sys->cpu->pr += 2; } -/** - * OR命令 - オペランドr1,r2。語長1 - * \relates exec - */ void or_r1_r2() { WORD w[1]; @@ -466,10 +428,6 @@ void or_r1_r2() sys->cpu->pr += 1; } -/** - * XOR命令 - オペランドr,adr,x。語長2 - * \relates exec - */ void xor_r_adr_x() { WORD w[2]; @@ -479,10 +437,6 @@ void xor_r_adr_x() sys->cpu->pr += 2; } -/** - * XOR命令 - オペランドr1,r2。語長1 - * \relates exec - */ void xor_r1_r2() { WORD w[1]; @@ -491,10 +445,6 @@ void xor_r1_r2() sys->cpu->pr += 1; } -/** - * CPA命令のテンプレート\n - * 汎用レジスタrの内容と値valを算術比較 - */ void cpa(WORD r, WORD val) { sys->cpu->fr = 0x0; @@ -505,10 +455,6 @@ void cpa(WORD r, WORD val) } } -/** - * CPA命令 - オペランドr,adr,x。語長2 - * \relates exec - */ void cpa_r_adr_x() { WORD w[2]; @@ -518,10 +464,6 @@ void cpa_r_adr_x() sys->cpu->pr += 2; } -/** - * CPA命令 - オペランドr1,r2。語長1 - * \relates exec - */ void cpa_r1_r2() { WORD w[1]; @@ -530,10 +472,6 @@ void cpa_r1_r2() sys->cpu->pr += 1; } -/** - * CPL命令のテンプレート\n - * 汎用レジスタrの内容と値valを論理比較 - */ void cpl(WORD r, WORD val) { sys->cpu->fr = 0x0; @@ -544,11 +482,6 @@ void cpl(WORD r, WORD val) } } - -/** - * CPL命令 - オペランドr,adr,x。語長2 - * \relates exec - */ void cpl_r_adr_x() { WORD w[2]; @@ -558,10 +491,6 @@ void cpl_r_adr_x() sys->cpu->pr += 2; } -/** - * CPL命令 - オペランドr1,r2。語長1 - * \relates exec - */ void cpl_r1_r2() { WORD w[1]; @@ -570,11 +499,6 @@ void cpl_r1_r2() sys->cpu->pr += 1; } -/** - * SLA命令 - オペランドr,adr,x。語長2\n - * 算術演算なので、第15ビットは送り出されない - * \relates exec - */ void sla() { WORD w[2], sign, last = 0x0, r; @@ -605,12 +529,6 @@ void sla() sys->cpu->pr += 2; } -/** - * SRA命令 - オペランドr,adr,x。語長2\n - * 算術演算なので、第15ビットは送り出されない\n - * 空いたビット位置には符号と同じものが入る - * \relates exec - */ void sra() { WORD w[2], sign, last = 0x0, r; @@ -644,10 +562,6 @@ void sra() sys->cpu->pr += 2; } -/** - * SLL命令 - オペランドr,adr,x。語長2 - * \relates exec - */ void sll() { WORD w[2], last = 0x0, r; @@ -675,10 +589,6 @@ void sll() sys->cpu->pr += 2; } -/** - * SRL命令 - オペランドr,adr,x。語長2 - * \relates exec - */ void srl() { WORD w[2], last = 0x0, r; @@ -707,10 +617,6 @@ void srl() sys->cpu->pr += 2; } -/** - * JPL命令。語長2 - * \relates exec - */ void jpl() { WORD w[2]; @@ -723,10 +629,6 @@ void jpl() } } -/** - * JMI命令。語長2 - * \relates exec - */ void jmi() { WORD w[2]; @@ -739,10 +641,6 @@ void jmi() } } -/** - * JNZ命令。語長2 - * \relates exec - */ void jnz() { WORD w[2]; @@ -755,10 +653,6 @@ void jnz() } } -/** - * JZE命令。語長2 - * \relates exec - */ void jze() { WORD w[2]; @@ -771,10 +665,6 @@ void jze() } } -/** - * JOV命令。語長2 - * \relates exec - */ void jov() { WORD w[2]; @@ -787,10 +677,6 @@ void jov() } } -/** - * JUMP命令。語長2 - * \relates exec - */ void jump() { WORD w[2]; @@ -799,10 +685,6 @@ void jump() sys->cpu->pr = get_adr_x(w[1], w[0]); } -/** - * PUSH命令。語長2 - * \relates exec - */ void push() { assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); @@ -814,10 +696,6 @@ void push() sys->cpu->pr += 2; } -/** - * POP命令。語長1 - * \relates exec - */ void pop() { assert(sys->cpu->sp > execptr->end); @@ -834,10 +712,6 @@ void pop() } } -/** - * CALL命令。語長2 - * \relates exec - */ void call() { assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); @@ -848,10 +722,6 @@ void call() sys->cpu->pr = get_adr_x(w[1], w[0]); } -/** - * RET命令。語長1(OPのみ) - * \relates exec - */ void ret() { assert(sys->cpu->sp <= sys->memsize); @@ -862,10 +732,6 @@ void ret() } } -/** - * SVC命令。語長2 - * \relates exec - */ void svc() { WORD w[2]; @@ -886,10 +752,6 @@ void svc() sys->cpu->pr += 2; } -/** - * 仮想マシンCOMET IIの実行 - * \class exec - */ void exec() { clock_t clock_begin, clock_end; diff --git a/src/hash.c b/src/hash.c index 3da13dc..6436047 100644 --- a/src/hash.c +++ b/src/hash.c @@ -1,8 +1,5 @@ #include "hash.h" -/** - * ハッシュ値を取得する - */ unsigned hash(int keyc, HKEY *keyv[], int tabsize) { int i; diff --git a/src/label.c b/src/label.c index c482cce..71285a0 100644 --- a/src/label.c +++ b/src/label.c @@ -8,29 +8,45 @@ #include "hash.h" #include "assemble.h" -static int labelcnt = 0; /* ラベル数 */ -static LABELTAB *labels[LABELTABSIZE]; /* ラベル表 */ +/** + * プログラム名とラベルに対応するハッシュ値を返す + * + * @return ハッシュ値 + * + * @param prog プログラム名 + * @param label ラベル + */ +unsigned labelhash(const char *prog, const char *label); /** - * ラベルのエラー定義 + * ラベルを比較した結果を返す。qsort内で使われる関数 + * + * @return ラベルが同一の場合は0、異なる場合は0以外 + * + * @param *a ラベルa + * @param *b ラベルb */ -static CERR cerr_label[] = { - { 101, "label already defined" }, - { 102, "label table is full" }, - { 103, "label not found" }, -}; +int compare_adr(const void *a, const void *b); /** - * ラベルのエラーをエラーリストに追加 + * @brief ラベル数 */ -void addcerrlist_label() -{ - addcerrlist(ARRAYSIZE(cerr_label), cerr_label); -} +static int labelcnt = 0; /** - * プログラム名とラベルに対応するハッシュ値を返す + * @brief ラベル表 + */ +static LABELTAB *labels[LABELTABSIZE]; + +/** + * @brief ラベルのエラー */ +static CERR cerr_label[] = { + { 101, "label already defined" }, + { 102, "label table is full" }, + { 103, "label not found" }, +}; + unsigned labelhash(const char *prog, const char *label) { HKEY *keys[2]; @@ -54,9 +70,17 @@ unsigned labelhash(const char *prog, const char *label) return h; } -/** - * プログラム名とラベルに対応するアドレスをラベル表から検索する - */ +int compare_adr(const void *a, const void *b) +{ + return (**(LABELARRAY **)a).adr - (**(LABELARRAY **)b).adr; +} + +/* assemble.hで定義された関数群 */ +void addcerrlist_label() +{ + addcerrlist(ARRAYSIZE(cerr_label), cerr_label); +} + WORD getlabel(const char *prog, const char *label) { assert(prog != NULL && label != NULL); @@ -72,9 +96,6 @@ WORD getlabel(const char *prog, const char *label) return 0xFFFF; } -/** - * プログラム名、ラベル、アドレスをラベル表に追加する - */ bool addlabel(const char *prog, const char *label, WORD adr) { assert(label != NULL); @@ -103,17 +124,6 @@ bool addlabel(const char *prog, const char *label, WORD adr) return true; } -/** - * ラベルを比較した結果を返す - */ -int compare_adr(const void *a, const void *b) -{ - return (**(LABELARRAY **)a).adr - (**(LABELARRAY **)b).adr; -} - -/** - * ラベル表を表示する - */ void printlabel() { int i, s = 0; @@ -143,9 +153,6 @@ void printlabel() FREE(l); } -/** - * ラベル表を解放する - */ void freelabel() { int i; diff --git a/src/token.c b/src/token.c index 713a61f..d1e3eb3 100644 --- a/src/token.c +++ b/src/token.c @@ -4,9 +4,17 @@ #include "cmem.h" #include "assemble.h" +/** + * @brief 「,」区切りの文字列から、オペランドのトークンを取得 + * + * @return オペランドのトークン + * + * @param *str 「,」区切りの文字列 + */ +OPD *opdtok(const char *str); /** - * 行トークン取得のエラー定義 + * @brief 行トークン取得のエラー定義 */ CERR cerr_linetok[] = { { 104, "label length is too long" }, @@ -14,7 +22,7 @@ CERR cerr_linetok[] = { }; /** - * オペランドトークン取得のエラー定義 + * @brief オペランドトークン取得のエラー定義 */ static CERR cerr_opdtok[] = { { 117, "operand too many in DC" }, @@ -23,18 +31,6 @@ static CERR cerr_opdtok[] = { { 123, "unclosed quote" }, }; -/** - * オペランドトークン取得のエラーを追加 - */ -void addcerrlist_tok() -{ - addcerrlist(ARRAYSIZE(cerr_linetok), cerr_linetok); - addcerrlist(ARRAYSIZE(cerr_opdtok), cerr_opdtok); -} - -/** - * 「,」区切りの文字列から、オペランドのトークンを取得 - */ OPD *opdtok(const char *str) { OPD *opd = malloc_chk(sizeof(OPD), "opd"); @@ -96,9 +92,13 @@ OPD *opdtok(const char *str) return opd; } -/** - * 空白またはタブで区切られた1行から、トークンを取得する - */ +/* assemble.hで定義された関数群 */ +void addcerrlist_tok() +{ + addcerrlist(ARRAYSIZE(cerr_linetok), cerr_linetok); + addcerrlist(ARRAYSIZE(cerr_opdtok), cerr_opdtok); +} + CMDLINE *linetok(const char *line) { char *tokens, *p, *sepp; diff --git a/src/word.c b/src/word.c index 34a3946..6f43dc1 100644 --- a/src/word.c +++ b/src/word.c @@ -8,25 +8,32 @@ #include "cerr.h" /** - * wordのエラー定義 + * @brief 10進数値を表す文字列をWORD値に変換する + * + * @return WORD値 + * + * @param *str 10進数値を表す文字列 */ -static CERR cerr_word[] = { - { 114, "not integer" }, - { 115, "not hex" }, - { 116, "out of hex range" }, -}; +WORD n2word(const char *str); /** - * wordのエラーをエラーリストに追加 + * @brief 16進数の文字列をWORD値に変換する + * + * @return WORD値 + * + * @param *str 16進数値を表す文字列 */ -void addcerrlist_word() -{ - addcerrlist(ARRAYSIZE(cerr_word), cerr_word); -} +WORD h2word(const char *str); /** - * 10進数の文字列をWORD値に変換 + * @brief wordのエラー定義 */ +static CERR cerr_word[] = { + { 114, "not integer" }, + { 115, "not hex" }, + { 116, "out of hex range" }, +}; + WORD n2word(const char *str) { assert(isdigit(*str) || *str == '-'); @@ -46,9 +53,6 @@ WORD n2word(const char *str) return (WORD)n; } -/** - * 16進数の文字列をWORD値に変換 - */ WORD h2word(const char *str) { assert(*str == '#'); @@ -69,9 +73,12 @@ WORD h2word(const char *str) return w; } -/** - * 10進数または16進数の文字列をWORD値に変換 - */ +/* word.hで定義された関数群 */ +void addcerrlist_word() +{ + addcerrlist(ARRAYSIZE(cerr_word), cerr_word); +} + WORD nh2word(const char *str) { WORD w; @@ -89,9 +96,6 @@ WORD nh2word(const char *str) return w; } -/** - * WORD値を10進数の文字列に変換 - */ char *word2n(WORD word) { enum { @@ -111,9 +115,6 @@ char *word2n(WORD word) return digit; } -/** - * WORD値を2進数の文字列に変換 - */ char *word2bit(const WORD word) { enum { @@ -130,9 +131,6 @@ char *word2bit(const WORD word) return bit; } -/** - * WORD値を解析して表示 - */ void print_dumpword(WORD word, bool logicalmode) { char *b; -- 2.18.0