YACASL2
Loading...
Searching...
No Matches
dump.c
Go to the documentation of this file.
1#include "exec.h"
2#include "struct.h"
3#include "disassemble.h"
4
5/* exec.hに定義された関数群 */
6void dumpmemory(WORD start, WORD end)
7{
8 const WORD col = 0x10;
9 WORD mod = 0;
10 /* Header */
11 fprintf(stdout, "#%04X: adr :", sys->cpu->pr);
12 if(end > sys->memsize) {
13 end = sys->memsize;
14 }
15 for(int i = 0; i < sys->memsize && i < col; i++) {
16 fprintf(stdout, " %04X", i);
17 }
18 fprintf(stdout, "\n");
19 fprintf(stdout, " -------------------------------------------------------------------------------------\n");
20 /* Memory */
21 for(int i = start; i < end; i++) {
22 mod = i % col;
23 if(mod == 0 || i == start) {
24 fprintf(stdout, "#%04X: %04X: ", sys->cpu->pr, i);
25 }
26 if(i == start) {
27 for(int j = 0; j < mod; j++) {
28 fprintf(stdout, " ");
29 }
30 }
31 fprintf(stdout, "%04X", sys->memory[i]);
32 if((i > 0 && (i + 1) % col == 0) || (i + 1) == end) {
33 fprintf(stdout, "\n");
34 } else {
35 fprintf(stdout, " ");
36 }
37 }
38}
39
41{
42 char *sp = word2bit(sys->cpu->sp);
43 char *pr = word2bit(sys->cpu->pr);
44 char *fr = word2bit(sys->cpu->fr);
45 enum {
46 L3BIT = 16 - 3, /* WORD値16ビットのうち、下位3ビットの開始位置 */
47 };
48 for(int i = 0; i < GRSIZE; i++ ) {
49 fprintf(stdout, "#%04X: GR%d: ", sys->cpu->pr, i);
50 print_dumpword(sys->cpu->gr[i], execmode.logical);
51 fprintf(stdout, "\n");
52 }
53 fprintf(stdout, "#%04X: SP: %6d = #%04X = %s\n", sys->cpu->pr, sys->cpu->sp, sys->cpu->sp, sp);
54 fprintf(stdout, "#%04X: PR: %6d = #%04X = %s\n", sys->cpu->pr, sys->cpu->pr, sys->cpu->pr, pr);
55 fprintf(stdout, "#%04X: FR (OF SF ZF): %s\n", sys->cpu->pr, fr + L3BIT); /* FRは下位3けたを表示 */
56 FREE(sp);
57 FREE(pr);
58 FREE(fr);
59}
60
62{
63 if(execptr->stop == false && (execmode.dump == true || execmode.trace == true || execmode.reverse == true)) { /* traceまたはdumpオプション指定時、改行を出力 */
64 if(sys->cpu->pr == execptr->start && execmode.reverse == true) { /* reverseオプション指定時、スタート時にプログラム全体を逆アセンブル */
65 disassemble_memory(sys->memory, execptr->start, (execptr->end)-1);
66 }
67 if(execmode.trace == true) { /* traceオプション指定時、レジスタを出力 */
68 fprintf(stdout, "#%04X: Register::::\n", sys->cpu->pr);
70 }
71 if(execmode.dump == true) { /* dumpオプション指定時、メモリを出力 */
72 fprintf(stdout, "#%04X: Memory::::\n", sys->cpu->pr);
73 dumpmemory(execmode.dump_start, execmode.dump_end);
74 }
75 if(execmode.reverse == true) { /* reverseオプション指定時、ステップごとに語長分を逆アセンブル */
76 fprintf(stdout, "#%04X: Disassemble::::", sys->cpu->pr);
77 disassemble_memory(sys->memory, sys->cpu->pr, sys->cpu->pr + code2cmdwordlen(sys->memory[sys->cpu->pr] & 0xFF00) - 1);
78 }
79 fprintf(stdout, "\n");
80 }
81}
#define FREE(ptr)
メモリを解放するマクロ
Definition cmem.h:22
void disassemble_memory(WORD *memory, WORD start, WORD end)
メモリーを逆アセンブルし、標準出力へ出力する
void dumpmemory(WORD start, WORD end)
COMET IIのメモリを表示する
Definition dump.c:6
void dspregister()
COMET IIのレジスタを表示する
Definition dump.c:40
void dsp_trace_dump()
COMET IIのレジスタとメモリを実行状況と設定に応じて表示する
Definition dump.c:61
WORD code2cmdwordlen(WORD code)
Definition struct.c:294
@ GRSIZE
Definition struct.h:19
EXECPTR * execptr
Definition struct.c:13
SYSTEM * sys
COMET IIの仮想実行マシンシステム
Definition struct.c:8
EXECMODE execmode
実行モード: trace, logical, dump, reverse, monitor, step
Definition exec.c:90
char * word2bit(const WORD word)
WORD値を2進数の文字列に変換する
Definition word.c:120
unsigned short WORD
16ビットの数値を表すデータ型
Definition word.h:9
void print_dumpword(WORD word, bool logicalmode)
WORD値を解析して表示する
Definition word.c:137