#include "word.h"
/**
- * CASL IIの仕様
+ * @brief CASL IIの仕様
*/
enum {
LABELSIZE = 8, /**<ラベルの最大文字数 */
};
/**
- * YACASL2の制限
+ * @brief YACASL2の制限
*/
enum {
LINESIZE = 1024, /**<行の最大文字数 */
};
/**
- * アセンブルモード
+ * @brief アセンブルモードを表すデータ型
*/
typedef struct {
bool src; /**<ソースを表示する場合はtrue */
bool onlyassemble; /**<アセンブルだけを行う場合はtrue */
} ASMODE;
+/**
+ * @brief アセンブルモード: src, label, onlylabel, asdetail, onlyassemble
+ */
extern ASMODE asmode;
/**
- * アセンブル時の、現在およびリテラルのアドレスとプログラム入口名
+ * @brief アセンブル時の現在およびリテラルのアドレスとプログラム入口名を表すデータ型
*/
typedef struct {
WORD ptr; /**<現在のアドレス */
char *prog; /**<他のプログラムで参照する入口名 */
} ASPTR;
+/**
+ * @brief アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog
+ */
extern ASPTR *asptr;
/**
- * ラベル配列
+ * @brief ラベル配列を表すデータ型
*/
typedef struct {
char *prog; /**<プログラム */
} LABELARRAY;
/**
- * ラベル表
+ * @brief ラベル表を表すデータ型
*/
typedef struct _LABELTAB {
struct _LABELTAB *next; /**<リスト次項目へのポインタ */
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; /**<オペランド数 */
} OPD;
/**
- * 命令行
+ * @brief 命令行を表すデータ型
*/
typedef struct {
char *label; /**<ラベル */
} 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);
#include "cmem.h"
/**
- * エラーの構造体
+ * @brief エラーを表すデータ型
*/
typedef struct _CERR {
int num; /**<エラー番号 */
} CERR;
/**
- * 現在のエラー
+ * @brief 現在のエラー
*/
extern CERR *cerr;
/**
- * エラーリスト型
+ * @brief エラーリストのデータ型
*/
typedef struct _CERRLIST {
struct _CERRLIST *next; /**<リスト次項目へのポインタ */
} CERRLIST;
/**
- * エラーリスト
+ * @brief エラーリスト
*/
extern CERRLIST *cerrlist;
};
/**
- * エラーの初期化
+ * @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
#define YACASL2_CMEM_H_INCLUDED
#include <stdlib.h>
-/*
- * 配列のサイズを返す
+/**
+ * @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);
#define YACASL2_EXEC_INCLUDED
#include <stdbool.h>
+#include <stdio.h>
#include "struct.h"
#include "word.h"
+#include "cmem.h"
enum {
INSIZE = 256 /**<IN命令の、入力領域 */
};
/**
- * 実行モード型
+ * @brief 実行モードを表すデータ型
*/
typedef struct {
bool trace; /**<レジストリの内容を表示する場合はtrue */
} EXECMODE;
/**
- * 実行モード: trace, logical, dump
+ * @brief 実行モード: trace, logical, dump
*/
extern EXECMODE execmode;
/**
- * 実行エラーをエラーリストに追加
+ * @brief 実行エラーをエラーリストに追加する
*/
void addcerrlist_exec();
/**
- * アセンブル結果読み込みエラーをエラーリストに追加
+ * @brief アセンブル結果読み込みエラーをエラーリストに追加する
*/
void addcerrlist_load();
/**
- * 指定されたファイルからアセンブル結果を読み込む
+ * @brief 指定されたファイルからアセンブル結果を読み込む
*/
bool loadassemble(const char *file);
+
+/**
+ * @class Exec
+ * @brief execから関数ポインタで呼び出される関数
+ * @relatesalso exec
+ **/
+
/**
- * COMET II仮想マシンのリセット
+ * @brief COMET II仮想マシンを実行する
+ *
+ * @relatesalso Exec
+ *
+ * @return なし
*/
-void reset();
+void exec();
/**
- * NOP命令。語長1(OPのみ)
+ * @brief NOP命令。語長1(OPのみ)
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void nop();
/**
- * LD命令 - オペランドr,adr,x。語長2
+ * @brief LD命令 - オペランドr,adr,x。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void ld_r_adr_x();
/**
- * LD命令 - オペランドr1,r2。語長1
+ * @brief LD命令 - オペランドr1,r2。語長1
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void ld_r1_r2();
/**
- * ST命令。語長2
+ * @brief ST命令。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void st();
/**
- * LAD命令。語長2
+ * @brief LAD命令。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void lad();
/**
- * ADDA命令 - オペランドr,adr,x。語長2
+ * @brief ADDA命令 - オペランドr,adr,x。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void adda_r_adr_x();
/**
- * ADDA命令 - オペランドr1,r2。語長1
+ * @brief ADDA命令 - オペランドr1,r2。語長1
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void adda_r1_r2();
/**
- * SUBA命令 - オペランドr,adr,x。語長2
+ * @brief SUBA命令 - オペランドr,adr,x。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void suba_r_adr_x();
/**
- * SUBA命令 - オペランドr1,r2。語長1
+ * @brief SUBA命令 - オペランドr1,r2。語長1
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void suba_r1_r2();
/**
- * ADDL命令 - オペランドr,adr,x。語長2
+ * @brief ADDL命令 - オペランドr,adr,x。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void addl_r_adr_x();
/**
- * ADDL命令 - オペランドr1,r2。語長1
+ * @brief ADDL命令 - オペランドr1,r2。語長1
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void addl_r1_r2();
/**
- * SUBL命令 - オペランドr,adr,x。語長2
+ * @brief SUBL命令 - オペランドr,adr,x。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void subl_r_adr_x();
/**
- * SUBL命令 - オペランドr1,r2。語長1
+ * @brief SUBL命令 - オペランドr1,r2。語長1
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void subl_r1_r2();
/**
- * AND命令 - オペランドr,adr,x。語長2
+ * @brief AND命令 - オペランドr,adr,x。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void and_r_adr_x();
/**
- * AND命令 - オペランドr1,r2。語長1
+ * @brief AND命令 - オペランドr1,r2。語長1
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void and_r1_r2();
/**
- * OR命令 - オペランドr,adr,x。語長2
+ * @brief OR命令 - オペランドr,adr,x。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void or_r_adr_x();
/**
- * OR命令 - オペランドr1,r2。語長1
+ * @brief OR命令 - オペランドr1,r2。語長1
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void or_r1_r2();
/**
- * XOR命令 - オペランドr,adr,x。語長2
+ * @brief XOR命令 - オペランドr,adr,x。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void xor_r_adr_x();
/**
- * XOR命令 - オペランドr1,r2。語長1
+ * @brief XOR命令 - オペランドr1,r2。語長1
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void xor_r1_r2();
/**
- * CPA命令 - オペランドr,adr,x。語長2
+ * @brief CPA命令 - オペランドr,adr,x。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void cpa_r_adr_x();
/**
- * CPA命令 - オペランドr1,r2。語長1
+ * @brief CPA命令 - オペランドr1,r2。語長1
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void cpa_r1_r2();
/**
- * CPL命令 - オペランドr,adr,x。語長2
+ * @brief CPL命令 - オペランドr,adr,x。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void cpl_r_adr_x();
/**
- * CPL命令 - オペランドr1,r2。語長1
+ * @brief CPL命令 - オペランドr1,r2。語長1
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void cpl_r1_r2();
/**
- * SLA命令 - オペランドr,adr,x。語長2
+ * @brief SLA命令 - オペランドr,adr,x。語長2
+ *
* 算術演算なので、第15ビットは送り出されない
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void sla();
/**
- * SRA命令 - オペランドr,adr,x。語長2
+ * @brief SRA命令 - オペランドr,adr,x。語長2
+ *
* 算術演算なので、第15ビットは送り出されない
* 空いたビット位置には符号と同じものが入る
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void sra();
/**
- * SLL命令 - オペランドr,adr,x。語長2
+ * @brief SLL命令 - オペランドr,adr,x。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void sll();
/**
- * SRL命令 - オペランドr,adr,x。語長2
+ * @brief SRL命令 - オペランドr,adr,x。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void srl();
/**
- * JPL命令。語長2
+ * @brief JPL命令。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void jpl();
/**
- * JMI命令。語長2
+ * @brief JMI命令。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void jmi();
/**
- * JNZ命令。語長2
+ * @brief JNZ命令。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void jnz();
/**
- * JZE命令。語長2
+ * @brief JZE命令。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void jze();
/**
- * JOV命令。語長2
+ * @brief JOV命令。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void jov();
/**
- * JUMP命令。語長2
+ * @brief JUMP命令。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void jump();
/**
- * PUSH命令。語長2
+ * @brief PUSH命令。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void push();
/**
- * POP命令。語長1
+ * @brief POP命令。語長1
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void pop();
/**
- * CALL命令。語長2
+ * @brief CALL命令。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void call();
/**
- * RET命令。語長1(OPのみ)
+ * @brief RET命令。語長1(OPのみ)
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void ret();
/**
- * SVC命令。語長2
+ * @brief SVC命令。語長2
+ * @relatesalso Exec
+ *
+ * @return なし
*/
void svc();
/**
- * COMET II仮想マシンの実行\n
- * 関数へのポインタで呼び出す関数は、Class Reference 参照
- */
-void exec();
-
-/**
- * COMET IIのメモリを表示
+ * @brief COMET IIのメモリを表示する
+ *
+ * @return なし
*/
void dumpmemory();
/**
- * COMET IIのレジスタを表示
+ * @brief COMET IIのレジスタを表示する
+ *
+ * @return なし
*/
void dspregister();
#define YACASL2_HASH_INCLUDED
/**
- * ハッシュ共用体の型
+ * @brief ハッシュ共用体の数値
*/
typedef enum {
- CHARS = 0,
- INT = 1,
+ CHARS = 0, /**<char型のデータ */
+ INT = 1, /**<int型のデータ */
} UTYPE;
/**
- * ハッシュ共用体
+ * @brief ハッシュ共用体のデータ型
*/
typedef struct {
UTYPE type; /**<ハッシュ値の元データのデータ型 */
} HKEY;
/**
- * ハッシュ値を取得する
+ * @brief ハッシュ値を取得する
+ *
+ * @return ハッシュ値
+ *
+ * @param keyc キーの数
+ * @param *keyv[] キーを表す配列
+ * @param tabsize テーブルのサイズ
*/
unsigned hash(int keyc, HKEY *keyv[], int tabsize);
#include "word.h"
/**
- * COMET IIの規格
+ * @brief COMET IIの規格値
*/
enum {
CMDSIZE = 4, /**<命令の最大文字数 */
};
/**
- * COMET II フラグのマスク値
+ * @brief COMET II フラグのマスク値
*/
enum {
OF = 0x4, /**<Overflow Flag */
};
/**
- * COMET IIのCPU
+ * @brief COMET IIのCPUを表すデータ型
*/
typedef struct {
WORD gr[GRSIZE]; /**<汎用レジスタ */
} CPU;
/**
- * COMET IIの仮想実行マシンシステム
+ * @brief COMET IIの仮想実行マシンシステムを表すデータ型
*/
typedef struct {
CPU *cpu; /**<CPU */
clock_t clocks; /**<クロック周波数 */
} SYSTEM;
+/**
+ * @brief COMET IIの仮想実行マシンシステム
+ */
extern SYSTEM *sys;
/**
#include <stdbool.h>
-/* 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);
#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 },
};
/**
- * マクロ命令
+ * @brief マクロ命令
*/
static CMD macrocmd[] = {
{ "OUT", assemble_out },
{ "", 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;
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;
return r;
}
-/**
- * 定数の前に等号(=)をつけて記述されるリテラルを返す\n
- * リテラルには、10進定数/16進定数/文字定数が含まれる
- */
WORD getliteral(const char *str, PASS pass)
{
assert(*str == '=');
return adr;
}
-/**
- * アドレス値をメモリに書き込む
- */
void writememory(WORD word, WORD adr, PASS pass)
{
char *n;
}
}
-/**
- * 文字をメモリに書き込む
- */
void writestr(const char *str, bool literal, PASS pass)
{
assert(*str == '\'');
}
}
-/**
- * DC命令を書込
- */
void writedc(const char *str, PASS pass)
{
WORD adr = 0x0;
}
}
-/**
- * アセンブラ命令STARTの処理
- * \relates casl2cmd
- */
void assemble_start(const CMDLINE *cmdl, PASS pass)
{
if(cmdl->opd->opdc > 1) {
}
}
-/**
- * アセンブラ命令ENDの処理
- * \relates casl2cmd
- */
void assemble_end(const CMDLINE *cmdl, PASS pass)
{
if(cmdl->opd->opdc > 0) {
*(asptr->prog) = '\0';
}
-/**
- * アセンブラ命令DSの処理
- * \relates casl2cmd
- */
void assemble_ds(const CMDLINE *cmdl, PASS pass)
{
int i;
}
}
-/**
- * アセンブラ命令DCの処理
- * \relates casl2cmd
- */
void assemble_dc(const CMDLINE *cmdl, PASS pass)
{
int i;
}
}
-/**
- * マクロ命令 "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");
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");
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;
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;
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;
return false;
}
-/**
- * システムCOMET IIの命令をアセンブル\n
- * アセンブルに成功した場合はtrue、失敗した場合はfalseを返す
- */
bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass)
{
WORD cmd, r_r1, x_r2, adr;
return (cerr->num == 0) ? true : false;
}
-/**
- * トークンをアセンブル
- */
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;
}
/**
- * 指定された名前のファイルをアセンブル\n
+ * @brief 指定された名前のファイルをアセンブル
+ *
* アセンブル完了時はtrue、エラー発生時はfalseを返す
*/
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;
#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' },
};
/**
- * 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;
}
/**
- * casl2コマンドのメイン
+ * @brief casl2コマンドのメイン
+ *
+ * @return 正常終了時は0、エラー発生時は1
+ *
+ * @param argc コマンドライン引数の数
+ * @param *argv[] コマンドライン引数の配列
*/
int main(int argc, char *argv[])
{
#include <stdbool.h>
#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;
}
}
-/**
- * 現在のエラーを設定する
- */
void setcerr(int num, const char *str)
{
/* 現在のエラー番号を設定 */
}
}
-/**
- * エラーリストから、エラー番号に対応するメッセージを返す
- */
char *getcerrmsg(int num)
{
CERRLIST *p;
return msg;
}
-/**
- * エラーリストと現在のエラーを解放する
- */
void freecerr()
{
CERRLIST *p = cerrlist, *q;
#include <stdbool.h>
#include "cmem.h"
-/**
- * mallocを実行し、0で初期化\n
- * メモリを確保できない場合はエラーを出力して終了
- */
void *malloc_chk(size_t size, char *tag)
{
void *p;
return memset(p, 0, size);
}
-/**
- * callocを実行\n
- * メモリを確保できない場合はエラーを出力して終了
- */
void *calloc_chk(size_t nmemb, size_t size, char *tag)
{
void *p;
return p;
}
-/**
- * malloc_chkを実行してメモリを確保し、コピーした文字列を返す
- */
char *strdup_chk(const char *s, char *tag)
{
assert(s != NULL);
};
/**
- * comet2コマンドのメイン
+ * @brief comet2コマンドのメイン
+ *
+ * @return 正常終了時は0、異常終了時は1
+ *
+ * @param argc コマンドライン引数の数
+ * @param *argv[] コマンドライン引数の配列
*/
int main(int argc, char *argv[])
{
}
/* COMET II仮想マシンのシャットダウン */
shutdown();
- stat = (cerr->num == 0) ? 0 : -1;
+ stat = (cerr->num == 0) ? 0 : 1;
/* エラーの解放 */
freecerr();
return stat;
-#include <stdio.h>
-
#include "exec.h"
-#include "cmem.h"
-/**
- * COMET IIのメモリを表示する
- */
+/* exec.hに定義された関数群 */
void dumpmemory()
{
const int col = 16;
}
}
-/**
- * COMET IIのレジスタを表示する
- */
void dspregister()
{
int i;
#include "package.h"
/**
- * dumpwordコマンドのオプション
+ * @brief dumpwordコマンドのオプション
*/
static struct option longopts[] = {
{ "arithmetic", no_argument, NULL, 'a' },
};
/**
- * dumpwordコマンドのメイン
+ * @brief dumpwordコマンドのメイン
+ *
+ * @return 正常終了時は0、エラー発生時は1
+ *
+ * @param argc コマンドライン引数の数
+ * @param *argv[] コマンドライン引数の配列
*/
int main(int argc, char *argv[])
{
#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" },
};
/**
- * アセンブル結果読み込みエラーの定義
+ * @brief アセンブル結果読み込みエラーの定義
*/
static CERR cerr_load[] = {
{ 210, "load - memory overflow" },
};
/**
- * 実行モード: 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;
FREE(buffer);
}
-/**
- * 標準出力へ文字データを書出(SVC 2)
- */
void svcout()
{
int i;
}
}
-/**
- * ロード/論理積/論理和/排他的論理和のフラグ設定。OFは常に0
- */
void setfr(WORD adr)
{
sys->cpu->fr = 0x0;
}
}
-/**
- * WORD値からr/r1を取得
- */
WORD get_r_r1(WORD oprx)
{
WORD r;
return r;
}
-/**
- * WORD値からx/r2を取得
- */
WORD get_x_r2(WORD oprx)
{
WORD x;
return x;
}
-/**
- * 2つのWORD値からadr[,x]を取得
- */
WORD get_adr_x(WORD adr, WORD oprx)
{
WORD a = adr, x;
return a;
}
-
-/**
- * 2つのWORD値からadr[,x]のアドレスに格納されている内容を取得
- */
WORD get_val_adr_x(WORD adr, WORD oprx)
{
WORD a;
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];
sys->cpu->pr += 2;
}
-/**
- * LD命令 - オペランドr1,r2。語長1
- * \relates exec
- */
void ld_r1_r2()
{
WORD w[1];
sys->cpu->pr += 1;
}
-/**
- * ST命令。語長2
- * \relates exec
- */
void st()
{
WORD w[2];
sys->cpu->pr += 2;
}
-/**
- * LAD命令。語長2
- * \relates exec
- */
void lad()
{
WORD w[2];
sys->cpu->pr += 2;
}
-/**
- * ADDA命令のテンプレート\n
- * 汎用レジスタrに値valを算術加算
- */
void adda(WORD r, WORD val)
{
long tmp;
}
}
-/**
- * ADDA命令 - オペランドr,adr,x。語長2
- * \relates exec
- */
void adda_r_adr_x()
{
WORD w[2];
sys->cpu->pr += 2;
}
-/**
- * ADDA命令 - オペランドr1,r2。語長1
- * \relates exec
- */
void adda_r1_r2()
{
WORD w[1];
sys->cpu->pr += 1;
}
-/**
- * SUBA命令 - オペランドr,adr,x。語長2
- * \relates exec
- */
void suba_r_adr_x()
{
WORD w[2];
sys->cpu->pr += 2;
}
-/**
- * SUBA命令 - オペランドr1,r2。語長1
- * \relates exec
- */
void suba_r1_r2()
{
WORD w[1];
sys->cpu->pr += 1;
}
-/**
- * ADDL命令のテンプレート\n
- * 汎用レジスタrに値valを論理加算
- */
void addl(WORD r, WORD val)
{
long tmp;
}
}
-/**
- * ADDL命令 - オペランドr,adr,x。語長2
- * \relates exec
- */
void addl_r_adr_x()
{
WORD w[2];
sys->cpu->pr += 2;
}
-/**
- * ADDL命令 - オペランドr1,r2。語長1
- * \relates exec
- */
void addl_r1_r2()
{
WORD w[1];
sys->cpu->pr += 1;
}
-/**
- * SUBL命令 - オペランドr,adr,x。語長2
- * \relates exec
- */
void subl_r_adr_x()
{
WORD w[2];
sys->cpu->pr += 2;
}
-
-/**
- * SUBL命令 - オペランドr1,r2。語長1
- * \relates exec
- */
void subl_r1_r2()
{
WORD w[1];
sys->cpu->pr += 1;
}
-/**
- * AND命令 - オペランドr,adr,x。語長2
- * \relates exec
- */
void and_r_adr_x()
{
WORD w[2];
sys->cpu->pr += 2;
}
-/**
- * AND命令 - オペランドr1,r2。語長1
- * \relates exec
- */
void and_r1_r2()
{
WORD w[1];
sys->cpu->pr += 1;
}
-/**
- * OR命令 - オペランドr,adr,x。語長2
- * \relates exec
- */
void or_r_adr_x()
{
WORD w[2];
sys->cpu->pr += 2;
}
-/**
- * OR命令 - オペランドr1,r2。語長1
- * \relates exec
- */
void or_r1_r2()
{
WORD w[1];
sys->cpu->pr += 1;
}
-/**
- * XOR命令 - オペランドr,adr,x。語長2
- * \relates exec
- */
void xor_r_adr_x()
{
WORD w[2];
sys->cpu->pr += 2;
}
-/**
- * XOR命令 - オペランドr1,r2。語長1
- * \relates exec
- */
void xor_r1_r2()
{
WORD w[1];
sys->cpu->pr += 1;
}
-/**
- * CPA命令のテンプレート\n
- * 汎用レジスタrの内容と値valを算術比較
- */
void cpa(WORD r, WORD val)
{
sys->cpu->fr = 0x0;
}
}
-/**
- * CPA命令 - オペランドr,adr,x。語長2
- * \relates exec
- */
void cpa_r_adr_x()
{
WORD w[2];
sys->cpu->pr += 2;
}
-/**
- * CPA命令 - オペランドr1,r2。語長1
- * \relates exec
- */
void cpa_r1_r2()
{
WORD w[1];
sys->cpu->pr += 1;
}
-/**
- * CPL命令のテンプレート\n
- * 汎用レジスタrの内容と値valを論理比較
- */
void cpl(WORD r, WORD val)
{
sys->cpu->fr = 0x0;
}
}
-
-/**
- * CPL命令 - オペランドr,adr,x。語長2
- * \relates exec
- */
void cpl_r_adr_x()
{
WORD w[2];
sys->cpu->pr += 2;
}
-/**
- * CPL命令 - オペランドr1,r2。語長1
- * \relates exec
- */
void cpl_r1_r2()
{
WORD w[1];
sys->cpu->pr += 1;
}
-/**
- * SLA命令 - オペランドr,adr,x。語長2\n
- * 算術演算なので、第15ビットは送り出されない
- * \relates exec
- */
void sla()
{
WORD w[2], sign, last = 0x0, r;
sys->cpu->pr += 2;
}
-/**
- * SRA命令 - オペランドr,adr,x。語長2\n
- * 算術演算なので、第15ビットは送り出されない\n
- * 空いたビット位置には符号と同じものが入る
- * \relates exec
- */
void sra()
{
WORD w[2], sign, last = 0x0, r;
sys->cpu->pr += 2;
}
-/**
- * SLL命令 - オペランドr,adr,x。語長2
- * \relates exec
- */
void sll()
{
WORD w[2], last = 0x0, r;
sys->cpu->pr += 2;
}
-/**
- * SRL命令 - オペランドr,adr,x。語長2
- * \relates exec
- */
void srl()
{
WORD w[2], last = 0x0, r;
sys->cpu->pr += 2;
}
-/**
- * JPL命令。語長2
- * \relates exec
- */
void jpl()
{
WORD w[2];
}
}
-/**
- * JMI命令。語長2
- * \relates exec
- */
void jmi()
{
WORD w[2];
}
}
-/**
- * JNZ命令。語長2
- * \relates exec
- */
void jnz()
{
WORD w[2];
}
}
-/**
- * JZE命令。語長2
- * \relates exec
- */
void jze()
{
WORD w[2];
}
}
-/**
- * JOV命令。語長2
- * \relates exec
- */
void jov()
{
WORD w[2];
}
}
-/**
- * JUMP命令。語長2
- * \relates exec
- */
void jump()
{
WORD w[2];
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);
sys->cpu->pr += 2;
}
-/**
- * POP命令。語長1
- * \relates exec
- */
void pop()
{
assert(sys->cpu->sp > execptr->end);
}
}
-/**
- * CALL命令。語長2
- * \relates exec
- */
void call()
{
assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize);
sys->cpu->pr = get_adr_x(w[1], w[0]);
}
-/**
- * RET命令。語長1(OPのみ)
- * \relates exec
- */
void ret()
{
assert(sys->cpu->sp <= sys->memsize);
}
}
-/**
- * SVC命令。語長2
- * \relates exec
- */
void svc()
{
WORD w[2];
sys->cpu->pr += 2;
}
-/**
- * 仮想マシンCOMET IIの実行
- * \class exec
- */
void exec()
{
clock_t clock_begin, clock_end;
#include "hash.h"
-/**
- * ハッシュ値を取得する
- */
unsigned hash(int keyc, HKEY *keyv[], int tabsize)
{
int i;
#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];
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);
return 0xFFFF;
}
-/**
- * プログラム名、ラベル、アドレスをラベル表に追加する
- */
bool addlabel(const char *prog, const char *label, WORD adr)
{
assert(label != NULL);
return true;
}
-/**
- * ラベルを比較した結果を返す
- */
-int compare_adr(const void *a, const void *b)
-{
- return (**(LABELARRAY **)a).adr - (**(LABELARRAY **)b).adr;
-}
-
-/**
- * ラベル表を表示する
- */
void printlabel()
{
int i, s = 0;
FREE(l);
}
-/**
- * ラベル表を解放する
- */
void freelabel()
{
int i;
#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" },
};
/**
- * オペランドトークン取得のエラー定義
+ * @brief オペランドトークン取得のエラー定義
*/
static CERR cerr_opdtok[] = {
{ 117, "operand too many in DC" },
{ 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");
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;
#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 == '-');
return (WORD)n;
}
-/**
- * 16進数の文字列をWORD値に変換
- */
WORD h2word(const char *str)
{
assert(*str == '#');
return w;
}
-/**
- * 10進数または16進数の文字列をWORD値に変換
- */
+/* word.hで定義された関数群 */
+void addcerrlist_word()
+{
+ addcerrlist(ARRAYSIZE(cerr_word), cerr_word);
+}
+
WORD nh2word(const char *str)
{
WORD w;
return w;
}
-/**
- * WORD値を10進数の文字列に変換
- */
char *word2n(WORD word)
{
enum {
return digit;
}
-/**
- * WORD値を2進数の文字列に変換
- */
char *word2bit(const WORD word)
{
enum {
return bit;
}
-/**
- * WORD値を解析して表示
- */
void print_dumpword(WORD word, bool logicalmode)
{
char *b;