[Back to ENCRYPT SWAG index] [Back to Main SWAG index] [Original]
{$g+,a+}
unit crypt;
INTERFACE
procedure maketable(const seed:word);
procedure encrypt(var data;const size,xoa:word);
procedure setslide(const slide:word);
function maxslide:word;
IMPLEMENTATION
const
maxx=2028; { Max is a word! }
var
xortable:array[0..maxx]of byte;
slidepos:word;
procedure maketable(const seed:word); assembler;
asm
mov ax,seg xortable
mov es,ax
mov di,offset xortable
xor cx,cx
mov cx,maxx
mov si,seed
xor ax,ax
@@loop:
not ax
inc ax
neg ax
add ax,cx
and ax,si
ror si,3
rol ax,2
xor ax,si
inc si
mov es:[di],al
inc di
dec cx
jnz @@loop
end;
procedure encrypt(var data;const size,xoa:word); assembler;
{
ds:si => pointer to XorTable
es:di => pointer to data
ax => temporary
=> al is used for the thing that get changed,
ah to hold a byte from the XORTABLE.
bx => used for temporary calculation.
cx => holds total end-up size for loop-end-check :-)
dx => holds additional XOR value. }
asm
mov ax,seg [xortable]
mov ds,ax
mov si,offset [xortable]
les di,[data]
mov cx,di
add cx,[size]
mov dx,[xoa]
jmp @@loop
@@zeroit:
mov [slidepos],0
@@loop:
cmp [slidepos],maxx
jg @@zeroit { Slidepos become to big? }
mov bx,si
add bx,slidepos
mov ah,ds:[bx]
mov bx,[slidepos]
mov al,es:[di]
not al
xor al,ah
xor al,dl
xor al,bl
xor al,dh
not al
xor al,bh
mov es:[di],al
inc [slidepos]
inc di
cmp di,cx
jb @@loop
end;
procedure setslide(const slide:word); assembler;
asm
cmp [slide],maxx
ja @@exit2
mov ax,[slide]
mov [slidepos],ax
jmp @@exit
@@exit2:
mov [slidepos],0
@@exit:
end;
function maxslide:word; assembler;
asm
mov ax,[maxx]
end;
begin
slidepos:=0;
end.
[Back to ENCRYPT SWAG index] [Back to Main SWAG index] [Original]