ソースの推敲
[YACASL2.git] / src / dump.c
index 5362de4..19f429d 100644 (file)
@@ -1,37 +1,33 @@
-#include "casl2.h"
+#include "exec.h"
 
-/* WORD値を2進数表記に変換 */
-char *word2bit(const WORD word)
+/* exec.hに定義された関数群 */
+void dumpmemory(WORD start, WORD end)
 {
-    WORD mask = 0x8000;
-    char *bit, *p;
-    bit = malloc(16 + 1);
-    p = bit;
-    do {
-        *p++ = (word & mask) ? '1' : '0';
-    } while((mask >>= 1) > 0);
-    *p = '\0';
-    return bit;
-}
-
-/* COMET IIのメモリを表示 */
-void dumpmemory()
-{
-    const int col = 16;
-    int i;
+    const WORD col = 0x10;
+    WORD mod = 0;
     /* Header */
-    fprintf(stdout, "#%04X: adr :", PR);
-    for(i = 0; i < col; i++) {
+    fprintf(stdout, "#%04X: adr :", sys->cpu->pr);
+    if(end > sys->memsize) {
+        end = sys->memsize;
+    }
+    for(int i = 0; i < sys->memsize && i < col; i++) {
         fprintf(stdout, " %04X", i);
     }
     fprintf(stdout, "\n");
+    fprintf(stdout, "       -------------------------------------------------------------------------------------\n");
     /* Memory */
-    for(i = 0; i < memsize; i++) {
-        if(i % col == 0) {
-            fprintf(stdout, "#%04X: %04X: ", PR, i);
+    for(int i = start; i < end; i++) {
+        mod = i % col;
+        if(mod == 0 || i == start) {
+            fprintf(stdout, "#%04X: %04X: ", sys->cpu->pr, i);
         }
-        fprintf(stdout, "%04X", memory[i]);
-        if(i > 0 && (i + 1) % col == 0) {
+        if(i == start) {
+            for(int j = 0; j < mod; j++) {
+                fprintf(stdout, "     ");
+            }
+        }
+        fprintf(stdout, "%04X", sys->memory[i]);
+        if((i > 0 && (i + 1) % col == 0) || (i + 1) == end) {
             fprintf(stdout, "\n");
         } else {
             fprintf(stdout, " ");
@@ -39,20 +35,23 @@ void dumpmemory()
     }
 }
 
-/* COMET IIのレジスタを表示 */
 void dspregister()
 {
-    int i;
-    for(i = 0; i < REGSIZE; i++ ) {
-        if(logicalmode == true) {
-            fprintf(stdout, "#%04X: GR%d: %6d = #%04X = %s\n",
-                    PR, i, GR[i], GR[i], word2bit(GR[i]));
-        } else {
-            fprintf(stdout, "#%04X: GR%d: %6d = #%04X = %s\n",
-                    PR, i, (short)GR[i], GR[i], word2bit(GR[i]));
-        }
+    char *sp = word2bit(sys->cpu->sp);
+    char *pr = word2bit(sys->cpu->pr);
+    char *fr = word2bit(sys->cpu->fr);
+    enum {
+        L3BIT = 16 - 3,     /* WORD値16ビットのうち、下位3ビットの開始位置 */
+    };
+    for(int i = 0; i < GRSIZE; i++ ) {
+        fprintf(stdout, "#%04X: GR%d: ", sys->cpu->pr, i);
+        print_dumpword(sys->cpu->gr[i], execmode.logical);
+        fprintf(stdout, "\n");
     }
-    fprintf(stdout, "#%04X: SP:  %6d = #%04X = %s\n", PR, SP, SP, word2bit(SP));
-    fprintf(stdout, "#%04X: PR:  %6d = #%04X = %s\n", PR, PR, PR, word2bit(PR));
-    fprintf(stdout, "#%04X: FR (OF SF ZF): %s\n", PR, (word2bit(FR)+13));
+    fprintf(stdout, "#%04X: SP:  %6d = #%04X = %s\n", sys->cpu->pr, sys->cpu->sp, sys->cpu->sp, sp);
+    fprintf(stdout, "#%04X: PR:  %6d = #%04X = %s\n", sys->cpu->pr, sys->cpu->pr, sys->cpu->pr, pr);
+    fprintf(stdout, "#%04X: FR (OF SF ZF): %s\n", sys->cpu->pr, fr + L3BIT); /* FRは下位3けたを表示 */
+    FREE(sp);
+    FREE(pr);
+    FREE(fr);
 }