******************************************************************************
*                               LOCK & KEY                                   *
*                            by Jesse Devine                                 *
*                       (C) 1988 Antic Publishing Inc.                       *
*                                                                            *
*     Written 5/30/87 - 6/3/87 using A68, a public domain, and extremely     *
*     cantankerous assembler.                                                *
*                                                                            *
******************************************************************************
ABS   BRA      SHRI
      DC.L     $1B450D0A
      DC.B     'Sorry, Bud. Youre not going to find the password this way.'
      DC.W     $0D0A
      DC.B     'Why dont you just go about your business and leave this'
      DC.W     $0D0A
      DC.B     'persons files alone. Keep your nose where it belongs.'
      DC.L     $0D0A0D0A
      DC.L     $0D0A0D0A
      DC.L     $0D0AFFFF
****************************************
*      ADJUST PROGRAM MEMORY USAGE     *
****************************************
SHRI  MOVE.L   A7,A5           STORE USER STACK
      LEA      USSTK,A7        GET ADDRESS OF NEW STACK
      MOVE.L   4(A5),A5        GET BASE PAGE ADDRESS
      MOVE.L   $C(A5),D0       GET LENGTH OF PROGRAM AREA
      ADD.L    $14(A5),D0      ADD IN LENGTH OF INITIALIZED DATA
      ADD.L    $1C(A5),D0      ADD IN LENGTH OF UNINITIALIZED DATA
      ADD.L    #$100,D0        ADD IN 256 BYTES BASE PAGE
      MOVE.L   D0,-(A7)        MOVE RESERVE LENGTH ONTO STACK
      MOVE.L   A5,-(A7)        MOVE RESERVE ADDRESS ONTO STACK
      MOVE.W   #0,-(A7)        DUMMY WORD VALUE
      MOVE.W   #$4A,-(A7)      SETBLOCK FUNCTION NUMBER
      TRAP     #1              CALL GEMDOS
      ADD.L    #12,A7          FIX THE STACK
      TST.L    D0              CHECK FOR ERROR
      BNE      ERROR           IF SO, INDICATE GENERAL ERROR
****************************************
*    A L L O C A T E   M E M O R Y     *
****************************************
      MOVE.L   #$A00,-(A7)       ALLOCATE $A00 BYTES
      MOVE.W   #$48,-(A7)        MALLOC FUNCTION NUMBER
      TRAP     #1                CALL GEMDOS
      ADDQ.L   #6,A7             FIX THE STACK
      CMPI.L   #0,D0             CHECK FOR RETURN ERROR
      BEQ      ERROR             IF SO, PRINT ERROR MESSAGE
      MOVE.L   D0,BUFF
****************************************
* U N S C R A M B L E  P A S S W O R D *
****************************************
      LEA      PASS,A3           GET ADDRESS OF SCRAMBLED PASSWORD
LP4   CMPI.B   #0,(A3)           CHECK FOR END OF PASSWORD
      BEQ      DONE1             IF END, GO ON WITH OTHER STUFF
      ADDI.B   #1,(A3)           SHIFT PASSWORD BACK INTO PLACE,
      ADDI.L   #1,A3             INCREMENT PASSWORD POSITION,
      BRA      LP4               AND CONTINUE WITH LOOP
****************************************
*  U N S C R A M B L E   F O L D E R   *
****************************************
DONE1 LEA      FOLD,A3           GET ADDRESS OF SCRAMBLED FOLDER
LP5   CMPI.B   #0,(A3)           CHECK FOR END OF FOLDER NAME
      BEQ      DONE2             IF END, GO ON WITH OTHER STUFF
      ADDI.B   #1,(A3)           SHIFT FOLDER NAME BACK INTO PLACE,
      ADDI.L   #1,A3             INCREMENT FOLDER POSITION,
      BRA      LP5               AND CONTINUE WITH LOOP
****************************************
*   D E T E R M I N E   D R I V E  #   *
****************************************
DONE2 MOVE.W   #$19,-(A7)        CURRENT DRIVE FUNCTION #
      TRAP     #1                CALL GEMDOS
      ADDQ.L   #2,A7             FIX THE STACK
      MOVE.W   D0,DRIVE
****************************************
*   I N I T I é*
*                                                                             
*  S C R E E N  *
****************************************
      LEA      INIT,A0           GET ADDRESS OF INI8B                                                                       ET L
      BSR      PRT2              PRINT INIT STB                                                                       G
      LEA      TITGDRESS OF TITLE LINE
      BSR      PRT1              PB                                                                       T TITLE LINEnt    YGET ADDRESS OF   YRIGHT LINE
      BSR      PRT  PRIRIGHT LINEn
      BSR      SKIP              SKIP A LINE
