2#include <readline/readline.h>
3#include <readline/history.h>
48 fprintf(stderr,
"%04X: Breakpoint is already defined.\n", adr);
79 for(; p->
next != NULL; p = p->
next) {
98 fprintf(stdout,
"List of breakpoints\n");
100 for(p =
bps[i]; p != NULL; p = p->
next) {
101 fprintf(stdout,
"#%04X\n", p->
adr);
106 fprintf(stdout,
"(No breakpoints.)\n");
114 for(p = head; p != NULL; p = q) {
136 if(!str || !str[0]) {
141 int i = strcspn(p,
" ");
145 }
while(sepc ==
' ');
157 if(!line[0] || line[0] ==
'\n') {
168 i = strcspn(p,
" \t\n");
172 while(*p ==
' ' || *p ==
'\t') {
176 if(strcspn(p,
"\n") > 0) {
186bool stracmp(
char *str1,
int str2c,
char *str2v[])
192 for(i = 0; i < str2c; i++) {
193 if(strcmp(str1, str2v[i]) == 0) {
203 fprintf(stderr,
"Info: arguments '");
204 for(i = 0; i < argc; i++) {
206 fprintf(stderr,
" ");
208 fprintf(stderr,
"%s", argv[i]);
210 fprintf(stderr,
"' are ignored.\n");
217 if(
stracmp(argv[0], 2, (
char* []){
"l",
"list"})) {
220 }
else if(
stracmp(argv[0], 2, (
char* []){
"r",
"reset"})) {
223 fprintf(stdout,
"All breakpoints are deleted.\n");
226 if((w =
nh2word(argv[1])) == 0x0) {
227 fprintf(stderr,
"%s: address error\n", argv[1]);
230 if(
stracmp(argv[0], 2, (
char* []){
"a",
"add"})) {
233 fprintf(stdout,
"#%04X: breakpoint added\n", w);
235 fprintf(stdout,
"No breakpoint added\n");
237 }
else if(
stracmp(argv[0], 2, (
char* []){
"d",
"del"})) {
240 fprintf(stdout,
"#%04X: breakpoint deleted\n", w);
242 fprintf(stdout,
"No breakpoint deleted\n");
244 }
else if(
stracmp(argv[0], 3, (
char* []){
"?",
"h",
"help"})) {
246 fprintf(stdout,
"breakpoint manipulate:\n");
247 fprintf(stdout,
" b[reak] a[dd] <address>\n");
248 fprintf(stdout,
" b[reak] d[el] <address>\n");
249 fprintf(stdout,
" b[reak] l[ist]\n");
250 fprintf(stdout,
" b[reak] r[eset]\n");
252 fprintf(stderr,
"%s: Not breakpoint manipulate command. see `b ?'.\n", argv[0]);
263 WORD dump_start = 0, dump_end = 0x40;
264 if(
stracmp(argv[0], 2, (
char* []){
"a",
"auto"})) {
266 }
else if(
stracmp(argv[0], 2, (
char* []){
"no",
"noauto"})) {
270 dump_start =
nh2word(argv[i++]);
272 if(argv[i][0] ==
'+') {
273 dump_end = dump_start +
nh2word(argv[i] + 1);
275 dump_end =
nh2word(argv[i]) + 1;
278 dump_end += dump_start;
293 if(
stracmp(cmd, 2, (
char* []){
"a",
"assemble"})) {
294 if(args->
argc == 0) {
295 fprintf(stderr,
"Error: Input file name.\n");
296 }
else if(args->
argc == 1) {
301 }
else if(
stracmp(cmd, 2, (
char* []){
"b",
"break"})) {
303 }
else if(
stracmp(cmd, 2, (
char* []){
"c",
"continue"})) {
306 }
else if(
stracmp(cmd, 2, (
char* []){
"d",
"dump"})) {
308 }
else if(
stracmp(cmd, 2, (
char* []){
"l",
"load"})) {
310 }
else if(
stracmp(cmd, 2, (
char* []){
"n",
"next"})) {
313 }
else if(
stracmp(cmd, 2, (
char* []){
"q",
"quit"})) {
314 fprintf(stdout,
"Quit: COMET II monitor\n");
316 }
else if(
stracmp(cmd, 2, (
char* []){
"r",
"reverse"})) {
317 if(args->
argc == 2) {
320 }
else if(
stracmp(cmd, 1, (
char* []){
"reset"})) {
321 fprintf(stdout,
"Reset COMET II CPU.\n");
323 }
else if(
stracmp(cmd, 1, (
char* []){
"resetall"})) {
324 fprintf(stdout,
"Reset COMET II CPU and memory.\n");
326 }
else if(
stracmp(cmd, 2, (
char* []){
"t",
"trace"})) {
327 if(args->
argc > 0 &&
stracmp(args->
argv[0], 2, (
char* []){
"a",
"auto"})) {
330 }
else if(args->
argc > 0 &&
stracmp(args->
argv[0], 2, (
char* []){
"no",
"noauto"})) {
333 fprintf(stdout,
"#%04X: Register::::\n",
sys->cpu->pr);
336 }
else if(
stracmp(cmd, 2, (
char* []){
"T",
"tracelogical"})) {
337 if(args->
argc > 0 &&
stracmp(args->
argv[0], 2, (
char* []){
"a",
"auto"})) {
340 }
else if(args->
argc > 0 &&
stracmp(args->
argv[0], 2, (
char* []){
"no",
"noauto"})) {
343 fprintf(stdout,
"#%04X: Register::::\n",
sys->cpu->pr);
346 }
else if(
stracmp(cmd, 3, (
char* []){
"?",
"h",
"help"})) {
347 fprintf(stdout,
"!<system command> -- Run a system command.\n");
348 fprintf(stdout,
"b[reak] -- Manipulate Breakpoints. See details, `b ?'.\n");
349 fprintf(stdout,
"c[ontinue] -- Continue running your program.\n");
350 fprintf(stdout,
"d[ump] -- Display memory dump. `d[ump] a[uto]/n[oauto]' set auto/noauto display.\n");
351 fprintf(stdout,
"l[oad] -- Load object from a file to the memory. `l[oad] <filepath> <address>' if address is omitted, load to address 0.\n");
352 fprintf(stdout,
"n[ext] -- Go next instruction.\n");
353 fprintf(stdout,
"q[uit] -- Quit running your program.\n");
354 fprintf(stdout,
"reset -- Reset COMET II CPU.\n");
355 fprintf(stdout,
"resetall -- Reset COMET II CPU and memory.\n");
356 fprintf(stdout,
"r[everse] -- Disassemble memory. `r[everse] <start address> <end address>.\n");
357 fprintf(stdout,
"s[ave] -- Save object from the memory to a file. `s[ave] <filepath> [<start address1> [<end address>]]' if <start address> and <end address> is omitted, save the whole memory. if <end address> is omitted, save the memory after <start address>.\n");
358 fprintf(stdout,
"t[race] -- Display CPU register. `t[race] a[uto]/n[oauto]' set auto/noauto display. \n");
359 fprintf(stdout,
"T[race] -- Display CPU register as logical value. `t[race] a[uto]/n[oauto]' set auto/noauto display. \n");
360 fprintf(stdout,
"?/h[elp] -- Display this help.\n");
368 assert(moncmdl != NULL);
369 if(moncmdl->
args != NULL) {
370 for(i = 0; i < moncmdl->
args->
argc; i++) {
375 if(moncmdl->
cmd != NULL) {
378 if(moncmdl != NULL) {
399 static char *buf = NULL;
400 static char *last_buf = NULL;
414 if(last_buf == NULL) {
417 fprintf(stdout,
">\n");
419 buf =
strdup_chk(last_buf,
"monitor.buf_repeat");
426 last_buf =
strdup_chk(buf,
"monitor.last_buf");
429 fprintf(stdout,
"> %s\n", buf);
433 }
else if((moncmdl =
monlinetok(buf)) != NULL) {
bool assemble(int filec, char *filev[], WORD adr)
指定された1つまたは複数のファイルを2回アセンブル
void freecerr()
エラーリストと現在のエラーを解放する
#define FREE(ptr)
メモリを解放するマクロ
void strip_end(char *s)
文字列の末尾から、改行と空白とタブを削除する
char * strndup_chk(const char *s, size_t len, const char *tag)
malloc_chkを実行してメモリを確保し、コピーした文字列の指定した長さの部分を返す
void strip_casl2_comment(char *s)
文字列から「'」以降の文字列をCASL IIのコメントとして削除する。「''」の場合は除く
void * malloc_chk(size_t size, const char *tag)
mallocを実行し、0で初期化する
char * strdup_chk(const char *s, const char *tag)
malloc_chkを実行してメモリを確保し、コピーした文字列を返す
void disassemble_memory(WORD start, WORD end)
COMET IIのメモリーを逆アセンブルし、標準出力へ出力する
void dumpmemory(WORD start, WORD end)
COMET IIのメモリを表示する
void dspregister()
COMET IIのレジスタを表示する
unsigned hash(int keyc, HKEY *keyv[], int tabsize)
ハッシュ値を取得する
WORD loadassemble(const char *file, WORD start)
指定されたファイルからアセンブル結果を読み込む
void monitor()
COMET IIモニターを起動する
void free_moncmdline(MONCMDLINE *moncmdl)
static char * monitor_prompt
comet2monitorのプロンプト
MONCMDTYPE monitorcmd(char *cmd, MONARGS *args)
モニターの命令を実行する
MONARGS * monargstok(const char *str)
文字列から、モニターの引数を取得する
static BPSLIST * bps[BPSTABSIZE]
ブレークポイント表
void warn_ignore_arg(int argc, char *argv[])
引数が無視されることを表示する
bool getbps(WORD adr)
ブレークポイント表にアドレスがある場合はtrue、ない場合はfalseを返す
void mon_break(int argc, char *argv[])
unsigned adrhash(WORD adr)
アドレスのハッシュ値を返す
void freebpslist(BPSLIST *head)
bool stracmp(char *str1, int str2c, char *str2v[])
void freebps()
ブレークポイント表を解放する
bool delbps(WORD adr)
ブレークポイント表からアドレスを削除する
MONCMDLINE * monlinetok(const char *line)
行から、モニターの命令と引数を取得する
bool addbps(WORD adr)
ブレークポイント表にアドレスを追加する
int monquit()
モニター終了時の処理をする
void mon_dump(int argc, char *argv[])
struct _BPSLIST BPSLIST
ブレークポイント表を表すデータ型
void free_cmdtable(CMDTAB_HASH hash)
SYSTEM * sys
COMET IIの仮想実行マシンシステム
EXECMODE execmode
実行モード: trace, logical, dump, monitor, step
union HKEY::@132303155052201023056030363273137132157157107260 val
unsigned short WORD
16ビットの数値を表すデータ型
WORD nh2word(const char *str)
10進数または16進数の文字列をWORD値に変換する