74 { 201,
"Program Register (PR) - memory overflow" },
75 { 202,
"Stack Pointer (SP) - stack overflow" },
76 { 203,
"Stack Pointer (SP) - stack underflow" },
77 { 204,
"OP in word #1 - not command code" },
78 { 205,
"r/r1 in word #1 - not GR" },
79 { 206,
"x/r2 in word #1 - not GR" },
80 { 207,
"address in word #2 - out of memory" },
81 { 208,
"SVC input - memory overflow" },
82 { 209,
"SVC output - memory overflow" },
94 sprintf(str,
"PR:#%04X", pr);
103 if(fgets(buf,
INSIZE, stdin) == NULL) {
104 sys->memory[
sys->cpu->gr[1]] =
sys->memory[
sys->cpu->gr[2]] = 0x0;
107 for(i = 0; i <
INSIZE; i++) {
108 if(!buf[i] || buf[i] ==
'\n') {
116 sys->memory[
sys->cpu->gr[1] + i] = buf[i];
118 sys->memory[
sys->cpu->gr[2]] = i + 1;
127 for(i = 0; i <
sys->memory[
sys->cpu->gr[2]]; i++) {
135 if(((w =
sys->memory[
sys->cpu->gr[1]+i]) >= 0x20 && w <= 0x7E) ||
136 (w >= 0xA0 && w <= 0xFE) ||
137 w == 0xA || w ==
'\t')
150 if((adr & 0x8000) == 0x8000) {
164 if((r = ((oprx & 0x00F0) >>4)) >
GRSIZE - 1) {
177 if((x = (oprx & 0x000F)) >
GRSIZE - 1) {
191 a +=
sys->cpu->gr[x];
206 return sys->memory[a];
254 assert(
sizeof(
short) * 8 == 16 && (
short)0xFFFF == -1);
255 if((tmp = (
short)(
sys->cpu->gr[r]) + (
short)val) > 32767 || tmp < -32768) {
259 sys->cpu->gr[r] = (
WORD)(tmp & 0xFFFF);
260 if((
sys->cpu->gr[r] & 0x8000) == 0x8000) {
262 }
else if(
sys->cpu->gr[r] == 0x0) {
319 if((s & 0x8000) == 0x8000) {
400 if((
short)
sys->cpu->gr[r] < (
short)val) {
402 }
else if(
sys->cpu->gr[r] == val) {
424 if(
sys->cpu->gr[r] < val) {
426 }
else if(
sys->cpu->gr[r] == val) {
449 WORD sign =
sys->cpu->gr[r] & 0x8000;
453 sys->cpu->gr[r] &= 0x7FFF;
454 for(
int i = 0; i <
get_adr_x(w[1], w[0]); i++) {
455 last =
sys->cpu->gr[r] & 0x4000;
456 sys->cpu->gr[r] <<= 1;
458 sys->cpu->gr[r] = sign | (
sys->cpu->gr[r] & 0x7FFF);
468 if(
sys->cpu->gr[r] == 0x0) {
478 WORD sign =
sys->cpu->gr[r] & 0x8000;
482 sys->cpu->gr[r] &= 0x7FFF;
483 for(
int i = 0; i <
get_adr_x(w[1], w[0]); i++) {
484 last =
sys->cpu->gr[r] & 0x1;
485 sys->cpu->gr[r] >>= 1;
487 sys->cpu->gr[r] |= 0x4000;
490 sys->cpu->gr[r] = sign |
sys->cpu->gr[r];
500 if(
sys->cpu->gr[r] == 0x0) {
513 for(
int i = 0; i <
get_adr_x(w[1], w[0]); i++) {
514 last =
sys->cpu->gr[r] & 0x8000;
515 sys->cpu->gr[r] <<= 1;
522 if((
sys->cpu->gr[r] & 0x8000) > 0x0) {
526 if(
sys->cpu->gr[r] == 0x0) {
539 for(
int i = 0; i <
get_adr_x(w[1], w[0]); i++) {
540 last =
sys->cpu->gr[r] & 0x0001;
541 sys->cpu->gr[r] >>= 1;
548 if((
sys->cpu->gr[r] & 0x8000) > 0x0) {
552 if(
sys->cpu->gr[r] == 0x0) {
561 if((
sys->cpu->fr & (
SF |
ZF)) == 0) {
571 if((
sys->cpu->fr &
SF) > 0) {
581 if((
sys->cpu->fr &
ZF) == 0) {
591 if((
sys->cpu->fr &
ZF) > 0) {
601 if((
sys->cpu->fr &
OF) > 0) {
628 if(
sys->cpu->sp >=
sys->memsize) {
641 sys->memory[--(
sys->cpu->sp)] =
sys->cpu->pr + 1;
647 assert(
sys->cpu->sp <=
sys->memsize);
648 if(
sys->cpu->sp ==
sys->memsize) {
650 }
else if(
sys->cpu->sp <
sys->memsize) {
651 sys->cpu->pr =
sys->memory[(
sys->cpu->sp)++] + 1;
675 clock_t clock_begin = 0;
676 clock_t clock_end = 0;
677 void (*cmdptr)() = NULL;
679 const char *monmsg =
"COMET II machine code monitor. Type ? for help.\n";
684 fprintf(stdout,
"\nExecuting machine codes\n");
688 clock_begin = clock();
691 fprintf(stdout,
"#%04X: Register::::\n",
sys->cpu->pr);
695 fprintf(stdout,
"#%04X: Memory::::\n",
sys->cpu->pr);
698 fprintf(stdout,
"\n");
706 fprintf(stdout,
"%s", monmsg);
711 if(
sys->cpu->pr >=
sys->memsize) {
735 fprintf(stdout,
"Return to top.\n");
744 }
while(clock_end - clock_begin < CLOCKS_PER_SEC / sys->clocks);
751 fprintf(stderr,
"Execute error - %d: %s\n",
cerr->num,
cerr->msg);
struct _CERR CERR
エラーを表すデータ型
void addcerrlist(int cerrc, CERR cerrv[])
エラーリストを作成・追加する
void setcerr(int num, const char *str)
現在のエラーを設定する
#define FREE(ptr)
メモリを解放するマクロ
void * malloc_chk(size_t size, const char *tag)
mallocを実行し、0で初期化する
#define ARRAYSIZE(array)
配列のサイズを返すマクロ
void exec()
COMET II仮想マシンを実行する
void and_r_adr_x()
AND命令 - オペランドr,adr,x。語長2.
void svcin()
標準入力から文字データを読込(SVC 1)
void suba_r1_r2()
SUBA命令 - オペランドr1,r2。語長1.
void cpl(WORD r, WORD val)
void cpl_r_adr_x()
CPL命令 - オペランドr,adr,x。語長2.
void sra()
SRA命令 - オペランドr,adr,x。語長2.
void adda(WORD r, WORD val)
void svcout()
標準出力へ文字データを書出(SVC 2)
void adda_r1_r2()
ADDA命令 - オペランドr1,r2。語長1.
void xor_r1_r2()
XOR命令 - オペランドr1,r2。語長1.
void subl_r_adr_x()
SUBL命令 - オペランドr,adr,x。語長2.
void sla()
SLA命令 - オペランドr,adr,x。語長2.
WORD get_val_adr_x(WORD adr, WORD oprx)
2つのWORD値からadr[,x]のアドレスに格納されている値を取得
char * pr2str(WORD pr)
プログラムレジスタ(PR)を表すWORD値を文字列に変換
void srl()
SRL命令 - オペランドr,adr,x。語長2.
WORD get_adr_x(WORD adr, WORD oprx)
2つのWORD値からadr[,x]を取得
WORD get_x_r2(WORD oprx)
WORD値からx/r2を取得
void ld_r_adr_x()
LD命令 - オペランドr,adr,x。語長2.
void adda_r_adr_x()
ADDA命令 - オペランドr,adr,x。語長2.
void addl_r1_r2()
ADDL命令 - オペランドr1,r2。語長1.
void cpl_r1_r2()
CPL命令 - オペランドr1,r2。語長1.
WORD get_r_r1(WORD oprx)
WORD値からr/r1を取得
void subl_r1_r2()
SUBL命令 - オペランドr1,r2。語長1.
void cpa_r1_r2()
CPA命令 - オペランドr1,r2。語長1.
void addl_gr(WORD r, WORD val, bool add)
void cpa(WORD r, WORD val)
void nop()
NOP命令。語長1(OPのみ)
void cpa_r_adr_x()
CPA命令 - オペランドr,adr,x。語長2.
void and_r1_r2()
AND命令 - オペランドr1,r2。語長1.
void addcerrlist_exec()
実行エラーをエラーリストに追加する
void ret()
RET命令。語長1(OPのみ)
void or_r_adr_x()
OR命令 - オペランドr,adr,x。語長2.
void suba_r_adr_x()
SUBA命令 - オペランドr,adr,x。語長2.
static CERR cerr_exec[]
実行エラーの定義
void addl_r_adr_x()
ADDL命令 - オペランドr,adr,x。語長2.
void sll()
SLL命令 - オペランドr,adr,x。語長2.
void setfr(WORD adr)
ロード/論理積/論理和/排他的論理和のフラグ設定。OFは常に0
void xor_r_adr_x()
XOR命令 - オペランドr,adr,x。語長2.
void or_r1_r2()
OR命令 - オペランドr1,r2。語長1.
void ld_r1_r2()
LD命令 - オペランドr1,r2。語長1.
void dumpmemory(WORD start, WORD end)
COMET IIのメモリを表示する
void dspregister()
COMET IIのレジスタを表示する
void monitor()
COMET IIモニターを起動する
bool getbps(WORD adr)
ブレークポイント表にアドレスがある場合はtrue、ない場合はfalseを返す
void freebps()
ブレークポイント表を解放する
bool create_cmdtable(CMDTAB_HASH hash)
命令ハッシュ表を作成する
const void * getcmdptr(WORD code)
void free_cmdtable(CMDTAB_HASH hash)
SYSTEM * sys
COMET IIの仮想実行マシンシステム
EXECMODE execmode
実行モード: trace, logical, dump, monitor, step
unsigned short WORD
16ビットの数値を表すデータ型