****************************************
*     C H E   R A S S W O R D      *
****************************************
      LEA      PLEAGDRESS OF PROMPT ME   R      PRT1                T IT
      BSR      PROMP             GET PASSWORD FROM USER
      MOVE.L     0,-(ADDRESS OF USER PASSWORD -> A4nt       PASS,A3           ADDRESS OF INTER#  /8> A3
*
LP3   CMPI.B   #0,(A3)           CHECK FOR END OF INTERNAL PASSWORD
      BEQ      UPO  IF EQUAL, USER PASSWORD IS OK
*
  MPM.B   (A3)+,(A4)+       COMPARE MEMORY AND INCREMENT
      BNE      UPBAD             IF NOT EQUAL, USER PASSWORD IS BAD
      BRA      LP3               OTHERWISE, KEEP COMPAB                                                                       G
*
UPBAD BSR      SKIP              SKIR A LINE
      BSR      SKIR              SKIR ANOTHER LINE
      LEA      BADLOAD BAD  /ME SAGE ADDRESS
      BSR      PRT              AND  B                                                                       T IT
      BRA      STOP              THEN END THE PROGRAM
****************************************
*     DO THE HIDING OR THE SHOWING     *
****************************************
UPOK  BSR      SKIP              SKIP A LINE
      BSR      SKIP              SKIR ANOTHER ONEn
      LEA      SEARGDRESS OF SEARCHING ME  GE
      BSR      PRT2              PBINT ITnt       FOLD,A3           GET ADDRESS OF FOLDERnt       WORK,A4                                                                               T ADDRESS OF WORKSPACE
      MOVE.L   (A3)+,(A4)+       MOVE FIRST FOUR BYTES OF FOLDERNAME
      MOVE.L   (A3)+,(A4)+       MOVE LAST FOUR BYTES OF FOLDERNAME
      MOVE.B   #0,(A4)           END WITH A ZEROnt       WORK,A0                                                                               T THE STARTING ADDRESS OF NEW LOCATION
      BSR      PRT2              AND   T ITnt       PERD,A0           GET A PERIOD
 R      PRT2                T ITn
      MOVE.L   A3THEN GET ADDRESS OF EXTENSION
      BSR      PRT1              AND PRINT THAT TOO
      BSR      SKIR              THEN SKIR A LINE
*
      MOVE.L   BUFFT ADDRESS OF BUFFER
 R      RSEC              READ IN DIRECTORY SECTORS
      MOVE.L   BUFFT ADDRESS OF BUFFER
      BSR      RSEC              DO IT AGAIN FOR SAFETY
*
      MOVE.L   BUFFT THE ADDRESS OF THE BUFFER AGAINnt       FOLD,A1                                                                               T THE ADDRESS OF THE FOLDER NAME
      BSR      MATCH             PERFORM PATTERN MATCH
      TST.W    D0                CHECK FOR ERROR
      BMI      STOP              IF SO, END THE PROGRAM
*
      ADD.L    #11,A1            MOVE TO FILE ATTRIBUTE BYTE
      CMPI.B   #$02,(A1)         CHECK FOR HIDDEN FILE
      BEQ      SHOW              BRANCH TO SHOW FOLDER ROUTINE
      CMPI.B   #$10,(A1)         CHECK FOR FOLDER STATUS
      BEQ      HIDE              BRANCH TO HIDE FOLDER ROUTINE
*
      LEA      OOPSLOAD ME SAGE FOR NEITHER
      BSR      PRT B                                                                       T ME SAGE
      BRA      STOP              END THE PROGRAM
*
SHOW  MOVE.B   #$10,(A1)         CHANGE THE ATTRIBUTE BYTE TO FOLDERn
      MOVE.L   BUFFA0           RE-LOAD THE ADDRESS OF THE BUFFER
      BSR      WSEC              WRITE DIRECTORY SECTORS BACK
      BSR      FOOL              ALTER THE DISK'S SERIAL NUMBER
      LEA      M2,A0             LOAD ADDRESS OF UNLOCKED MESSAGE
 R      PRT                T UNLOCKED ME SAGE
      BRA      STOP              END THE PROGRAM
*
HIDE  MOVE.B   #$02,(  )         CHANGE THE ATTRIBUTE BYTE TO HIDDEN
      MOVE.L   BUFFA0           RE-LOAD THE ADDRESS OF THE BUFFER
      BSR      WSEC              WRITE DIRECTORY SECTORS BACK
      BSR      FOOL              ALTER THE DISK'S SERIAL NUMBER
      LEA      M10LOAD ADDRESS OF LOCKED ME  GE
      BSR      PRT1               B                                                                       T LOCKED ME SAGE
      BRA      STOP              END THE PROGRAM
****************************************
*        E N D  R R O G R A M         *
****************************************
STOP  LEA      DESK,A0           GET ADDRESS OF DESKTOP ME SAGE
      BSR      PRT1               B                                                                       T ITn
*
      MOVE.L   BUFFD0                                                                               T ADDRESS OF MEMORY BUFFER
      MOVE.L   D0,-(A7)          PUT THE ADDRESS ON THE STACK
      MOVE.W   #$49,-(A7)        PUT FUNCTION #MFREE ON STACK
      TRAP     #1                CALL GEMDOS TO DE-ALLOCATE MEMORY
      ADDQ.L   #6,A7             AND FIX THE STACK
*
      MOVE.W   #1,-(A7)          CONIN TO PAUSE THE PROGRAM
      TRAP     #1                CALL GEMDOS
      ADDQ.L   #2,A7             AND FIX THE STACK
*
      CLR.L    -(A7)             END THE PROGRAM
      TRAP     #1
****************************************
*              D A T A                 *
****************************************
TEMP3 DC.L     1
INI  DC.L     $1B450000         ESC-E, TO CLEAR SCREEN
DUM1  DS.L     1
FOLD  DC.B     'ENKCDQ^0EKC',0
PASS  DC.B     'O@RRVNQC',0
  Y  DC.B     '(C)1988 Antic Publishing, Inc.                   ',0
TITLE DC.B     'Lock & Key - by Jesse Devine',0
OOPS  DC.B     'That file is not a folder.',0
BAD   DC.B     'Invalid Password. ',0
M2    DC.B     'Folder Unlocked. ',0
M10   DC.B     'Folder Locked. ',0
DESK  DC.B     'Press any key to return to the desktop.',0
PLEA  DC.B     'Please enter your password:',0
SEAR  DC.B     'Searching for ',0
DRIVE DS.W     1
DUM2  DS.L     1
WORK  DS.B     20
PERD  DC.B     '.',0
BUFF  DS.L     1
      DS.L     256
USSTK DS.L     1
****************************************
*      W R I T E   S E  T O R S       *
****************************************
WSEC  MOVE.W   DRIVE,-(A7)       DRIVE NUMBER
      MOVE.W   #10-(A7)         STARTING SECTOR NUMBER
      MOVE.W   #5,-(A7)          NUMBER OF SECTORS TO BE WRITTEN
      MOVE.L   A0,-(A7)          SECTOR BUFFER ADDRESS
      MOVE.W   #1,-(A7)          WRITE SECTOR FLAG
      MOVE.W   #4,-(A7)          FUNCTION NUMBER
      TRAP     #13               CALL RWABS
      ADD.L    #14,A7            FIX THE STACK
      RTS                        RETURN
****************************************
*       R E A D   S E C T O R S        *
****************************************
RSEC  MOVE.W   DRIVE,-(A7)       DRIVE NUMBER
      MOVE.W   #10,-(A7)         STARTING SECTOR NUMBER
      MOVE.W   #5,-(A7)          NUMBER OF SECTORS TO BE READ
      MOVE.L   A0,-(A7)          SECTOR BUFFER ADDRESS
      MOVE.W   #0,-(A7)          READ SECTOR FLAG
      MOVE.W   #4,-(A7)          FUNCTION NUMBER
      TRAP     #13               CALL RWABS
      ADD.L    #14,A7            FIX THE STACK
      RTS                        RETURN
****************************************
*  THIS FUNCTION FOOLS THE DESKTOP     *
*  INTO THINKING THE DISK HAS BEEN     *
*  CHANGED BY ALTERING THE SERIAL      *
*  NUMBER IN THE BOO8ECTOR.          *
****************************************
FOOL  MOVE.W   DRIVE,-(A7)       DRIVE NUMBER
      MOVE.W   #0,-(A7)          STARTING SECTOR NUMBER
      MOVE.W   #1,-(A7)          NUMBER OF SECTORS TO BE READ
      LEA      BUFFA0           GET ADDRESS OF BUFFER
      MOVE.L   A0,-(A7)          SECTOR BUFFER ADDRESS
      MOVE.W   #0,-(A7)          READ SECTOR FLAG
      MOVE.W   #4,-(A7)          FUNCTION NUMBER
      TRAP     #13               CALL RWABS
      ADD.L    #14,A7            FIX THE STACK
*
      LEA      BUFFA0           GET ADDRESS OF BUFFER
      ADD.L    #10A0            MOVE TO SERIAL NUMBER
      ADD.B    #128,(A0)         INCREMENT SERIAL NUMBER BY 128
*
      MOVE.W   DRIVE,-(A7)       DRIVE NUMBER
      MOVE.W   #0,-(A7)          STARTING SECTOR NUMBER
      MOVE.W   #1,-(A7)          NUMBER OF SECTORS TO BE WRITTEN
      LEA      BUFFA0           GET ADDRESS OF BUFFER
      MOVE.L   A0,-(A7)          SECTOR BUFFER ADDRESS
      MOVE.W   #1,-(A7)          WRITE SECTOR FLAG
      MOVE.W   #4,-(A7)          FUNCTION NUMBER
      TRAP     #13               CALL RWABS
      ADD.L    #14,A7            FIX THE STACK
      RTS
****************************************
*              M A T C H               *
****************************************
MATCH MOVE.L    1,A3             A3 WILL BE ADDRESS OF INPUT
      MOVE.L   A0,A0,-(A4 WILL BE ADDRESS OF BUFFER PATTERN
*
      MOVE.L   A4,A6             MOVE BUFFER ADDRESS TO A6
      ADDI.L   #$1200,A6         THIS POINT IS THE END OF THE BUFFER
*
LP1   CMP.L    A4,A6             CHECK FOR END OF BUFFER
      BEQ      FAIL              IF END, MATCHING STOPS
*
      CMPM.B   (A3)+,(A4)+       COMPARE A3 WITH A4
      BEQ      FOUND             IF SAME, BRANCH OUT OF LOOP
      SUB.L    #1,A3             FIX ADDRESS OF INPUT STBING
      BRA      LP1               OTHERWISE, KEEP TRYING
*
FOUND MOVE.L   A3,TEMP1
      MOVE.L   A4,TEMP2
*
LP2   CMPI.B   #0,(A3)           CHECK FOR END OF FOLDER 8BING
      BEQ      SUCC              IF EQUAL, MATCH IS SUCCESSFUL
*
      CMPM.B   (A3)+,(A4)+       COMPARE MEMORY AND INCREMENT
      BNE      REDO              IF NOT EQUAL, MATCH FAILS
      BRA      LP2               OTHERWISE, KEEP COMPAB                                                                       G
*
REDO  MOVE.L   TEMP1,A3          RESTORE ORIGINAL FOLDER POSITION
      SUB.L    #1,A3             FIX IT'S ADDRESS
      MOVE.L   TEMP2,A0          RESTORE BUFFER POSITION
      BRA      LP1               GO ON WITH FIRST-CHARACTER 8EARCH
*
SUCC  MOVE.W   #0,D0             INDICATE SUCCESS IN D0
      MOVE.L   TEMP2,A1          PUT PATTER# POSITION IN    FOR RETURN
      SUB.L    #1,A1             FIX IT BY ONE
      RTS                        AND RETURN
*
FAIL  LEA      ME S3,A0                    GDRESS OF FAILURE MESSAGE
      BSR      PRT              PBINT ITn
      MOVE.W   #-1,D0            INDICATE FAILURE IN D0
      RTS                        AND RETURN
*
TEMP1 DS.L     1                 STORAGE FOR ADDRESS OF INPUT 8BIGET L
TEMP2 DS.L     1                 STORAGE FOR ADDRESS OF PATTERN
ME S3 DC.B     'Folder not present on this disk.',0
****************************************
*           P R I N T   # 1            *
****************************************
PRT1  MOVE.L    0,-(A7)
      MOVE.W   #$09,-(A7)
      TRAP     #1
      ADD.L    #6,A7nt       RET,A0
      MOVE.L   A0,-(A7)
      MOVE.W   #$09,-(A7)
      TRAP     #1
      ADD.L    #6,A7
      RTS
RET   DC.L     $0D0A0000
****************************************
*           P R I N T   # 2            *
****************************************
PRT2  MOVE.L   A0,-(A7)
      MOVE.W   #$09,-(A7)
      TRAP     #1
      ADD.L    #6,A7
      RTS
****************************************
*           S K I P   L I N E          *
****************************************
SKIP  LEA      BLANK,A0
      BSR      PRT2
      RTS
BLANK DC.L     $0D0A0000
****************************************
*              P R O M P T             *
**************************************** 
PROMP MOVE.W   #'>',-(A7)     PUT PROMPT ADDRESS ON STACK
      MOVE.W   #2,-(A7)       CONOUT OPCODE
      TRAP     #1             CALL GEMDOS
      ADDQ.L   #4,A7          ADJUST STACK
*
      LEA      INPUT,A3       GET THE ADDRESS OF INPUT BUFFER
GET   MOVE.W   #$7,-(A7)      DIRECT CONIN FUNCTION NUMBER
      TRAP     #1             CALL GEMDOS
      ADDQ.L   #2,A7          FIX THE STACK
      MOVE.B   D0,D1          TAKE ONLY ONE BYTE FROM D0
*
      CMPI.B   #8,D1          CHECK FOR BACKSPACE
      BEQ      BACK           IF EQUAL, PERFORM BACKSPACE
*
  MPI.B   #13,D1         CHECK FOR RETURN KEY
      BEQ      NMORE          IF EQUAL, BRANCH TO NO MORE
*
      LEA      INPUT,A0       GET ORIGINAL BUFFER ADDRESS
      ADDQ.L   #8,A4          MOVE TO THE END OF THE BUFFER
  MP.L    A3,A4           HECK TO SEE IF AT END OF BUFFER
      BNE      STUFF          IF NOT, GO ON WITH OTHER STUFF
*
      BSR      BELL           SOUND THE BELL
      BRA      GET            AND GO BACK TO THE MAIN LOOP
*
STUFF CMPI.B   #97,D1         CHECK FOR BOTTOM LOWERCASE THRESHOLD
      BLT      FOCI           IF BELOW LOWERCASE, IGNORE
      CMPI.B   #122,D1        CHECK FOR TOP OF LOWERCASE THRESHOLD
      BGT      FOCI           IF ABOVE LOWERCASE, IGNORE
      SUB.B    #32,D1         OTHERWISE, ADJUST LOWER TO UPPER
*
FOCI  MOVE.B   D1,(A3)        MOVE CHAR TO INPUT BUFFER
      ADDQ.L   #1,A3          AND INCREMENT BUFFER POSITION,
      MOVE.W   #'*',-(A7)     THEN PUT ASTERISK ON STACK
      MOVE.W   #2,-(A7)       PUT CONOUT FUNCTION NUMBER ON STACK
      TRAP     #1             AND CALL GEMDOS
      ADDQ.L   #4,A7
*
      BRA      GET            GET ANOTHER KEY
****************************************
*  B A   S R A C E    R O U T I N E  *
****************************************
BACK  LEA      INPUT,A0       GET ORIGI#  INPUT BUFFER ADDRESS
      CMP.l    A3A4           HECK CURRENT POINTER AGAINST IT
      BNE      REST           IF NOT EQUAL, DO THE REST OF ROUTINE
*
      BSR      BELL           OTHERWISE, SOUND THE BELL
      BRA      GET            THEN GO BACK TO MAIN LOOP
*
REST  LEA      SEQGDRESS OF BACKSPACE SEQUENCE
 R      PRT2           AND  B                                                                       T IT
*
      SUB.L    #1,A3          DECREMENT INPUT BUFFER POINTER
      BRA      GET            GO BACK TO MAIN LOOP
****************************************
*     R E T U R N   R O U T I N E      *
****************************************
NMORE MOVE.B   #0,(A3)        INSERT FINAL ZERO IN INPUT BUFFER
      LEA      INPUT,         MOVE THE BUFFER TO    FOR RETURN
      RTS                     AND RETURN
****************************************
INPUT DS.B     10
SEQ   DC.L     $08200800
****************************************
*        S O U N D   B E L L           *
****************************************
BELL  MOVE.W   #7,-(A7)       PUT BELL CHARACTER ON STACK
      MOVE.W   #2,-(A7)       PUT CONOUT FUNCTION NUMBER ON STACK
      TRAP     #1             CALL GEMDOS
      ADDQ.L   #4,A7          AND FIX THE STACK
      RTS                     RETURN
****************************************
*             E R R O R                *
****************************************
ERROR LEA      ME S,A0
      BSR      PRT2
*
      MOVE.W   #1,-(A7)
      TRAP     #1
      ADDQ.L   #2,A7n
*
      BRA      STOP
*
ME S  DC.B     'GENERAL ERROR. ',0
****************************************
      END

