original code are found, the program will not run even if the
         break is correct. Here's a trick to break the drive code and
         still keep the checksums intact.
      
      4) Turn the computer off and back on again to clear memory. X to
         BASIC  and from the Utility Disk, load the Block Read file
         < LOAD"BLOCK READ",8 >. When the ready prompt comes up. LIST
         the file and on line 10 set the TRack variable to 03 and the
         SEctor variable to 00. Hit RETURN to lock your changes in and
         relist the file to check your changes. This utility will Block
         Read Track 3/Sector 0 and send the code to $C000 in the computer
         where we can inspect it. Place the backup in the drive and start
         the Block Read by Typing RUN and hitting return. The drive will
         spin and in about 30 seconds, the ready prompt will appear.
         Return to the monitor by hitting Run/Stop-Restore. Disassemble
         code at $C000 . Cursor down through the code. The code
         from $C000-$C011 is the decryptor and will have to be executed
         before we can inspect the drive code. You'll see that it is set
         to decrypt this code in the $0400 buffer in the drive and must
         be readdressed to decrypt at $C000. Using the Memory Command,
         change the 04 at $C006, $C009, $C00C, and $C00F to C0. Now
         Disassemble starting at $C000 again and check the decrypter
         again. It should now be set up to decrypt code in the $C000
         buffer.

      5) Let's execute the decrypter and inspect code. Type , and
         when the monitor breaks, Disassemble code at $C000  and
         cursor down through the code. The code from $C012-$C04C checks
         Track 35, bumps the head a half track and if the check is
         satisfactory, stores a 0 in $0009. The Instruction at $C04D
         loads the accumulator with the value in $0009. Next, if that
         value is not a 0, the code branches around the next two
         instructions. These are the keys to the protection. The value of
         $FF is stored at $01FF in the drive memory. Later a Memory Read
         in the computer code will check for the $FF and if it is in
         place at $01FF, the protection check will be passed. Our job now
         is to force this routine to pass even if the protection isn't in
         place. One way would be to place two NOPs ($EA) at $C050 to
         erase the BNE C057. This would force the code to fall through
         and store the $FF byte even if protection wasn't passed. This
         would work, but the checksum would catch us. Here's a trick to
         force the code to fall through and still pass the checksum.
      
      6) Because the key to this break is the BNE command at $C050, let's
         flip those bytes and see what instruction comes up. Use the
         Memory command to change the D0 05 at $C050 to 05 D0 .
         Disassemble $C050 again . The BNE instruction has now
         become an ORA D0. This has effectively negated the BNE because
         this instruction is essentially worthless and performs no task
         that is actually used. The checksum will also pass because we

            K.J. REVEALED TRILOGY    PAGE [33]     (C)1990 K.J.P.B.

<<previous page - next page>>