#include <assert.h>
#include <errno.h>
#include "cerr.h"
-#include "cmem.h"
-#include "exec.h"
-#include "hash.h"
#include "struct.h"
-#include "word.h"
#include "token.h"
/**
/**
* @brief 指定された1つまたは複数のファイルを2回アセンブル
*
- * @return ã\81ªã\81\97
+ * @return ã\82¢ã\82»ã\83³ã\83\96ã\83«å®\8cäº\86æ\99\82ã\81¯trueã\80\81ã\82¨ã\83©ã\83¼ç\99ºç\94\9fæ\99\82ã\81¯falseã\82\92è¿\94ã\81\99
*
* @param filec アセンブルするファイルの数
* @param filev アセンブルするファイル名の配列
* @param adr アセンブル結果を格納するアドレス
*/
- void assemble(int filec, char *filev[], WORD adr);
+ bool assemble(int filec, char *filev[], WORD adr);
/**
* @brief ファイルにアセンブル結果を書き込む
INSIZE = 256 /**<IN命令の、入力領域 */
};
-/**
- * @brief 実行モードを表すデータ型
- */
-typedef struct {
- bool trace; /**<レジストリの内容をステップごとに表示する場合はtrue */
- bool logical; /**<レジストリの内容を論理値(0から65535)で表示する場合はtrue */
- bool dump; /**<メモリの内容をステップごとに表示する場合はtrue */
- int dump_start; /**<メモリの内容をステップごとに表示する場合の開始アドレス */
- int dump_end; /**<メモリの内容をステップごとに表示する場合の終了アドレス */
- bool monitor; /**<モニターモードの場合はtrue */
- bool step; /**<ステップ実行の場合はtrue */
-} EXECMODE;
-
-/**
- * @brief 実行モード: trace, logical, dump, monitor, step
- */
-extern EXECMODE execmode;
-
/**
* @brief 実行エラーをエラーリストに追加する
*/
void addcerrlist_exec();
- /**
- * @brief アセンブル結果読み込みエラーをエラーリストに追加する
- */
- void addcerrlist_load();
-
/**
* @brief 指定されたファイルからアセンブル結果を読み込む
*
#include "package.h"
#include "assemble.h"
+#include "exec.h"
/**
* @brief CASL IIのエラーをエラーリストに追加
*/
CERR cerr_casl2[] = {
{ 126, "no source file" },
+ { 127, "invalid option" },
};
void addcerrlist_casl2()
const char *usage =
"Usage: %s [-slLaAtTdmvh] [-oO[<OBJECTFILE>]] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE1[ FILE2 ...]\n";
+ /* エラーの定義 */
+ cerr_init();
+ addcerrlist_casl2();
+ addcerrlist_assemble();
+ addcerrlist_exec();
+
/* オプションの処理 */
while((opt = getopt_long(argc, argv, "tTdslLmao::O::AM:C:vh", longopts, NULL)) != -1) {
switch(opt) {
break;
case 'v':
fprintf(stdout, cmdversion, version);
- return 0;
+ goto casl2fin;
case 'h':
fprintf(stdout, usage, argv[0]);
- return 0;
+ goto casl2fin;
case '?':
fprintf(stderr, usage, argv[0]);
- exit(1);
+ setcerr(212, ""); /* invalid option */
+ goto casl2fin;
}
}
- /* エラーの定義 */
- cerr_init();
- addcerrlist_casl2();
- addcerrlist_assemble();
- addcerrlist_exec();
-
/* ソースファイルが指定されていない場合は終了 */
if(argv[optind] == NULL) {
setcerr(126, ""); /* no source file */
- fprintf(stderr, "CASL2 error - %d: %s\n", cerr->num, cerr->msg);
- freecerr(); /* エラーの解放 */
- exit(1);
+ fprintf(stderr, "casl2 error - %d: %s\n", cerr->num, cerr->msg);
+ goto casl2fin;
}
create_cmdtable(HASH_CMDTYPE); /* 命令の名前とタイプがキーのハッシュ表を作成 */
reset(memsize, clocks); /* 仮想マシンCOMET IIのリセット */
for(i = 0; i < argc - optind; i++) { /* 引数からファイル名配列を取得 */
af[i] = argv[optind + i];
}
- assemble(i, af, 0); /* アセンブル */
- if(asmode.onlylabel == true || cerr->num > 0) {
- goto casl2fin;
+ /* アセンブル */
+ if(assemble(i, af, 0) == false || asmode.onlylabel == true) {
+ goto shutdown;
}
/* オブジェクトファイル名が指定されている場合は、アセンブル結果をオブジェクトファイルに出力 */
if(objfile != NULL) {
outassemble(objfile);
- FREE(objfile);
}
/* onlyassembleモード以外の場合、仮想マシンCOMET IIを実行 */
if(asmode.onlyassemble == false) {
exec(); /* 仮想マシンCOMET IIの実行 */
}
+ shutdown:
+ shutdown(); /* 仮想マシンCOMET IIのシャットダウン */
casl2fin:
- shutdown(); /* 仮想マシンCOMET IIのシャットダウン */
free_cmdtable(HASH_CMDTYPE);
- stat = (cerr->num == 0) ? 0 : 1;
+ FREE(objfile);
+ if(cerr->num > 0) {
+ stat = 1;
+ }
freecerr(); /* エラーの解放 */
return stat;
}
COMET II machine code monitor. Type ? for help.
- (comet2 monitor) l as/sample/sum_10.o
+ (comet2 monitor) l sum_10.o
(comet2 monitor) d
-(comet2 monitor)
+ #0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+ -------------------------------------------------------------------------------------
+ #0000: 0000: 7001 0000 7002 0000 3622 1010 0015 2621 2210 0017 4110 0016 6500 0010 6400 0007
+ #0000: 0010: 1120 0018 7120 7110 8100 0001 000A 0001 0000 0000 0000 0000 0000 0000 0000 0000
+ #0000: 0020: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+ #0000: 0030: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+(comet2 monitor)