extern ASMODE asmode;
/**
- * アセンブルのプロパティ
+ * アセンブル時の、現在およびリテラルのアドレスと入口名
*/
typedef struct {
- WORD ptr; /**<ç\8f¾å\9c¨ã\81®ã\83\9dã\82¤ã\83³ã\82¿ */
- WORD lptr; /**<ã\83ªã\83\86ã\83©ã\83«ï¼\88=ä»\98ã\81\8dã\81®å\80¤ï¼\89ã\82\92æ ¼ç´\8dã\81\99ã\82\8bã\83\9dã\82¤ã\83³ã\82¿ */
+ WORD ptr; /**<ç\8f¾å\9c¨ã\81®ã\82¢ã\83\89ã\83¬ã\82¹ */
+ WORD lptr; /**<ã\83ªã\83\86ã\83©ã\83«ï¼\88=ä»\98ã\81\8dã\81®å\80¤ï¼\89ã\81®ã\82¢ã\83\89ã\83¬ã\82¹ */
char *prog; /**<他のプログラムで参照する入口名 */
-} ASPROP;
+} ASPTR;
-/**
- * アセンブルのプロパティ: ptr, lptr, *prog
- */
-extern ASPROP *asprop;
+extern ASPTR *asptr;
/**
* アセンブラ命令を表す番号
* マクロ命令を表す配列
*/
typedef struct {
- MACROCMDID cmdid; /**<ã\82¢ã\82»ã\83³ã\83\96ã\83«命令のID */
+ MACROCMDID cmdid; /**<ã\83\9eã\82¯ã\83命令のID */
int opdc_min; /**<最小オペランド数 */
int opdc_max; /**<最大オペランド数 */
char *cmd; /**<コマンド名 */
} CMDTYPE;
/**
- * 命令コード配列
+ * 命令コード表の項目
*/
typedef struct {
- char *name;
- CMDTYPE type;
- WORD code;
+ char *name; /**<命令名 */
+ CMDTYPE type; /**<命令タイプ */
+ WORD code; /**<命令コード */
} CMD;
/**
* 命令コードのハッシュ表
*/
typedef struct _CMDTAB {
- struct _CMDTAB *next;
- CMD *cmd;
+ struct _CMDTAB *next; /**<次項目へのポインタ */
+ CMD *cmd; /**<命令コード表の項目 */
} CMDTAB;
/**
- * CASL2プログラムのプロパティ
+ * プログラム実行時の開始と終了のアドレス
*/
typedef struct {
- WORD start; /**<プログラムの開始番地 */
- WORD end; /**<プログラムの終了番地 */
-} PROGPROP;
+ WORD start; /**<開始アドレス */
+ WORD end; /**<終了アドレス */
+} EXECPTR;
-extern PROGPROP *prog;
+extern EXECPTR *execptr;
/**
* COMET II仮想マシンのリセット
/**
* アセンブルのプロパティ: ptr, lptr, *prog
*/
-ASPROP *asprop;
+ASPTR *asptr;
/**
* アセンブルのエラー定義
*/
WORD getliteral(const char *str, PASS pass)
{
- WORD adr = asprop->lptr;
+ WORD adr = asptr->lptr;
assert(*str == '=');
if(*(++str) == '\'') { /* 文字定数 */
writestr(str, true, pass);
} else {
- writememory(nh2word(str), (asprop->lptr)++, pass);
+ writememory(nh2word(str), (asptr->lptr)++, pass);
}
return adr;
}
return false;
}
/* プログラム名の設定 */
- asprop->prog = strdup_chk(cmdl->label, "asprop.prog");
+ asptr->prog = strdup_chk(cmdl->label, "asptr.prog");
/* オペランドがある場合、実行開始番地を設定 */
if(pass == SECOND && cmdl->opd->opdc == 1) {
- if((prog->start = getlabel(asprop->prog, cmdl->opd->opdv[0])) == 0xFFFF) {
+ if((execptr->start = getlabel(asptr->prog, cmdl->opd->opdv[0])) == 0xFFFF) {
setcerr(103, cmdl->opd->opdv[0]); /* label not found */
}
}
case END:
/* 1回目のアセンブルの場合は、リテラル領域開始番地を設定 */
if(pass == FIRST) {
- asprop->lptr = asprop->ptr;
+ asptr->lptr = asptr->ptr;
}
/* 2回目のアセンブルの場合は、リテラル領域終了番地を実行終了番地として設定 */
else if(pass == SECOND) {
- prog->end = asprop->lptr;
+ execptr->end = asptr->lptr;
}
/* プログラム名のクリア */
- asprop->prog = NULL;
+ asptr->prog = NULL;
status = true;
break;
case DS:
for(i = 0; i < atoi(cmdl->opd->opdv[0]); i++) {
- writememory(0x0, (asprop->ptr)++, pass);
+ writememory(0x0, (asptr->ptr)++, pass);
if(cerr->num > 0) {
return false;
}
setcerr(112, cmdl->cmd); /* not command of no operand */
return false;
}
- if(writememory(cmd, (asprop->ptr)++, pass) == true) {
+ if(writememory(cmd, (asptr->ptr)++, pass) == true) {
status = true;
}
}
return false;
}
cmd |= (r1 << 4);
- if(writememory(cmd, (asprop->ptr)++, pass) == true) {
+ if(writememory(cmd, (asptr->ptr)++, pass) == true) {
status = true;
}
}
return false;
}
cmd |= ((r1 << 4) | r2);
- if(cerr->num == 0 && writememory(cmd, (asprop->ptr)++, pass) == true) {
+ if(cerr->num == 0 && writememory(cmd, (asptr->ptr)++, pass) == true) {
status = true;
}
}
}
cmd |= x;
}
- adr = getadr(asprop->prog, cmdl->opd->opdv[1], pass);
- writememory(cmd, (asprop->ptr)++, pass);
- writememory(adr, (asprop->ptr)++, pass);
+ adr = getadr(asptr->prog, cmdl->opd->opdv[1], pass);
+ writememory(cmd, (asptr->ptr)++, pass);
+ writememory(adr, (asptr->ptr)++, pass);
if(cerr->num == 0) {
status = true;
}
adr = getlabel(NULL, cmdl->opd->opdv[0]);
}
if(cmd != 0x8000 || (pass == SECOND && adr == 0xFFFF)) {
- adr = getadr(asprop->prog, cmdl->opd->opdv[0], pass);
+ adr = getadr(asptr->prog, cmdl->opd->opdv[0], pass);
}
- writememory(cmd, (asprop->ptr)++, pass);
- writememory(adr, (asprop->ptr)++, pass);
+ writememory(cmd, (asptr->ptr)++, pass);
+ writememory(adr, (asptr->ptr)++, pass);
if(cerr->num == 0) {
status = true;
}
}
/*リテラルの場合はリテラル領域に書込 */
if(literal == true) {
- writememory(*(p++), (asprop->lptr)++, pass);
+ writememory(*(p++), (asptr->lptr)++, pass);
lw = true;
} else {
- writememory(*(p++), (asprop->ptr)++, pass);
+ writememory(*(p++), (asptr->ptr)++, pass);
}
}
}
if(*str == '#' || isdigit(*str) || *str == '-') {
adr = nh2word(str);
} else {
- if(pass == SECOND && (adr = getlabel(asprop->prog, str)) == 0xFFFF) {
+ if(pass == SECOND && (adr = getlabel(asptr->prog, str)) == 0xFFFF) {
setcerr(103, str); /* label not found */
}
}
- writememory(adr, (asprop->ptr)++, pass);
+ writememory(adr, (asptr->ptr)++, pass);
}
}
if((cmdl = linetok(line)) != NULL) {
if(pass == FIRST && cmdl->label != NULL) {
- if(addlabel(asprop->prog, cmdl->label, asprop->ptr) == false) {
+ if(addlabel(asptr->prog, cmdl->label, asptr->ptr) == false) {
return false;
}
}
perror(file);
exit(-1);
}
- fwrite(sys->memory, sizeof(WORD), prog->end, fp);
+ fwrite(sys->memory, sizeof(WORD), execptr->end, fp);
fclose(fp);
}
for(pass = FIRST; pass <= SECOND; pass++) {
if(pass == FIRST) {
create_cmdtype_code(); /* 命令の名前とタイプがキーのハッシュ表を作成 */
- asprop = malloc_chk(sizeof(ASPROP), "asprop"); /* アセンブル時のプロパティ用の領域確保 */
+ asptr = malloc_chk(sizeof(asptr), "asptr"); /* アセンブル時のプロパティ用の領域確保 */
}
for(i = optind; i < argc; i++) {
/* データの格納開始位置 */
if(pass == FIRST) {
- beginptr[i] = asprop->ptr;
+ beginptr[i] = asptr->ptr;
} else if(pass == SECOND) {
- asprop->ptr = beginptr[i];
+ asptr->ptr = beginptr[i];
}
- asprop->prog = NULL;
+ asptr->prog = NULL;
if(execmode.trace == true || execmode.dump == true || asmode.src == true ||
asmode.label == true || asmode.asdetail == true)
{
}
if(pass == SECOND) {
freelabel(); /* ラベルハッシュ表を解放 */
- free_chk(asprop->prog, "asprop.prog"); /* プログラム名を解放 */
- free_chk(asprop, "asprop"); /* アセンブル時のプロパティを解放 */
+ free_chk(asptr->prog, "asptr.prog"); /* プログラム名を解放 */
+ free_chk(asptr, "asptr"); /* アセンブル時のプロパティを解放 */
free_cmdtype_code(); /* 命令の名前とタイプがキーのハッシュ表を解放 */
}
}
}
/* COMET II仮想マシンのリセット */
reset(memsize, clocks);
- prog->start = 0;
+ execptr->start = 0;
if(loadassemble(argv[optind]) == true) {
create_code_type(); /* タイプがキーの命令ハッシュ表を作成 */
exec(); /* プログラム実行 */
perror(file);
return false;
}
- prog->end = prog->start +
- fread(sys->memory, sizeof(WORD), sys->memsize - prog->start, fp);
- if(prog->end == sys->memsize) {
+ execptr->end = execptr->start +
+ fread(sys->memory, sizeof(WORD), sys->memsize - execptr->start, fp);
+ if(execptr->end == sys->memsize) {
setcerr(201, file); /* Loading - full of COMET II memory */
fprintf(stderr, "Load error - %d: %s\n", cerr->num, cerr->msg);
status = false;
/* フラグレジスタの初期値設定 */
sys->cpu->fr = 0x0;
sys->cpu->sp = sys->memsize;
- sys->cpu->pr = prog->start;
+ sys->cpu->pr = execptr->start;
/* 機械語の実行 */
for (; ; ) {
clock_begin = clock();
setcerr(204, errpr); /* Program Register (PR) - out of COMET II memory */
}
/* スタック領域を確保できない場合はエラー */
- else if(sys->cpu->sp <= prog->end) {
+ else if(sys->cpu->sp <= execptr->end) {
sprintf(errpr, "PR:#%04X", sys->cpu->pr);
setcerr(205, errpr); /* Stack Pointer (SP) - cannot allocate stack buffer */
}
}
break;
case 0x7000: /* PUSH */
- assert(sys->cpu->sp > prog->end && sys->cpu->sp <= sys->memsize);
+ assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize);
sys->memory[--(sys->cpu->sp)] = val;
break;
case 0x7100: /* POP */
- assert(sys->cpu->sp > prog->end && sys->cpu->sp <= sys->memsize);
+ assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize);
sys->cpu->gr[r_r1] = sys->memory[(sys->cpu->sp)++];
break;
case 0x8000: /* CALL */
- assert(sys->cpu->sp > prog->end && sys->cpu->sp <= sys->memsize);
+ assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize);
sys->memory[--(sys->cpu->sp)] = sys->cpu->pr;
sys->cpu->pr = val;
break;
case 0x8100: /* RET */
- assert(sys->cpu->sp > prog->end && sys->cpu->sp <= sys->memsize);
+ assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize);
if(sys->cpu->sp == sys->memsize) {
return true;
} else {
#include "cmem.h"
/**
- * COMET IIの仮装実行マシンシステム
+ * COMET IIの仮想実行マシンシステム
*/
SYSTEM *sys;
/**
- * CASL IIプログラムのプロパティ
+ * プログラム実行時の開始と終了のアドレス
*/
-PROGPROP *prog;
+EXECPTR *execptr;
/**
* COMET II仮想マシンのリセット
int i;
sys = malloc_chk(sizeof(SYSTEM), "sys");
- /* ã\83¡ã\83¢ã\83ªã\82µã\82¤ã\82ºã\81®設定 */
+ /* ã\83¡ã\83¢ã\83ªã\82µã\82¤ã\82ºã\82\92設定 */
sys->memsize = memsize;
- /* ã\82¯ã\83ã\83\83ã\82¯å\91¨æ³¢æ\95°ã\81®設定 */
+ /* ã\82¯ã\83ã\83\83ã\82¯å\91¨æ³¢æ\95°ã\82\92設定 */
sys->clocks = clocks;
- /* ã\83¡ã\83¢ã\83ªã\81®初期化 */
+ /* ã\83¡ã\83¢ã\83ªã\82\92初期化 */
sys->memory = calloc_chk(sys->memsize, sizeof(WORD), "memory");
- /* CPUã\81®初期化 */
+ /* CPUã\82\92初期化 */
sys->cpu = malloc_chk(sizeof(CPU), "cpu");
for(i = 0; i < GRSIZE; i++) {
sys->cpu->gr[i] = 0x0;
}
sys->cpu->sp = sys->cpu->pr = sys->cpu->fr = 0x0;
- /* CASL2プログラムのプロパティ */
- prog = malloc_chk(sizeof(PROGPROP), "prog");
+ /* CASL2プログラムの開始と終了のアドレスを初期化 */
+ execptr = malloc_chk(sizeof(execptr), "prog");
}
/**
*/
void shutdown()
{
- free_chk(prog, "prog");
+ free_chk(execptr, "execptr");
free_chk(sys->memory, "sys.memory");
free_chk(sys->cpu, "sys.cpu");
free_chk(sys, "sys");