home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG036.ARK / SCRAMBLE.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  6KB  |  320 lines

  1. ;
  2. ;Scramble.asm - program to scramble CP/M files
  3. ;using an 8 byte password
  4. ;
  5. month    equ    3    ;last..
  6. day    equ    14    ;..modification..
  7. year    equ    79    ;..date
  8. ;
  9. ;Scrambling is done in place, i.e. the file is
  10. ;modified on top of itself.  The same password
  11. ;used to scramble the file is used to unscramble
  12. ;it, using the exact same command.  This is because
  13. ;the scrambling code is exclusive-or'ed with the
  14. ;data file, and two same exclusive ors result
  15. ;in the original value being returned.
  16. ;
  17. ;Command format:
  18. ;
  19. ;    scramble filename.type password
  20. ;
  21. ;where password is any 8 character string which
  22. ;is allowable as a file name (i.e. no '.', etc).
  23. ;
  24. MF    SET    0    ;SHOW MOVE NOT REQUESTED
  25. CF    SET    0    ;SHOW COMP NOT REQUESTED
  26. ;
  27. ;(FROM EQU8.LIB...)
  28. ;DEFINE SOME MACROS TO MAKE THINGS EASIER
  29. ;
  30. ;DEFINE DATA MOVE MACRO: MOVE from,to,length
  31. ;    from may be addr, or quoted string
  32. ;
  33. MOVE    MACRO    ?F,?T,?L
  34.     IF    NOT NUL ?F
  35.     IRPC    ?C,?F
  36. ?Q    SET    '&?C&?C' ;;TEST FOR QUOTE
  37.     EXITM
  38.     ENDM
  39.     IF    ?Q EQ ''''
  40.     LOCAL    ?B,?Z
  41.     CALL    ?Z
  42. ?B    DB    ?F
  43. ?Z    POP    H    ;GET FROM
  44.     LXI    B,?Z-?B    ;GET LEN
  45.     ELSE
  46.     LXI    H,?F
  47.     ENDIF
  48.     ENDIF
  49.     IF    NOT NUL ?T
  50.     LXI    D,?T
  51.     ENDIF
  52.     IF    NOT NUL ?L
  53.     LXI    B,?L
  54.     ENDIF
  55.     CALL    MOVER
  56. MF    SET    -1    ;;SHOW EXPANSION
  57.     ENDM
  58. ;
  59. ;DEFINE CP/M MACRO - CPM FNC,PARM
  60. ;
  61. CPM    MACRO    ?F,?P
  62.     PUSH    B
  63.     PUSH    D
  64.     PUSH    H
  65.     IF    NOT NUL ?F
  66.     MVI    C,?F
  67.     ENDIF
  68.     IF    NOT NUL ?P
  69.     LXI    D,?P
  70.     ENDIF
  71.     CALL    BDOS
  72.     POP    H
  73.     POP    D
  74.     POP    B
  75.     ENDM
  76. ;
  77.     ORG    100H
  78.     CALL    START
  79.     DB    'SCRAMBLE.COM AS OF '
  80.     DB    '0'+MONTH/10
  81.     DB    '0'+MONTH MOD 10,'/'
  82.     DB    '0'+DAY/10
  83.     DB    '0'+DAY MOD 10,'/'
  84.     DB    '0'+YEAR/10
  85.     DB    '0'+YEAR MOD 10
  86.     DB    0DH,0AH,'$'
  87. START    POP    D    ;GET ID
  88.     MVI    C,PRINT
  89.     CALL    BDOS    ;PRINT ID
  90. ;
  91. ;INIT LOCAL STACK
  92. ;
  93.     LXI    H,0
  94.     DAD    SP
  95.     SHLD    STACK
  96.     LXI    SP,STACK
  97. ;
  98. ;START OF PROGRAM EXECUTION
  99. ;
  100. ;SCRAMBLE A WHILE TO MIX UP THE SEED
  101. ;
  102.     MVI    H,0    ;GET 256 #'S
  103. MIXUP    CALL    PSEURAN    ;GET A #
  104.     DCR    H    ;MORE?
  105.     JNZ    MIXUP    ;LOOP IF SO
  106. ;
  107. ;SEE THAT THE PASSWORD IS 8 CHARACTERS
  108. ;    
  109.     LDA    FCB2+8
  110.     CPI    ' '
  111.     JNZ    PWIS8
  112.     CALL    ERXIT
  113.     DB    '++ PASSWORD NOT 8 BYTES ++$'
  114. ;
  115. ;SAVE THE PASSWORD
  116. ;
  117. PWIS8    MOVE    FCB2+1,PASSWD,8
  118. ;
  119. ;PASSWORD IS 8 BYTES, NOW MAKE SURE NO CHARACTER
  120. ;IS REPEATED MORE THAN 2 TIMES
  121. ;
  122.     LXI    H,PASSWD
  123.     MVI    B,8    ;8 CHARS TO TEST
  124. DUPTEST    CALL    CKDUP    ;ABORTS IF 3 = CHARS
  125.     INX    H    ;TO NEXT CHAR
  126.     DCR    B
  127.     JNZ    DUPTEST
  128. ;
  129. ;SEE THAT THE INPUT FILE EXISTS
  130. ;
  131.     CPM    OPEN,FCB
  132.     INR    A    ;OK?
  133.     JNZ    SCRAMLP    ;YES, SCRAMBLE IT
  134.     CALL    ERXIT
  135.     DB    '++NO SUCH FILE++$'
  136. ;
  137. ;READ THE FILE, SCRAMBLE A SECTOR, RE-WRITE IT.
  138. ;
  139. SCRAMLP    CALL    RDSECT    ;READ A SECTOR
  140.     JC    FINISH    ;EXIT LOOP IF EOF
  141.     CALL    SCRAMBL    ;SCRAMBLE IT
  142.     CALL    BACKUP    ;RE-POSITION FOR WRITE
  143.     CALL    WRSECT    ;RE-WRITE THE SECTOR
  144.     JMP    SCRAMLP    ;LOOP UNTIL EOF
  145. ;
  146. ;ALL DONE - ON A "NORMAL" CP/M SYSTEM, WE WOULDN'T
  147. ;HAVE TO DO ANYTHING, BECAUSE WE RE-WROTE IN PLACE.
  148. ;
  149. ;HOWEVER, FOR SUCH SYSTEMS AS THE NORTHSTAR CP/M,
  150. ;WE MUST EXPLICITLY CLOSE THE FILE, BECAUSE THE WRITE
  151. ;TO THE DIRECTORY WILL CAUSE THE CLEVER LIFEBOAT-
  152. ;DESIGNED BIOS TO FLUSH IT'S MEMORY-RESIDENT DISK
  153. ;BUFFERS
  154. ;
  155. FINISH    CPM    CLOSE,FCB
  156.     INR    A    ;THIS BETTER WORK..
  157.     JNZ    EXIT
  158.     DB    '++ CLOSE ERROR - FILE LEFT IN '
  159.     DB    'UNKNOWN CONDITION ++$'
  160. ;
  161. ;SECTOR READ ROUTINE
  162. ;
  163. RDSECT    CPM    READ,FCB
  164.     ORA    A
  165.     RZ        ;ALL OK
  166. ;
  167. ;READ ERROR OR EOF
  168. ;
  169.     CPI    1    ;EOF?
  170.     STC        ;CARRY SHOWS EOF
  171.     RZ        ;RET, CARRY SET
  172.     CALL    ERXIT
  173.     DB    '++ READ ERROR - FILE MAY BE '
  174.     DB    'DESTROYED ++$'
  175. ;
  176. ;SCRAMBLE THE SECTOR
  177. ;
  178. SCRAMBL    LXI    H,80H    ;POINT TO SECTOR
  179. SCRLP    CALL    PSEURAN    ;GET PSEUDO RANDOM #
  180.     XRA    M    ;SCRAMBLE
  181.     MOV    M,A
  182.     INR    L    ;MORE IN SECTOR?
  183.     JNZ    SCRLP
  184.     RET
  185. ;
  186. ;BACKUP THE FILE POINTER FOR THE RE-WRITE
  187. ;
  188. BACKUP    LDA    FCBRNO    ;GET SECTOR #
  189.     DCR    A    ;BACK UP
  190.     STA    FCBRNO
  191.     RP        ;RETURN IF OK
  192. ;
  193. ;WE BACKED UP INTO PREVIOUS EXTENT, WILL HAVE
  194. ;TO RE-OPEN IT
  195. ;
  196.     LDA    FCBEXT    ;GET EXTENT
  197.     DCR    A    ;BACK UP 1
  198.     STA    FCBEXT
  199.     CPM    OPEN,FCB ;RE-OPEN
  200.     INR    A
  201.     JNZ    OPEN2OK
  202.     CALL    ERXIT
  203.     DB    '++ RE-OPENING EXTENT FAILED',0DH,0AH
  204.     DB    '++ FILE IS CLOBBERED $'
  205. OPEN2OK    MVI    A,7FH    ;GET HI SECTOR
  206.     STA    FCBRNO
  207.     RET
  208. ;
  209. ;WRITE BACK THE SECTOR
  210. ;
  211. WRSECT    CPM    WRITE,FCB
  212.     ORA    A
  213.     RZ
  214.     CALL    ERXIT
  215.     DB    '++ WRITE ERROR - FILE CLOBBERED ++$'
  216. ;
  217. ;GET A PSEUDO-RANDOM 8 BIT NUMBER USING THE PASSWORD
  218. ;AS A SEED
  219. ;
  220. ;    FOR SPEED, THIS ROUTINE DOES NO REGISTER
  221. ;    PUSHES AND POPS, HOWEVER HL AREN'T USED.
  222. ;
  223. PSEURAN    MVI    C,4    ;GRAB EVERY 4TH PSEU. #
  224. PSEULP0    MVI    B,8    ;SHIFT THRU 8 BYTES
  225.     LXI    D,PASSWD
  226.     ORA    A    ;CLEAR INITIAL CARRY
  227. PSEULP1    LDAX    D    ;GET A CHAR
  228.     RAR        ;SHIFT
  229.     STAX    D
  230.     INX    D
  231.     DCR    B
  232.     JNZ    PSEULP1
  233. ;EXCLUSIVE-OR THE LAST FEW BITS INTO THE FIRST ONE
  234.     DCX    D    ;BACK UP TO LAST
  235.     RAR
  236.     RAR        ;SHIFT A FEW MORE
  237.     XCHG
  238.     XRA    M
  239.     RRC        ;SHIFT LO BIT INTO HI
  240.     ANI    80H    ;ISOLATE SINGLE BIT
  241.     LXI    H,PASSWD ;GET FIRST BYTE
  242.     ORA    M    ;'OR' IN THE BIT
  243.     MOV    M,A    ;MOVE IT BACK
  244.     XCHG        ;RESTORE HL
  245.     DCR    C
  246.     JNZ    PSEULP0    ;LOOP IF MORE PASSES
  247.     RET
  248. ;
  249. ;ROUTINE TO CHECK FOR DUPLICATE CHARS IN PASSWORD
  250. ;
  251. CKDUP    MVI    C,3    ;DUP CHAR COUNTER
  252.     LXI    D,PASSWD
  253.     MVI    A,8    ;CHAR COUNT
  254. CKDLP    PUSH    PSW    ;SAVE COUNT
  255.     LDAX    D    ;GET CHAR
  256.     CMP    M    ;DUP?
  257.     JNZ    CKNDUP
  258.     DCR    C    ;COUNT DUPS
  259.     JNZ    CKNDUP
  260.     STA    DUPCHAR    ;SAVE FOR PRINT
  261.     CALL    ERXIT
  262.     DB    '++ NO CHARACTER MAY APPEAR MORE '
  263.     DB    'THAN TWICE IN THE PASSWORD.  ',0DH,0AH
  264.     DB    ''''
  265. DUPCHAR    DB    $-$,''' DOES IN YOURS ++$'
  266. CKNDUP    INX    D
  267.     POP    PSW    ;GET COUNT
  268.     DCR    A
  269.     JNZ    CKDLP
  270.     RET        ;OK, NOT 3 DUP
  271. ;
  272. ;FOLLOWING FROM 'EQU7.LIB'---->
  273. ;
  274. ;MOVE SUBROUTINES
  275. ;
  276.     IF    MF    ;MACRO EXPANSION FLAG SET?
  277. MOVER    MOV    A,M
  278.     STAX    D
  279.     INX    H
  280.     INX    D
  281.     DCX    B
  282.     MOV    A,B
  283.     ORA    C
  284.     JNZ    MOVER
  285.     RET
  286.     ENDIF
  287. ;
  288. ;EXIT WITH ERROR MESSAGE
  289. MSGEXIT    EQU    $    ;EXIT W/"INFORMATIONAL" MSG
  290. ERXIT    POP    D    ;GET MSG
  291.     MVI    C,PRINT
  292.     CALL    BDOS
  293. ;EXIT, RESTORING STACK AND RETURN
  294. EXIT    LHLD    STACK
  295.     SPHL
  296.     RET        ;TO CCP
  297. PASSWD    DS    8    ;PASSWORD KEPT HERE
  298.     DS    40H    ;STACK AREA
  299. STACK    DS    2
  300. ;BDOS/CBIOS EQUATES (VERSION 7)    
  301. RDCON    EQU    1
  302. WRCON    EQU    2
  303. PRINT    EQU    9
  304. CONST    EQU    11
  305. OPEN    EQU    15
  306. CLOSE    EQU    16
  307. SRCHF    EQU    17
  308. SRCHN    EQU    18
  309. ERASE    EQU    19
  310. READ    EQU    20
  311. WRITE    EQU    21
  312. MAKE    EQU    22
  313. REN    EQU    23
  314. STDMA    EQU    26
  315. BDOS    EQU    5
  316. FCB    EQU    5CH 
  317. FCB2    EQU    6CH
  318. FCBEXT    EQU    FCB+12
  319. FCBRNO    EQU    FCB+32
  320.