LDA #$59   >   $0413: 2C 2A 04   BIT $042A
                     ||   >          ||         |||
                     ||   >          ||         |||
               STA $0413  >   $0413: 59 2A 04   EOR $042A,Y
      
               The innocuous BIT instruction has instantly been
               transformed into EOR - the favorite scrambling tool of
               copy protection programmers everywhere. Every sector
               transmitted from this point on will be EOR'd with the
               drive code before it's sent to the computer. Consider
               what happens if just ONE byte of the drive code from
               $042A - $0529 is altered: the main GEOS KERNAL,
               excluding work areas and disk drivers, is approximately
               16384 bytes. If 1 byte of every 254 is wrong, we have
               64 bytes with unknown values occupying our operating
               system, a system error for every occasion!
      
      $0495:   The next few instructions should seem familiar if
               you've been reading closely. They start the load of the
               second segment - the GEOS cold start routine at $5000.
               Look again at the VLIR block of the GEOS KERNAL: the
               third set of track/sector pointers reads - you got it -
               $14/$0F, consistent with what we've learned so far.
      
      $049F:   Something different is happening here.  If you've
               done your homework, you'll recognize the 1541 SEARCH
               subroutine $F510. This searches the current track for
               the specified sector header GCR bytes, the first eight
               of them significant and the rest as filler preceding
               the sector data block. If SEARCH fails to find a sync
               mark and 1541's normal error handler instead of
               returning to the fast loader.
      
      $04A7:   And here's the main attraction, ladies and
               gentlemen. Read two GCR bytes with JSR $04F3.
      
      $04C2:   Congratulations! You've just entered the BYTE COUNT
               ZONE. The protection check is checking the tail gap of
               every header and data block on the current track ($14)
               for 2 precisely located bytes. The X register contains
               the sector count ($13 = 19 dec). The protection check
               loops as follows: JSR $0502: This routine waits for
               either a GCR $55 or $67 in the current header/tail gap.
               If neither byte appears, the return address is pulled
               off the stack. The protection has failed and is
               getting ready to call it a day. 
      
      $04B0:   Count $100 (256) GCR bytes on the track.
      
      $04B5:   Count $45 (69) GCR bytes on the track. We've just
      
            K.J. REVEALED TRILOGY    PAGE [110]    (C)1990 K.J.P.B.


<<previous page - next page>>