log_io.c 2.5 KB

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