From a4bae75d2ae4ad722d22902edb8bc83038c4a166 Mon Sep 17 00:00:00 2001 From: michaelangel007 Date: Thu, 17 Jul 2014 20:42:19 -0700 Subject: [PATCH] Documented #206 existing and new -memclear options with "In Development" in History.txt -memclear 0 Initialize memory to zero -memclear 1 Initialize memory to random values -memclear 2 Initialize memory to 4 byte pattern: FF FF 00 00 -memclear 3 Initialize memory to even pages FF, odd pages 00 -memclear 4 Initialize memory to first half page 00, last half page FF -memclear 5 Initialize memory to first half page FF, last half page 00 -memclear 6 Initialize memory to byte offset of page (current memory address low byte) -memclear 7 Initialize memory to page address (current memory address high byte) --- bin/History.txt | 22 ++++++++++++++++++++++ source/Memory.cpp | 34 +++++++++++++++++++++++++++++----- source/Memory.h | 2 ++ 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/bin/History.txt b/bin/History.txt index 9ec02394..e12d4128 100644 --- a/bin/History.txt +++ b/bin/History.txt @@ -13,6 +13,28 @@ Restrictions/bugs: - SSI263 emulation is very basic: there is no attempt to emulate rate, inflection or filters. - During Mockingboard playback, Speaker emulation isn't precise + +In Development: +--------------- +Changes: +. Added command line switch to specify the type of memory initialization pattern. + -memclear # + Where # ranges from 0 to 7. + i.e. + -memclear 0 Initialize memory to zero + -memclear 1 Initialize memory to random values + -memclear 2 Initialize memory to 4 byte pattern: FF FF 00 00 + -memclear 3 Initialize memory to even pages FF, odd pages 00 + -memclear 4 Initialize memory to first half page 00, last half page FF + -memclear 5 Initialize memory to first half page FF, last half page 00 + -memclear 6 Initialize memory to byte offset of page + (current memory address low byte) + -memclear 7 Initialize memory to page address + (current memory address high byte) +Fixed: +. [Bug #206] Pooyan freezes due to RNDL/RNDH not initialized to non-zero values + + Latest: ------- diff --git a/source/Memory.cpp b/source/Memory.cpp index 39d63e75..3231f292 100644 --- a/source/Memory.cpp +++ b/source/Memory.cpp @@ -1392,14 +1392,10 @@ void MemReset () // F2, Ctrl-F2, F7, HGR DWORD clock = getRandomTime(); - if ((g_nMemoryClearType >= 0) && (g_nMemoryClearType != MIP_RANDOM)) + if (g_nMemoryClearType >= 0) g_eMemoryInitPattern = static_cast(g_nMemoryClearType); else // random - { g_eMemoryInitPattern = static_cast( clock % NUM_MIP ); - if (g_eMemoryInitPattern == MIP_RANDOM) // Twice Lucky! Force a choice. - g_eMemoryInitPattern = MIP_FF_FF_00_00; - } switch( g_eMemoryInitPattern ) { @@ -1442,6 +1438,34 @@ void MemReset () for( iByte = 0x0000; iByte < 0xC000; iByte += 256 ) memset( &memmain[ iByte ], 0xFF, 128 ); break; + + case MIP_RANDOM: + unsigned char random[ 256 + 4 ]; + for( iByte = 0x0000; iByte < 0xC000; iByte += 256 ) + { + for( int i = 0; i < 256; i++ ) + { + clock = getRandomTime(); + random[ i+0 ] ^= (clock >> 0) & 0xFF; + random[ i+1 ] ^= (clock >> 11) & 0xFF; + } + + memcpy( &memmain[ iByte ], random, 256 ); + } + break; + + case MIP_PAGE_ADDRESS_LOW: + for( iByte = 0x0000; iByte < 0xC000; iByte++ ) + memmain[ iByte ] = iByte & 0xFF; + break; + + case MIP_PAGE_ADDRESS_HIGH: + for( iByte = 0x0000; iByte < 0xC000; iByte += 256 ) + memset( &memmain[ iByte ], (iByte >> 8), 256 ); + break; + + default: // MIP_ZERO -- nothing to do + break; } // https://github.com/AppleWin/AppleWin/issues/206 diff --git a/source/Memory.h b/source/Memory.h index 660bb2fc..eff65273 100644 --- a/source/Memory.h +++ b/source/Memory.h @@ -20,6 +20,8 @@ enum MemoryInitPattern_e , MIP_FF_00_FULL_PAGE , MIP_00_FF_HALF_PAGE , MIP_FF_00_HALF_PAGE + , MIP_PAGE_ADDRESS_LOW + , MIP_PAGE_ADDRESS_HIGH , NUM_MIP }; extern MemoryInitPattern_e g_eMemoryInitPattern;