| 1 | #include <stdio.h> |
| 2 | |
| 3 | typedef struct |
| 4 | { |
| 5 | unsigned int addr_min, addr_max; |
| 6 | int r8, r16, r32, w8, w16, w32; |
| 7 | } io_log_location; |
| 8 | |
| 9 | static io_log_location io_locations[] = |
| 10 | { |
| 11 | { 0x400000, 0x9FFFFF, 0, }, // unused |
| 12 | { 0xa00000, 0xa03fff, 0, }, // z80 RAM |
| 13 | { 0xa04000, 0xa05fff, 0, }, // ym2612 |
| 14 | { 0xa06000, 0xa060ff, 0, }, // bank reg |
| 15 | { 0xa06100, 0xa07eff, 0, }, // unused |
| 16 | { 0xa07f00, 0xa07fff, 0, }, // vdp |
| 17 | { 0xa08000, 0xa0ffff, 0, }, // 0xa00000-0xa07fff mirror |
| 18 | { 0xa10000, 0xa1001f, 0, }, // i/o |
| 19 | { 0xa10020, 0xa10fff, 0, }, // expansion |
| 20 | { 0xa11000, 0xa110ff, 0, }, // expansion |
| 21 | { 0xa11100, 0xa11101, 0, }, // z80 busreq |
| 22 | { 0xa11102, 0xa111ff, 0, }, // expansion |
| 23 | { 0xa11200, 0xa11201, 0, }, // z80 reset |
| 24 | { 0xa11202, 0xbfffff, 0, }, // expansion |
| 25 | { 0xc00000, 0xc00003, 0, }, // vdp data port |
| 26 | { 0xc00004, 0xc00007, 0, }, // vdp control |
| 27 | { 0xc00009, 0xc0000f, 0, }, // hv counter |
| 28 | { 0xc00010, 0xc00017, 0, }, // PSG |
| 29 | { 0xc00018, 0xc0001f, 0, }, // unused |
| 30 | { 0xc00020, 0xdfffff, 0, } // vdp mirrors |
| 31 | }; |
| 32 | |
| 33 | |
| 34 | void log_io(unsigned int a, int bits, int is_write) |
| 35 | { |
| 36 | int i; |
| 37 | a &= 0x00ffffff; |
| 38 | if (bits > 8) a&=~1; |
| 39 | |
| 40 | for (i = 0; i < sizeof(io_locations)/sizeof(io_locations[0]); i++) |
| 41 | { |
| 42 | if (a >= io_locations[i].addr_min && a <= io_locations[i].addr_max) |
| 43 | { |
| 44 | switch (bits|(is_write<<8)) { |
| 45 | case 0x008: io_locations[i].r8 ++; break; |
| 46 | case 0x010: io_locations[i].r16++; break; |
| 47 | case 0x020: io_locations[i].r32++; break; |
| 48 | case 0x108: io_locations[i].w8 ++; break; |
| 49 | case 0x110: io_locations[i].w16++; break; |
| 50 | case 0x120: io_locations[i].w32++; break; |
| 51 | default: printf("%06x %i %i\n", a, bits, is_write); break; |
| 52 | } |
| 53 | } |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | void log_io_clear(void) |
| 58 | { |
| 59 | int i; |
| 60 | for (i = 0; i < sizeof(io_locations)/sizeof(io_locations[0]); i++) |
| 61 | { |
| 62 | io_log_location *iol = &io_locations[i]; |
| 63 | iol->r8 = iol->r16 = iol->r32 = iol->w8 = iol->w16 = iol->w32 = 0; |
| 64 | } |
| 65 | } |
| 66 | |
| 67 | void log_io_dump(void) |
| 68 | { |
| 69 | int i; |
| 70 | printf(" range : r8 r16 r32 w8 w16 w32\n"); |
| 71 | for (i = 0; i < sizeof(io_locations)/sizeof(io_locations[0]); i++) |
| 72 | { |
| 73 | io_log_location *iol = &io_locations[i]; |
| 74 | if (iol->r8 == 0 && iol->r16 == 0 && iol->r32 == 0 && iol->w8 == 0 && iol->w16 == 0 && iol->w32 == 0) |
| 75 | continue; |
| 76 | printf("%06x - %06x : %8i %8i %8i %8i %8i %8i\n", iol->addr_min, iol->addr_max, |
| 77 | iol->r8, iol->r16, iol->r32, iol->w8, iol->w16, iol->w32); |
| 78 | } |
| 79 | printf("\n"); |
| 80 | } |
| 81 | |