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" },
83 { 214,
"CPU Clocks - not positive integer" },
84 { 215,
"Memory Size - not integer or out of range: 1 - 65536" },
96 fprintf(stderr,
"Info - %s: Clock frequency exceeds maximum. Set to %ld\n", str, val);
105 sprintf(str,
"PR:#%04X", pr);
113 if(fgets(buf,
INSIZE, stdin) == NULL) {
114 sys->memory[
sys->cpu->gr[1]] = 0x0;
115 sys->memory[
sys->cpu->gr[2]] = 0xFFFF;
119 for(
int i = 0; i <
INSIZE; i++) {
120 if(!buf[i] || buf[i] ==
'\n') {
127 sys->memory[
sys->cpu->gr[1] + i] = buf[i];
128 sys->memory[
sys->cpu->gr[2]] = i + 1;
138 for(i = 0; i <
sys->memory[
sys->cpu->gr[2]]; i++) {
146 if(((w =
sys->memory[
sys->cpu->gr[1]+i]) >= 0x20 && w <= 0x7E) ||
147 (w >= 0xA0 && w <= 0xFE) ||
148 w == 0xA || w ==
'\t')
161 if((adr & 0x8000) == 0x8000) {
175 if((r = ((oprx & 0x00F0) >>4)) >
GRSIZE - 1) {
188 if((x = (oprx & 0x000F)) >
GRSIZE - 1) {
202 a +=
sys->cpu->gr[x];
217 return sys->memory[a];
265 assert(
sizeof(
short) * 8 == 16 && (
short)0xFFFF == -1);
266 if((tmp = (
short)(
sys->cpu->gr[r]) + (
short)val) > 32767 || tmp < -32768) {
270 sys->cpu->gr[r] = (
WORD)(tmp & 0xFFFF);
271 if((
sys->cpu->gr[r] & 0x8000) == 0x8000) {
273 }
else if(
sys->cpu->gr[r] == 0x0) {
330 if((s & 0x8000) == 0x8000) {
411 if((
short)
sys->cpu->gr[r] < (
short)val) {
413 }
else if(
sys->cpu->gr[r] == val) {
435 if(
sys->cpu->gr[r] < val) {
437 }
else if(
sys->cpu->gr[r] == val) {
460 WORD sign =
sys->cpu->gr[r] & 0x8000;
464 sys->cpu->gr[r] &= 0x7FFF;
465 for(
int i = 0; i <
get_adr_x(w[1], w[0]); i++) {
466 last =
sys->cpu->gr[r] & 0x4000;
467 sys->cpu->gr[r] <<= 1;
469 sys->cpu->gr[r] = sign | (
sys->cpu->gr[r] & 0x7FFF);
479 if(
sys->cpu->gr[r] == 0x0) {
489 WORD sign =
sys->cpu->gr[r] & 0x8000;
493 sys->cpu->gr[r] &= 0x7FFF;
494 for(
int i = 0; i <
get_adr_x(w[1], w[0]); i++) {
495 last =
sys->cpu->gr[r] & 0x1;
496 sys->cpu->gr[r] >>= 1;
498 sys->cpu->gr[r] |= 0x4000;
501 sys->cpu->gr[r] = sign |
sys->cpu->gr[r];
511 if(
sys->cpu->gr[r] == 0x0) {
524 for(
int i = 0; i <
get_adr_x(w[1], w[0]); i++) {
525 last =
sys->cpu->gr[r] & 0x8000;
526 sys->cpu->gr[r] <<= 1;
533 if((
sys->cpu->gr[r] & 0x8000) > 0x0) {
537 if(
sys->cpu->gr[r] == 0x0) {
550 for(
int i = 0; i <
get_adr_x(w[1], w[0]); i++) {
551 last =
sys->cpu->gr[r] & 0x0001;
552 sys->cpu->gr[r] >>= 1;
559 if((
sys->cpu->gr[r] & 0x8000) > 0x0) {
563 if(
sys->cpu->gr[r] == 0x0) {
572 if((
sys->cpu->fr &
SF) > 0) {
582 if((
sys->cpu->fr &
ZF) == 0) {
592 if((
sys->cpu->fr &
ZF) > 0) {
608 if((
sys->cpu->fr & (
SF |
ZF)) == 0) {
618 if((
sys->cpu->fr &
OF) > 0) {
639 if(
sys->cpu->sp >=
sys->memsize) {
652 sys->memory[--(
sys->cpu->sp)] =
sys->cpu->pr + 1;
658 assert(
sys->cpu->sp <=
sys->memsize);
659 if(
sys->cpu->sp ==
sys->memsize) {
661 }
else if(
sys->cpu->sp <
sys->memsize) {
662 sys->cpu->pr =
sys->memory[(
sys->cpu->sp)++] + 1;
686 CLOCK clock_begin = 0;
688 void (*cmdptr)() = NULL;
690 const char *monmsg =
"COMET II machine code monitor. Type ? for help.\n";
696 clock_begin = clock();
702 if(
execptr->started ==
false) {
704 fprintf(stdout,
"%s", monmsg);
709 if(
sys->cpu->pr >=
sys->memsize) {
733 fprintf(stdout,
"Return to top.\n");
741 }
while(clock_end - clock_begin < CLOCKS_PER_SEC / sys->clocks);
748 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)
配列のサイズを返すマクロ
long str2l_range(const char *str, long min, long max, const char *name)
数値文字列が特定の範囲の数値かチェックし、正の場合は変換した数値、不正の場合は0を返す
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.
CLOCK clock_str2clock(const char *str)
クロック周波数を表す数値文字列を、正の整数値であるCLOCK型の数値に変換。変換できない場合は、エラーを表示して0を返す
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 dsp_trace_dump()
COMET IIのレジスタとメモリを実行状況と設定に応じて表示する
void monitor()
COMET IIモニターを起動する
bool getbps(WORD adr)
ブレークポイント表にアドレスがある場合はtrue、ない場合はfalseを返す
void freebps()
ブレークポイント表を解放する
bool create_cmdtable(CMDTAB_HASH hash)
命令ハッシュ表を作成する
void * getcmdptr(WORD code)
void free_cmdtable(CMDTAB_HASH hash)
SYSTEM * sys
COMET IIの仮想実行マシンシステム
WORD getcmdwordlen(const char *cmd, CMDTYPE type)
EXECMODE execmode
実行モード: trace, logical, dump, reverse, monitor, step
unsigned short WORD
16ビットの数値を表すデータ型