Metropoli BBS
VIEWER: xorfile.asm MODE: TEXT (CP437)
;┌────────────────────────────────────────────────────────────────────────────┐
;│█▓▒░                                                                       ░│
;│▓▒░     XorFile.ASM                                                       ░▒│
;│▒░      Copyright (C) 1997 ·─═■│Æ∩■═─·                                   ░▒▓│
;│░                                                                       ░▒▓█│
;└────────────────────────────────────────────────────────────────────────────┘

include asm.inc

.model small
.stack 100h
.data
nBytes EQU 08000h

;┌────────────────────────────────────────────────────────────────────────────┐
;│ 6mb file w/ 1000h -> 22 s. , w/ 0f000h -> 14 s. (2mb cache flush =2-3 s.)  │
;│  ''  ''   ''  ''  -> 48 s. ,  '''''''' -> 18 s. (no cache!)                │
;│ compare with CLIPPER or C ! `8^)                                           │
;│ the performance is most on Buffer Xor-ing, done at speed of light.         │
;│ Amazing   ─┐                                                               │
;│ Superb    ─┼─>ASM!                                                         │
;│ Marvellous─┘                                                               │
;└────────────────────────────────────────────────────────────────────────────┘

;┌────────────────────────────────────────────────────────────────────────────┐
;│* Various data *                                                            │
;└────────────────────────────────────────────────────────────────────────────┘

logo    db CR,LF
        db "░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░",CR,LF
        db "▒    ▒ ▒▒ ▒   ▒▒ ▒▒▒ ▒    ▒   ▒▒   ▒▒▒   ▒   ▒▒   ▒ ▒▒ ▒ ▒▒    ▒   ▒▒  ▒▒  ▒  ▒",CR,LF
        db "▓▓▓▓ ▓ ▓▓ ▓ ▓▓▓▓ ▓▓▓ ▓ ▓▓ ▓ ▓▓ ▓ ▓▓ ▓▓ ▓▓▓ ▓▓ ▓ ▓▓▓ ▓▓ ▓ ▓▓▓▓▓ ▓ ▓▓▓ ▓▓ ▓ ▓ ▓ ▓",CR,LF
        db "████ █ ██ █ ████ █ █ █ ██ █ ██ █ ███ █ ███ █ ██ ███ ██ █ █████ █ ███ ██ █ █ █ █",CR,LF
        db "    ░ ░░░░ ░░░  ░ ░ ░ ░  ░ ░  ░ ░   ░ ░░░ ░ ░░ ░░░ ░  ░ ░     ░ ░░░ ░░░░ ░ ░ ░ ",CR,LF
        db "    ▓ ▓  ▓ ▓    ▓ ▓ ▓ ▓  ▓ ▓  ▓ ▓   ▓ ▓   ▓  ▓ ▓   ▓  ▓ ▓     ▓ ▓   ▓  ▓ ▓   ▓ ",CR,LF
        db "    █ █  █ ███  ██ ██ ████ █  █ ████  ███ █  █ █   ████ ███   █ ███ █  █ █   █ ",CR,LF
        db "≡≡≡≡▒≡▒≡≡▒≡▒▒▒≡≡▒▒≡▒▒≡▒▒▒▒≡▒≡≡▒≡▒▒▒▒≡≡▒▒▒≡▒≡≡▒≡▒≡≡≡▒▒▒▒≡▒▒▒≡≡≡▒≡▒▒▒≡▒≡≡▒≡▒≡≡≡▒≡",CR,LF
        db "====▒=▒▒▒▒=▒====▒=▒=▒=▒==▒=▒==▒=▒===▒=▒===▒==▒=▒===▒==▒=▒=====▒=▒===▒▒▒▒=▒===▒=",CR,LF
        db "----▒-▒--▒-▒▒---▒-▒-▒-▒--▒-▒--▒-▒---▒-▒▒--▒-▒--▒▒▒-▒--▒-▒-----▒-▒▒--▒--▒-▒-▒-▒-",CR,LF
        db "-▒▒▒▒-▒--▒-▒▒▒--▒---▒-▒▒▒▒-▒▒▒--▒▒▒▒--▒▒▒-▒▒▒▒-▒▒▒-▒--▒-▒--▒▒▒▒-▒▒▒--▒▒--▒▒-▒▒-",CR,LF
        db "···············································································",CR,LF,LF

        db "                          -<>- Proudly Presents -<>-                           ",CR,LF
        db "─────═════[ XOR-File 0.4 FAST File Decrypter by ·─═φ│Æ∩φ═─· (C)1997 ]═════─────",CR,LF,LF
        db EOM

nopar   db "                   Syntax :  XORFILE  [InputFile] [XorValue]", CR,LF,LF
        db "                   InputFile is the file you want to decrypt", CR,LF
        db "                   Xorvalue is an hexadecimal number [00-FF]", CR,LF
        db "                   The output will be assumed as DECRYPT.xxx", CR,LF
        db EOM

xorvalue db 000h
outfle  db "DECRYPT."
outext1 db "0"
outext2 db "0"
outext3 db "0"
outend  db 00h,EOM
namfle  db 128 dup(0)
handle  dw 1 dup(0)
handle2 dw 1 dup(0)

str2Write db nBytes dup(0)

updok   db "                   Successfully Decrypted!! ( " ,EOM
updend  db ")",CR,LF,EOM
updko   db "Input File not found!",CR,LF,EOM
updcre  db "Create Error",CR,LF,EOM
toomany db "Too many DECRYPTed files found Here... Delete some!",CR,LF,EOM
readerr db "Read Error",CR,LF,EOM

;┌────────────────────────────────────────────────────────────────────────────┐
;│* Code Start *                                                              │
;└────────────────────────────────────────────────────────────────────────────┘

.code
.startup
        @INIEXE
        @SAY LOGO

;┌────────────────────────────────────────────────────────────────────────────┐
;│* Commandline parser *                                                      │
;└────────────────────────────────────────────────────────────────────────────┘

        cmp byte ptr es:0080h, 00
        jne @@get_file
@@errnopar:
        @SAY nopar
        jmp exitok

@@get_file:
        mov di, 0082h            ; (ES:DI) -> (DS:SI)
        lea si, NAMFLE           ; I know, LODSB is better
        ;xor cx,cx               ; but i taken example from FONTLOAD.ASM

@@loc_loop:
        mov al, byte ptr es:[di] ; EHI, TEO! BYTE PTR ES:DI DOESN'T ASSEMBLE!
        cmp al, 0dh
        je  @@errnopar   ; could not be here...

        cmp al, 20h
        je  @@xorval_1   ; filename ended

        mov byte ptr DS:[SI], al
        inc di
        inc si
        ;inc cx
        ;cmp cx, 80      ;; erm... I guess is a check for commandline length..
        ;jge @@errnopar  ;; no, let's kick it...
        jmp @@loc_loop


@@xorval_1:
        inc di
        mov al, byte ptr ES:[DI]

        cmp al,30h ; 0
        jb  @@errnopar

        cmp al,39h ; 9
        ja  ok9

        sub al,30h               ; chr->val "1"->01h
        jmp @@shift

ok9:
        and al,1011111b          ; upper case
        cmp al,41h ; A
        jb  @@errnopar

        cmp al,46h ; F
        ja  @@errnopar

        sub al,37h               ; chr->val "A"->0ah
@@shift:
        mov cl,4
        shl al,cl                ; 01->10,0f->f0

        mov [xorvalue], al
        inc di

@@xorval_2:                      ; ok,ok, it's redundant code...
        mov al, byte ptr ES:[DI] ; but i needed to make it in a hurry!

        cmp al,30h ; 0
        jb  @@errnopar

        cmp al,39h ; 9
        ja  ok9_1

        sub al,30h               ; chr->val "1"->01h
        jmp @@shift_1
ok9_1:

        and al,1011111b          ; upper case
        cmp al,41h ; A
        jb  @@errnopar

        cmp al,46h ; F
        ja  @@errnopar

        sub al,37h               ; chr->val "A"->0ah
@@shift_1:
        add [xorvalue],al

;┌────────────────────────────────────────────────────────────────────────────┐
;│* Process File *                                                            │
;└────────────────────────────────────────────────────────────────────────────┘

@@carica:

        LEA DX,NAMFLE
        @DOS 3Dh,00100000b  ; read-only + deny write
        jnc ookk
        jmp EXITKO
ookk:

        MOV [HANDLE],AX

        MOV CX,0H                    ;FSEEK 0
        MOV DX,0H
        MOV BX,[HANDLE]
        @DOS 42H,0H

chkoutfle:
        xor cx,cx
        LEA DX,OUTFLE
        @DOS 4EH,0H        ; findfirst
        jc Create
        inc [outext3]
        cmp [outext3] ,3ah ; ":"
        jne chkoutfle
        mov [outext3] ,30h ; "0"
        inc [outext2]
        cmp [outext2] ,3ah ; ":"
        jne chkoutfle
        mov [outext2] ,30h ; "0"
        inc [outext1]
        cmp [outext1] ,3ah ; ":"
        jne chkoutfle

        @SAY TOOMANY
        JMP EXITOK

Create:

        MOV CX,00100000B             ;CREATE W/ARCHIVE ATTRIBUTE
        LEA DX,OUTFLE
        @DOS 3CH,0H
        JC CREATERR
        MOV [HANDLE2],AX

LOOPHERE:
        MOV CX,nBytes                ;READ nBytes CHAR
        LEA DX,STR2WRITE             ;PUT IT IN STR2WRITE
        MOV BX,[HANDLE]
        @DOS 3FH,0H
        JC  READERROR
        OR  AX,AX                    ; 0 BYTES READ: EOF
        JZ  FINISH
        PUSH AX

        MOV SI,0H
DECRYPT:

        MOV AL, [STR2WRITE][SI]
        XOR AL, [xorvalue]
        ;inc [xorvalue]              ; variable xorvalue , maybe next...
        MOV [STR2WRITE][SI] ,AL
        INC SI
        CMP SI,nBytes
        JNE DECRYPT

        LEA DX,STR2WRITE
        POP AX                       ; WRITE EXACTLY [AX] BYTES READ
        MOV CX,AX
        MOV BX,[HANDLE2]
        @DOS 40H
        JMP LOOPHERE
FINISH:
        @SAY UPDOK
        @say outfle
        @say updend

        MOV BX,[HANDLE]              ; close input file
        @DOS 3EH
        MOV BX,[HANDLE2]             ; close output file
        @DOS 3EH

        JMP EXITOK
CREATERR:
        @SAY UPDCRE
        JMP EXITOK
READERROR:
        @SAY READERR
        JMP EXITOK

EXITKO:
        @SAY UPDKO

EXITOK:
        @DOS EXIT

END

[ RETURN TO DIRECTORY ]