77 { 201,
"Program Register (PR) - memory overflow" },
78 { 202,
"Stack Pointer (SP) - stack overflow" },
79 { 203,
"Stack Pointer (SP) - stack underflow" },
80 { 204,
"OP in word #1 - not command code" },
81 { 205,
"r/r1 in word #1 - not GR" },
82 { 206,
"x/r2 in word #1 - not GR" },
83 { 207,
"address in word #2 - out of memory" },
84 { 208,
"SVC input - memory overflow" },
85 { 209,
"SVC output - memory overflow" },
97 sprintf(str,
"PR:#%04X", pr);
106 if(fgets(buf,
INSIZE, stdin) == NULL) {
110 for(i = 0; i <
INSIZE; i++) {
111 if(!buf[i] || buf[i] ==
'\n') {
139 (w >= 0xA0 && w <= 0xFE) ||
140 w == 0xA || w ==
'\t')
153 if((adr & 0x8000) == 0x8000) {
167 if((r = ((oprx & 0x00F0) >>4)) >
GRSIZE - 1) {
180 if((x = (oprx & 0x000F)) >
GRSIZE - 1) {
257 assert(
sizeof(
short) * 8 == 16 && (
short)0xFFFF == -1);
258 if((tmp = (
short)(
sys->
cpu->
gr[r]) + (
short)val) > 32767 || tmp < -32768) {
263 if((
sys->
cpu->
gr[r] & 0x8000) == 0x8000) {
322 if((s & 0x8000) == 0x8000) {
403 if((
short)
sys->
cpu->
gr[r] < (
short)val) {
457 for(
int i = 0; i <
get_adr_x(w[1], w[0]); i++) {
486 for(
int i = 0; i <
get_adr_x(w[1], w[0]); i++) {
516 for(
int i = 0; i <
get_adr_x(w[1], w[0]); i++) {
525 if((
sys->
cpu->
gr[r] & 0x8000) > 0x0) {
542 for(
int i = 0; i <
get_adr_x(w[1], w[0]); i++) {
551 if((
sys->
cpu->
gr[r] & 0x8000) > 0x0) {
678 clock_t clock_begin = 0;
679 clock_t clock_end = 0;
680 void (*cmdptr)() = NULL;
682 const char *monmsg =
"COMET II machine code monitor. Type ? for help.\n";
687 fprintf(stdout,
"\nExecuting machine codes\n");
691 clock_begin = clock();
694 fprintf(stdout,
"#%04X: Register::::\n",
sys->
cpu->
pr);
698 fprintf(stdout,
"#%04X: Memory::::\n",
sys->
cpu->
pr);
701 fprintf(stdout,
"\n");
709 fprintf(stdout,
"%s", monmsg);
738 fprintf(stdout,
"Return to top.\n");
747 }
while(clock_end - clock_begin < CLOCKS_PER_SEC / sys->clocks);
754 fprintf(stderr,
"Execute error - %d: %s\n",
cerr->
num,
cerr->
msg);
void addcerrlist(int cerrc, CERR cerrv[])
エラーリストを作成・追加する
void setcerr(int num, const char *str)
現在のエラーを設定する
void exec()
COMET II仮想マシンを実行する
void and_r_adr_x()
AND命令 - オペランドr,adr,x。語長2.
void suba_r1_r2()
SUBA命令 - オペランドr1,r2。語長1.
void cpl_r_adr_x()
CPL命令 - オペランドr,adr,x。語長2.
void sra()
SRA命令 - オペランドr,adr,x。語長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.
void srl()
SRL命令 - オペランドr,adr,x。語長2.
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.
void subl_r1_r2()
SUBL命令 - オペランドr1,r2。語長1.
void cpa_r1_r2()
CPA命令 - オペランドr1,r2。語長1.
void nop()
NOP命令。語長1(OPのみ)
void cpa_r_adr_x()
CPA命令 - オペランドr,adr,x。語長2.
void and_r1_r2()
AND命令 - オペランドr1,r2。語長1.
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.
void addl_r_adr_x()
ADDL命令 - オペランドr,adr,x。語長2.
void sll()
SLL命令 - オペランドr,adr,x。語長2.
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.
#define FREE(ptr)
メモリを解放するマクロ
#define ARRAYSIZE(array)
配列のサイズを返すマクロ
void * malloc_chk(size_t size, const char *tag)
mallocを実行し、0で初期化する
void svcin()
標準入力から文字データを読込(SVC 1)
void cpl(WORD r, WORD val)
void adda(WORD r, WORD val)
void svcout()
標準出力へ文字データを書出(SVC 2)
WORD get_val_adr_x(WORD adr, WORD oprx)
2つのWORD値からadr[,x]のアドレスに格納されている値を取得
char * pr2str(WORD pr)
プログラムレジスタ(PR)を表すWORD値を文字列に変換
WORD get_adr_x(WORD adr, WORD oprx)
2つのWORD値からadr[,x]を取得
WORD get_x_r2(WORD oprx)
WORD値からx/r2を取得
WORD get_r_r1(WORD oprx)
WORD値からr/r1を取得
void addl_gr(WORD r, WORD val, bool add)
void cpa(WORD r, WORD val)
void addcerrlist_exec()
実行エラーをエラーリストに追加する
static CERR cerr_exec[]
実行エラーの定義
void setfr(WORD adr)
ロード/論理積/論理和/排他的論理和のフラグ設定。OFは常に0
EXECMODE execmode
実行モード: trace, logical, dump, dump_start, dump_end, monitor, step
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)
命令ハッシュ表を作成する
void free_cmdtable(CMDTAB_HASH hash)
SYSTEM * sys
COMET IIの仮想実行マシンシステム
const void * getcmdptr(WORD code)
unsigned short WORD
16ビットの数値を表すデータ型