44 fprintf(stderr,
"%04X: Breakpoint is already defined.\n", adr);
75 for(; p->
next != NULL; p = p->
next) {
94 fprintf(stdout,
"List of breakpoints\n");
96 for(p =
bps[i]; p != NULL; p = p->
next) {
97 fprintf(stdout,
"#%04X\n", p->
adr);
102 fprintf(stdout,
"(No breakpoints.)\n");
110 for(p = head; p != NULL; p = q) {
132 if(!str || !str[0]) {
137 int i = strcspn(p,
" ");
141 }
while(sepc ==
' ');
153 if(!line[0] || line[0] ==
'\n') {
164 i = strcspn(p,
" \t\n");
168 while(*p ==
' ' || *p ==
'\t') {
172 if(strcspn(p,
"\n") > 0) {
182 bool stracmp(
char *str1,
int str2c,
char *str2v[])
188 for(i = 0; i < str2c; i++) {
189 if(strcmp(str1, str2v[i]) == 0) {
199 for(i = 0; i < argc; i++) {
201 fprintf(stderr,
" ");
203 fprintf(stderr,
"%s", argv[i]);
205 fprintf(stderr,
": ignored.\n");
212 if(
stracmp(argv[0], 2, (
char* []){
"l",
"list"})) {
215 }
else if(
stracmp(argv[0], 2, (
char* []){
"r",
"reset"})) {
218 fprintf(stdout,
"All breakpoints are deleted.\n");
221 if((w =
nh2word(argv[1])) == 0x0) {
222 fprintf(stderr,
"%s: address error\n", argv[1]);
225 if(
stracmp(argv[0], 2, (
char* []){
"a",
"add"})) {
228 fprintf(stdout,
"#%04X: breakpoint added\n", w);
230 fprintf(stdout,
"No breakpoint added\n");
232 }
else if(
stracmp(argv[0], 2, (
char* []){
"d",
"del"})) {
235 fprintf(stdout,
"#%04X: breakpoint deleted\n", w);
237 fprintf(stdout,
"No breakpoint deleted\n");
239 }
else if(
stracmp(argv[0], 3, (
char* []){
"?",
"h",
"help"})) {
241 fprintf(stdout,
"breakpoint manipulate:\n");
242 fprintf(stdout,
" b[reak] a[dd] <address>\n");
243 fprintf(stdout,
" b[reak] d[el] <address>\n");
244 fprintf(stdout,
" b[reak] l[ist]\n");
245 fprintf(stdout,
" b[reak] r[eset]\n");
247 fprintf(stderr,
"%s: Not breakpoint manipulate command. see `b ?'.\n", argv[0]);
258 WORD dump_start = 0, dump_end = 0x40;
259 if(argc > 0 &&
stracmp(argv[0], 2, (
char* []){
"a",
"auto"})) {
262 }
else if(argc > 0 &&
stracmp(argv[0], 2, (
char* []){
"no",
"noauto"})) {
267 dump_start =
nh2word(argv[i++]);
269 if(argv[i][0] ==
'+') {
270 dump_end = dump_start +
nh2word(argv[i] + 1);
275 dump_end += dump_start;
290 if(
stracmp(cmd, 2, (
char* []){
"a",
"assemble"})) {
291 if(args->
argc == 0) {
292 fprintf(stderr,
"Error: Input file name.\n");
293 }
else if(args->
argc == 1) {
298 }
else if(
stracmp(cmd, 2, (
char* []){
"b",
"break"})) {
300 }
else if(
stracmp(cmd, 2, (
char* []){
"c",
"continue"})) {
303 }
else if(
stracmp(cmd, 2, (
char* []){
"d",
"dump"})) {
305 }
else if(
stracmp(cmd, 2, (
char* []){
"l",
"load"})) {
307 }
else if(
stracmp(cmd, 2, (
char* []){
"n",
"next"})) {
310 }
else if(
stracmp(cmd, 2, (
char* []){
"q",
"quit"})) {
311 fprintf(stdout,
"Quit: COMET II monitor\n");
313 }
else if(
stracmp(cmd, 2, (
char* []){
"r",
"reverse"})) {
314 if(args->
argc == 2) {
317 }
else if(
stracmp(cmd, 1, (
char* []){
"reset"})) {
318 fprintf(stdout,
"Reset COMET II.\n");
320 }
else if(
stracmp(cmd, 2, (
char* []){
"t",
"trace"})) {
321 if(args->
argc > 0 &&
stracmp(args->
argv[0], 2, (
char* []){
"a",
"auto"})) {
324 }
else if(args->
argc > 0 &&
stracmp(args->
argv[0], 2, (
char* []){
"no",
"noauto"})) {
327 fprintf(stdout,
"#%04X: Register::::\n",
sys->
cpu->
pr);
330 }
else if(
stracmp(cmd, 2, (
char* []){
"T",
"tracelogical"})) {
331 if(args->
argc > 0 &&
stracmp(args->
argv[0], 2, (
char* []){
"a",
"auto"})) {
334 }
else if(args->
argc > 0 &&
stracmp(args->
argv[0], 2, (
char* []){
"no",
"noauto"})) {
337 fprintf(stdout,
"#%04X: Register::::\n",
sys->
cpu->
pr);
340 }
else if(
stracmp(cmd, 3, (
char* []){
"?",
"h",
"help"})) {
341 fprintf(stdout,
"b[reak] -- Manipulate Breakpoints. See details, `b ?'.\n");
342 fprintf(stdout,
"c[ontinue] -- Continue running your program.\n");
343 fprintf(stdout,
"d[ump] -- Display memory dump. `d[ump] a[uto]/n[oauto]' set auto/noauto display.\n");
344 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");
345 fprintf(stdout,
"n[ext] -- Go next instruction.\n");
346 fprintf(stdout,
"q[uit] -- Quit running your program.\n");
347 fprintf(stdout,
"reset -- Reset the system.\n");
348 fprintf(stdout,
"r[everse] -- Disassemble memory. `r[everse] <start address> <end address>.\n");
349 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");
350 fprintf(stdout,
"t[race] -- Display CPU register. `t[race] a[uto]/n[oauto]' set auto/noauto display. \n");
351 fprintf(stdout,
"T[race] -- Display CPU register as logical value. `t[race] a[uto]/n[oauto]' set auto/noauto display. \n");
352 fprintf(stdout,
"?/h[elp] -- Display this help.\n");
360 assert(moncmdl != NULL);
361 if(moncmdl->
args != NULL) {
362 for(i = 0; i < moncmdl->
args->
argc; i++) {
367 if(moncmdl->
cmd != NULL) {
370 if(moncmdl != NULL) {
403 fprintf(stdout,
"%s\n", buf);
bool assemble(int filec, char *filev[], WORD adr)
指定された1つまたは複数のファイルを2回アセンブル
void freecerr()
エラーリストと現在のエラーを解放する
char * strndup_chk(const char *s, size_t len, const char *tag)
malloc_chkを実行してメモリを確保し、コピーした文字列の指定した長さの部分を返す
#define FREE(ptr)
メモリを解放するマクロ
void strip_end(char *s)
文字列の末尾から、改行と空白とタブを削除する
char * strdup_chk(const char *s, const char *tag)
malloc_chkを実行してメモリを確保し、コピーした文字列を返す
void strip_casl2_comment(char *s)
文字列から「'」以降の文字列をCASL IIのコメントとして削除する。「''」の場合は除く
void * malloc_chk(size_t size, const char *tag)
mallocを実行し、0で初期化する
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のプロンプト
MONCMDLINE * monlinetok(const char *line)
行から、モニターの命令と引数を取得する
MONCMDTYPE monitorcmd(char *cmd, MONARGS *args)
モニターの命令を実行する
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[])
MONARGS * monargstok(const char *str)
文字列から、モニターの引数を取得する
unsigned adrhash(WORD adr)
アドレスのハッシュ値を返す
void freebpslist(BPSLIST *head)
bool stracmp(char *str1, int str2c, char *str2v[])
void freebps()
ブレークポイント表を解放する
bool delbps(WORD adr)
ブレークポイント表からアドレスを削除する
bool addbps(WORD adr)
ブレークポイント表にアドレスを追加する
void mon_dump(int argc, char *argv[])
void reset(int memsize, int clocks)
void free_cmdtable(CMDTAB_HASH hash)
SYSTEM * sys
COMET IIの仮想実行マシンシステム
EXECMODE execmode
実行モード: trace, logical, dump, monitor, step
unsigned short WORD
16ビットの数値を表すデータ型
WORD nh2word(const char *str)
10進数または16進数の文字列をWORD値に変換する