OPDSIZE = 40, /* オペラントの最大数 */
};
+/* アセンブルモード */
+typedef struct {
+ bool srcmode; /* ソースを表示する場合はtrue */
+ bool labelmode; /* ラベル表を表示する場合はtrue */
+ bool onlylabelmode; /* ラベル表を表示して終了する場合はtrue */
+ bool asdetailmode; /* アセンブラ詳細結果を表示する場合はtrue */
+ bool onlyassemblemode; /* アセンブルだけを行う場合はtrue */
+} ASMODE;
+extern ASMODE asmode;
+
/* 値を格納するポインタ */
extern WORD ptr;
ZF = 0x1, /* Zero Flag */
};
-/* レジストリの内容を表示する場合はTRUE */
-extern bool tracemode;
-
-/* レジストリの内容を論理値(0〜65535)で表示する場合はTRUE */
-extern bool logicalmode;
-
-/* メモリの内容を表示する場合はTRUE */
-extern bool dumpmode;
-
-/* ソースを表示する場合はTRUE */
-extern bool srcmode;
-
-/* ラベル表を表示する場合はTRUE */
-extern bool labelmode;
-
-/* ラベル表を表示して終了する場合はTRUE */
-extern bool onlylabelmode;
-
-/* アセンブラ詳細結果を表示するならTRUE */
-extern bool asdetailmode;
-
-/* アセンブルだけを行う場合はTRUE */
-extern bool onlyassemblemode;
-
/* メモリーサイズ */
extern int memsize;
/* 実行終了番地 */
extern WORD endptr;
-/* COMET II 命令
- 命令タイプは、オペランドにより6つに分類
- R_ADR_X = 010: オペランド数2または3。
- 第1オペランドは汎用レジスタ、第2オペランドはアドレス、第3オペランドは指標レジスタ
- R_ADR_X_ = 011: 同上。ただし、実効アドレスに格納されている内容を示す
- R1_R2 = 020: オペランド数2。第1オペランド、第2オペランドともに汎用レジスタ
- ADR_X = 030: オペランド数1または2。第1オペランドはアドレス、第2オペランドは指標レジスタ
- R_ = 040: オペランド数1。第1オペランドはGR
- NONE = 0: オペランドなし
-*/
+/* COMET II 命令 */
+/* 命令タイプは、オペランドにより6種類に分類 */
typedef enum {
+ /* オペランド数2または3 */
+ /* 第1オペランド: 汎用レジスタ */
+ /* 第2オペランド: アドレス */
+ /* 第3オペランド: 指標レジスタ */
R_ADR_X = 010,
+ /* オペランド数2または3 */
+ /* 第1オペランド: 汎用レジスタ、*/
+ /* 第2オペランド: アドレスに格納されている内容 */
+ /* 第3オペランド: 指標レジスタ */
R_ADR_X_ = 011,
+ /* オペランド数2 */
+ /* 第1オペランド: 汎用レジスタ */
+ /* 第2オペランド: 汎用レジスタ */
R1_R2 = 020,
+ /* オペランド数1または2 */
+ /* 第1オペランド: アドレス */
+ /* 第2オペランド: 指標レジスタ */
ADR_X = 030,
+ /* オペランド数1 */
+ /* 第1オペランド: 汎用レジスタ */
R_ = 040,
+ /* オペランドなし */
NONE = 0,
} CMDTYPE;
+/* 命令コードの配列 */
typedef struct {
char *cmd;
CMDTYPE type;
/* 命令と命令タイプがキーのハッシュ表を作成する */
bool create_cmdtype_code();
-/* 命令と命令タイプから、命令コードを取得する。
- 無効な場合は0xFFFFを返す */
+/* 命令と命令タイプから、命令コードを取得する */
+/* 無効な場合は0xFFFFを返す */
WORD getcmdcode(const char *cmd, CMDTYPE type);
/* 命令と命令タイプからハッシュ値を生成する */
/* 命令コードからハッシュ値を生成する */
unsigned hash_code(WORD code);
-/* 命令コードから命令タイプを取得する。
- 無効な場合はNONEを返す */
+/* 命令コードから命令タイプを取得する */
+/* 無効な場合はNONEを返す */
CMDTYPE getcmdtype(WORD code);
/* 命令コードがキーのハッシュ表を表示する */
INSIZE = 256 /* CASL IIの、IN命令入力領域 */
};
+/* 実行モード */
+typedef struct {
+ bool tracemode; /* レジストリの内容を表示する場合はtrue */
+ bool logicalmode; /* レジストリの内容を論理値(0〜65535)で表示する場合はtrue */
+ bool dumpmode; /* メモリの内容を表示する場合はtrue */
+} EXECMODE;
+extern EXECMODE execmode;
+
/* 指定されたファイルからアセンブル結果を読込 */
bool inassemble(char *file);
}
if(cerrno == 0) {
memory[adr] = word;
- if(pass == SECOND && asdetailmode == true) {
+ if(pass == SECOND && (&asmode)->asdetailmode == true) {
fprintf(stdout, "\t#%04X\t#%04X\n", adr, word);
}
status = true;
break;
}
lineno++;
- if((pass == FIRST && srcmode == true) || (pass == SECOND && asdetailmode == true)) {
+ if((pass == FIRST && (&asmode)->srcmode == true) ||
+ (pass == SECOND && (&asmode)->asdetailmode == true))
+ {
fprintf(stdout, "%s:%5d:%s", file, lineno, line);
}
if((cmdl = linetok(line)) != NULL) {
#define _GNU_SOURCE
#include <getopt.h>
-/* 指定されたファイルにCOMET II仮想メモリ(アセンブル結果)を書込 */
-void outassemble(char *file) {
- FILE *fp;
- if((fp = fopen(file, "w")) == NULL) {
- perror(file);
- return;
- }
- fwrite(memory, sizeof(WORD), endptr, fp);
- fclose(fp);
-}
-
-static struct option longopts[] = {
+static struct option longopts[] =
+{
{"source", no_argument, NULL, 's'},
{"label", no_argument, NULL, 'l'},
{"labelonly", no_argument, NULL, 'L'},
{0, 0, 0, 0},
};
+ASMODE asmode = {false, false, false, false, false};
+EXECMODE execmode = {false, false, false};
+
+/* 指定されたファイルにCOMET II仮想メモリ(アセンブル結果)を書込 */
+void outassemble(char *file) {
+ FILE *fp;
+ if((fp = fopen(file, "w")) == NULL) {
+ perror(file);
+ exit(-1);
+ }
+ fwrite(memory, sizeof(WORD), endptr, fp);
+ fclose(fp);
+}
+
int main(int argc, char *argv[])
{
int opt, i;
WORD beginptr[argc];
char *objfile = NULL;
const char *default_objfile = "a.o";
- const char *usage = "Usage: %s [-slLaAtTdh] [-oO<OUTFILE>] [-M <memorysize>] [-C <clocks>] FILE ...\n";
+ const char *usage =
+ "Usage: %s [-slLaAtTdh] [-oO<OUTFILE>] [-M <memorysize>] [-C <clocks>] FILE ...\n";
while((opt = getopt_long(argc, argv, "tTdslLao::O::AM:C:h", longopts, NULL)) != -1) {
switch(opt) {
case 's':
- srcmode = true;
+ (&asmode)->srcmode = true;
break;
case 'l':
- labelmode = true;
+ (&asmode)->labelmode = true;
break;
case 'L':
- onlylabelmode = true;
+ (&asmode)->labelmode = true;
+ (&asmode)->onlylabelmode = true;
break;
case 'a':
- asdetailmode = true;
+ (&asmode)->asdetailmode = true;
break;
case 'A':
- onlyassemblemode = true;
- asdetailmode = true;
+ (&asmode)->onlyassemblemode = true;
+ (&asmode)->asdetailmode = true;
break;
case 'o':
if(optarg == NULL) {
}
break;
case 'O':
- onlyassemblemode = true;
+ (&asmode)->onlyassemblemode = true;
if(optarg == NULL) {
objfile = strdup(default_objfile);
} else {
}
break;
case 't':
- tracemode = true;
+ (&execmode)->tracemode = true;
break;
case 'T':
- tracemode = true;
- logicalmode = true;
+ (&execmode)->tracemode = true;
+ (&execmode)->logicalmode = true;
break;
case 'd':
- dumpmode = true;
+ (&execmode)->dumpmode = true;
break;
case 'M':
memsize = atoi(optarg);
} else if(pass == SECOND) {
ptr = beginptr[i];
}
- if(tracemode == true || dumpmode == true || srcmode == true ||
- labelmode == true || asdetailmode == true) {
+ if((&execmode)->tracemode == true || (&execmode)->dumpmode == true ||
+ (&asmode)->srcmode == true || (&asmode)->labelmode == true ||
+ (&asmode)->asdetailmode == true)
+ {
fprintf(stdout, "\nAssemble %s (%d)\n", argv[i], pass);
}
if((status = assemble(argv[i], pass)) == false) {
exit(-1);
}
}
- if(pass == FIRST && (labelmode == true || onlylabelmode == true)) {
+ if(pass == FIRST && (&asmode)->labelmode == true) {
fprintf(stdout, "\nLabel::::\n");
printlabel();
- if(onlylabelmode == true) {
+ if((&asmode)->onlylabelmode == true) {
return 0;
}
}
if(objfile != NULL) {
outassemble(objfile);
}
- if(onlyassemblemode == false) {
+ if((&asmode)->onlyassemblemode == false) {
exec(); /* プログラム実行 */
}
}
return hash(2, keys, cmdcodesize);
}
-/* 命令と命令タイプから、命令コードを取得する。
- 無効な場合は0xFFFFを返す */
+/* 命令と命令タイプから、命令コードを取得する */
+/* 無効な場合は0xFFFFを返す */
WORD getcmdcode(const char *cmd, CMDTYPE type)
{
CMDCODETAB *np;
return hash(1, keys, cmdcodesize);
}
-/* 命令コードから命令タイプを取得する。
- 無効な場合はNONEを返す */
+/* 命令コードから命令タイプを取得する */
+/* 無効な場合はNONEを返す */
CMDTYPE getcmdtype(WORD code)
{
CMDCODETAB *np;
#define _GNU_SOURCE
#include <getopt.h>
+static struct option longopts[] = {
+ {"trace", no_argument, NULL, 't'},
+ {"tracearithmetic", no_argument, NULL, 't'},
+ {"tracelogical", no_argument, NULL, 'T'},
+ {"dump", no_argument, NULL, 'd'},
+ {"memorysize", required_argument, NULL, 'M'},
+ {"clocks", required_argument, NULL, 'C'},
+ {"help", no_argument, NULL, 'h'},
+ {0, 0, 0, 0}
+};
+
+EXECMODE execmode = {false, false, false};
+
/* 指定されたファイルからCOMET II仮想メモリ(アセンブル結果)を読込 */
bool inassemble(char *file) {
FILE *fp;
return true;
}
-static struct option longopts[] = {
- {"trace", no_argument, NULL, 't'},
- {"tracearithmetic", no_argument, NULL, 't'},
- {"tracelogical", no_argument, NULL, 'T'},
- {"dump", no_argument, NULL, 'd'},
- {"memorysize", required_argument, NULL, 'M'},
- {"clocks", required_argument, NULL, 'C'},
- {"help", no_argument, NULL, 'h'},
- {0, 0, 0, 0}
-};
-
int main(int argc, char *argv[])
{
int opt;
while((opt = getopt_long(argc, argv, "tTdM:C:h", longopts, NULL)) != -1) {
switch(opt) {
case 't':
- tracemode = true;
+ (&execmode)->tracemode = true;
break;
case 'T':
- tracemode = true;
- logicalmode = true;
+ (&execmode)->tracemode = true;
+ (&execmode)->logicalmode = true;
break;
case 'd':
- dumpmode = true;
+ (&execmode)->dumpmode = true;
break;
case 'M':
memsize = atoi(optarg);
#include "casl2.h"
+#include "exec.h"
/* COMET IIのメモリを表示 */
void dumpmemory()
{
int i;
for(i = 0; i < REGSIZE; i++ ) {
- if(logicalmode == true) {
+ if((&execmode)->logicalmode == true) {
fprintf(stdout, "#%04X: GR%d: %6d = #%04X = %s\n",
PR, i, GR[i], GR[i], word2bit(GR[i]));
} else {
{ 0, NULL },
};
-/* レジストリの内容を論理値(0〜65535)で表示する場合はtrue */
-bool logicalmode = false;
-
int main(int argc, char *argv[])
{
+ bool logicalmode = false; /* レジストリの内容を論理値(0〜65535)で表示する場合はtrue */
int opt;
WORD word;
const char *usage = "Usage: %s [-alh] WORD\n";
- logicalmode = false;
while((opt = getopt_long(argc, argv, "alh", longopts, NULL)) != -1) {
switch(opt) {
case 'l':
char *errpr = malloc(8);
clock_t clock_begin, clock_end;
- if(tracemode) {
+ if((&execmode)->tracemode) {
fprintf(stdout, "\nExecuting machine codes\n");
}
/* フラグレジスタの初期値設定 */
if(cerrno > 0) {
goto execerr;
}
- if(tracemode){
+ if((&execmode)->tracemode){
fprintf(stdout, "#%04X: Register::::\n", PR);
dspregister();
}
- if(dumpmode){
+ if((&execmode)->dumpmode){
fprintf(stdout, "#%04X: Memory::::\n", PR);
dumpmemory();
}
- if(dumpmode || tracemode) {
+ if((&execmode)->dumpmode || (&execmode)->tracemode) {
fprintf(stdout, "\n");
}
PR++;
{ 0, NULL },
};
-/* レジストリの内容を表示する場合はtrue */
-bool tracemode = false;
-
-/* レジストリの内容を論理値(0〜65535)で表示する場合はtrue */
-bool logicalmode = false;
-
-/* メモリの内容を表示する場合はtrue */
-bool dumpmode = false;
-
-/* ソースを表示する場合はtrue */
-bool srcmode = false;
-
-/* ラベル表を表示する場合はtrue */
-bool labelmode = false;
-
-/* ラベル表を表示して終了する場合はtrue */
-bool onlylabelmode = false;
-
-/* アセンブラ詳細結果を表示する場合はtrue */
-bool asdetailmode = false;
-
-/* アセンブルだけを行う場合はtrue */
-bool onlyassemblemode = false;
-
/* メモリーサイズ */
int memsize = DEFAULT_MEMSIZE;