root/src/dump.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. dumpmemory
  2. dspregister
  3. dsp_trace_dump

   1 #include "exec.h"
   2 #include "struct.h"
   3 #include "disassemble.h"
   4 
   5 /* exec.hに定義された関数群 */
   6 void 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 
  40 void dspregister()
  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 
  61 void dsp_trace_dump()
  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);
  69             dspregister();
  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 }

/* [<][>][^][v][top][bottom][index][help] */