OSDN Git Service

sprite debug added.
authorastoria-d <astoria-d@mail.goo.ne.jp>
Sun, 25 Sep 2016 02:52:40 +0000 (11:52 +0900)
committerastoria-d <astoria-d@mail.goo.ne.jp>
Sun, 25 Sep 2016 02:52:40 +0000 (11:52 +0900)
.gitignore
emulator/debug.c
emulator/ppucore/ppucore.c

index 683013d..b571ddd 100644 (file)
@@ -7,3 +7,5 @@ tags
 *.a
 *.lnk
 emulator/opcode
+bin/*.log
+bin/*.txt
index 0069cbf..bfad8c3 100644 (file)
 extern int debug_mode;
 void dump_6502(int full);
 void dump_vram(unsigned short addr, int size);
+void dump_sprite_ram(unsigned short addr, int size);
 void dump_mem(unsigned short addr, int size);
 unsigned char vram_data_get(unsigned short addr);
+unsigned char spr_ram_tbl_get(unsigned short offset);
 unsigned char dbg_get_byte(unsigned short addr);
 unsigned short dbg_get_short(unsigned short addr);
 void dump_ppu_reg(void);
@@ -19,6 +21,7 @@ void d1_set(int on_off);
 void d2_set(int on_off);
 void d3_set(int on_off);
 void d4_set(int on_off);
+void d6_set(int on_off);
 void reset_cpu(void);
 unsigned long get_clock_cnt(void);
 unsigned int get_nmi_cnt(void);
@@ -53,12 +56,14 @@ static void print_debug(void) {
     printf("         show: show registers\n");
     printf("        pshow: show ppu registers\n");
     printf("  v addr size: vram dump\n");
+    printf("  spr addr size: sprite dump\n");
     printf("  da addr size: disassemble\n");
     printf("   d1 on/off: debug log level 1 (dump instruction on execution)\n");
     printf("   d2 on/off: debug log level 2 (dump reg status for each instruction)\n");
     printf("   d3 on/off: debug log level 3 (dump load/store data value)\n");
     printf("   d4 on/off: debug log level 4 (dump vram data write)\n");
     printf("   d5 on/off: debug log level 5 (dump clock counter w/ d1)\n");
+    printf("   d6 on/off: debug log level 6 (report sprite hit position)\n");
     printf("            q: quit emulator\n");
 }
 
@@ -181,6 +186,18 @@ int emu_debug(void) {
                 printf("d5 parameter must be either [on] or [off].\n");
             }
         }
+        else if (!strcmp(buf, "d6")){
+            scanf("%s", buf);
+            if (!strcmp(buf, "on")){
+                d6_set(TRUE);
+            }
+            else if (!strcmp(buf, "off")){
+                d6_set(FALSE);
+            }
+            else {
+                printf("d6 parameter must be either [on] or [off].\n");
+            }
+        }
         else if (!strcmp(buf, "b")){
             unsigned int val;
             scanf("%x", &val);
@@ -210,6 +227,13 @@ int emu_debug(void) {
             scanf("%d", &size);
             dump_vram(addr, size);
         }
+        else if (!strcmp(buf, "spr")){
+            unsigned int addr;
+            int size;
+            scanf("%x", &addr);
+            scanf("%d", &size);
+            dump_sprite_ram(addr, size);
+        }
         else if (!strcmp(buf, "da")){
             unsigned int addr;
             int size;
@@ -336,6 +360,32 @@ void dump_vram(unsigned short addr, int size) {
     printf("\n");
 }
 
+void dump_sprite_ram(unsigned short addr, int size) {
+    int i;
+
+    if (addr % BYTES_PER_LINE)
+        printf("%04x: ", addr % BYTES_PER_LINE);
+
+    for (i = 0; i < addr % BYTES_PER_LINE; i++) {
+        printf("   ");
+    }
+    for (i = 0; i < size; i++) {
+        if (addr % BYTES_PER_LINE == 0)
+            printf("%04x: ", addr);
+
+        printf("%02x ", spr_ram_tbl_get(addr));
+
+        if (addr % BYTES_PER_LINE == (BYTES_PER_LINE / 2) - 1)
+            printf("  ");
+
+        if (addr % BYTES_PER_LINE == (BYTES_PER_LINE - 1))
+            printf("\n");
+
+        addr++;
+    }
+    printf("\n");
+}
+
 void dump_mem(unsigned short addr, int size) {
     int i;
     unsigned char vram_data_get(unsigned short addr);
@@ -369,6 +419,7 @@ void break_hit(void) {
     printf("------------------\nbreak...\n");
     debug_mode = TRUE;
     dump_6502(TRUE);
+    d1_set(TRUE);
 }
 
 
index 5310e78..8b46916 100644 (file)
@@ -111,6 +111,8 @@ static unsigned int     vram_read_cnt;
 static int scan_x;
 static int scan_y;
 
+static int d6_flag;
+
 static int scan_recovery(void) {
     if (scan_y == VSCREEN_HEIGHT)
         return FALSE;
@@ -315,6 +317,9 @@ unsigned char ppu_vram_data_get(void) {
 void sprite0_hit_set(void) {
     //dprint("sprite0 set...\n");
     status_reg.sprite0_hit = 1;
+    if (d6_flag == TRUE) {
+        printf("sprite hit @(%d, %d)\n", scan_x, scan_y);
+    }
 }
 
 void sprite_overflow_set(void) {
@@ -344,6 +349,8 @@ int init_ppucore(void) {
     scan_x = 0;
     scan_y = 0;
 
+    d6_flag = FALSE;
+
     ret = init_vga_xfer();
     if (!ret)
         return FALSE;
@@ -415,3 +422,7 @@ void dump_ppu_reg(void) {
     printf(" y:%d\n", scroll_reg.y);
 }
 
+void d6_set(int on_off) {
+    d6_flag = on_off;
+}
+