You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
3.7KB

  1. #include "../src/ChipSym.hpp"
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <map>
  5. #include <set>
  6. #include <cassert>
  7. int main( int argc, char ** argv )
  8. {
  9. std::cout << "Testing chip periods" << std::endl;
  10. ChipSym::NESNoise noise( 0.0f, 1.0f, 44100 );
  11. noise.setPeriod( 2 );
  12. noise.setModeFlag( true );
  13. for( int i=0; i<5; ++i )
  14. {
  15. // So lets start by testing if 31 gives us 31 and 93 gives us 93
  16. int ct = 0;
  17. noise.setShortLength( ChipSym::NESNoise::SHORT_31 );
  18. unsigned short target = noise.getRegister();
  19. do { ct ++; noise.advanceRegister(); } while( noise.getRegister() != target );
  20. assert( ct == 31 );
  21. noise.setShortLength( ChipSym::NESNoise::SHORT_93 );
  22. target = noise.getRegister();
  23. ct = 0;
  24. do { ct ++; noise.advanceRegister(); } while( noise.getRegister() != target && ct < 100 );
  25. assert( ct == 93 );
  26. }
  27. std::map< int, std::pair< unsigned short, int > > resultMap;
  28. std::map< unsigned short, int > sequenceMap;
  29. int sequenceID = 0;
  30. for( unsigned short iRegister=1; iRegister < 0x7FFF; iRegister ++ )
  31. {
  32. bool newSeq = false;
  33. noise.setRegister( iRegister );
  34. // step off my initial point into the sequence
  35. while( noise.getRegister() == iRegister ) noise.advanceRegister();
  36. unsigned short target = noise.getRegister();
  37. bool gotR = false;
  38. int stepC = 0;
  39. if( sequenceMap.find( noise.getRegister() ) == sequenceMap.end() ) {
  40. sequenceID ++;
  41. newSeq = true;
  42. }
  43. while( ! gotR )
  44. {
  45. ++stepC;
  46. if( newSeq )
  47. sequenceMap[ noise.getRegister() ] = sequenceID;
  48. noise.advanceRegister();
  49. if( noise.getRegister() == target )
  50. {
  51. if( resultMap.find( stepC ) == resultMap.end() )
  52. {
  53. resultMap[ stepC ] = std::pair< unsigned short, int >( target, 1 );
  54. }
  55. else
  56. resultMap[ stepC ].second ++;
  57. gotR = true;
  58. }
  59. }
  60. }
  61. std::cout << "Unique sequence count is " << sequenceID << " " << sequenceMap.size() << "\n";
  62. // Invert sequenceMap
  63. std::map< int, std::set< unsigned short > > inverseSequenceMap;
  64. for( auto smapKey = sequenceMap.begin(); smapKey != sequenceMap.end(); ++smapKey )
  65. {
  66. inverseSequenceMap[ smapKey->second ].insert( smapKey->first );
  67. }
  68. std::map< int, int > lenMap;
  69. lenMap[ 93 ] = 0;
  70. lenMap[ 31 ] = 0;
  71. for( auto imapKey = inverseSequenceMap.begin(); imapKey != inverseSequenceMap.end(); ++imapKey )
  72. {
  73. lenMap[ imapKey->second.size() ] ++;
  74. }
  75. std::cout << "Count[ 93 ] = " << lenMap[ 93 ] << "\nCount[ 31 ] = " << lenMap[ 31 ] << "\n";
  76. for( auto imapKey = inverseSequenceMap.begin(); imapKey != inverseSequenceMap.end(); ++imapKey )
  77. {
  78. std::cout << "Seq: " << std::setw( 4 ) << std::setfill( ' ' ) << std::setbase( 10 ) << imapKey->first << " Len = " << imapKey->second.size() << " ";
  79. int ct = 0;
  80. for( auto secKey = imapKey->second.begin(); secKey != imapKey->second.end() && ct < 8; ++secKey, ++ct )
  81. {
  82. std::cout << " 0x" << std::setw( 4 ) << std::setbase( 16 ) << std::setfill( '0' ) << *secKey;
  83. }
  84. std::cout << "\n";
  85. }
  86. // Finally dump the c structure
  87. std::cout << "unsigned short start_for_93s[] = {\n ";
  88. int ct = 0;
  89. for( auto imapKey = inverseSequenceMap.begin(); imapKey != inverseSequenceMap.end(); ++imapKey, ++ct )
  90. {
  91. if( imapKey->second.size() == 93 )
  92. std::cout << std::setbase( 10 ) << *( imapKey->second.begin() ) << ", ";
  93. if( (ct+1) % 15 == 0 )
  94. std::cout << "\n ";
  95. }
  96. std::cout << " 0 };\n";
  97. }