home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
PINBSRC.ZIP
/
_FLIC.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1996-02-02
|
5KB
|
336 lines
Const
CLOCK_HZ =4608;
MONItoR_HZ =70;
CLOCK_SCALE =CLOCK_HZ div MONItoR_HZ;
BUFFERSIZE =$FFFE;
CDATA =$040;
CMODE =$043;
CO80 =$3;
KEYBOARD =28;
MOUSE =60;
MCGA =$13;
MCGACheck:Boolean =True;
UseXMS:Boolean =True;
XMSError:Byte =0;
Type
EMMStructure =Record
BytestoMoveLo,
BytestoMoveHi,
SourceHandle,
SourceoffsetLo,
SourceoffsetHi,
DestinationHandle,
DestinationoffsetLo,
DestinationoffsetHi :Word;
end;
HeaderType =Array[0..128] of Byte;
Var
Key,
OldKey :Byte;
XMSRecord :EMMStructure;
InputFile :File;
Header :HeaderType;
Counter,
flicspeed :Integer;
FileCounter,
FileSize,
FrameSize,
NextTime,
TimeCounter,
SecondPos :LongInt;
Buffer,
XMSEntryPoint :Pointer;
flicspeedString :String[2];
FileName :String;
BufferHandle,
BytesRead,
FrameNumber,
Frames,
Chunks :Word;
Function UpCaseString(Streng:String):String;
Var
DummyString :String;
Counter :Integer;
begin
DummyString:='';
For Counter:=1 to Length(Streng) do
DummyString:=DummyString+UpCase(Streng[Counter]);
UpCaseString:=DummyString;
end;
Procedure GetBlock(Var Buffer; Size:Word);
begin
BlockRead(InputFile,Buffer,Size);
end;
Procedure InitMode(Mode:Word); Assembler;
Asm
mov ax,Mode
int 10h
end;
Function ModeSupport(Mode:Word):Boolean; Assembler;
Label Exit, Last_Modes, No_Support, Supported;
Var
DisplayInfo :Array[1..64] of Byte;
Asm
push es
mov ah,1Bh
mov bx,0
push ds
pop es
mov di,offset DisplayInfo
int 10h
les di,[dWord ptr es:di]
mov cx,Mode
cmp cx,13h
ja No_Support
mov ax,1
cmp cx,10h
jae Last_Modes
shl ax,cl
test ax,[Word ptr es:di+0]
jz No_Support
jmp Supported
Last_Modes:
sub cx,10h
shl ax,cl
test al,[Byte ptr es:di+2]
jz No_Support
Supported:
mov al,1
jmp Exit
No_Support:
mov al,0
Exit:
pop es
end;
Procedure InitClock; Assembler;
Asm
mov al,00110100b
out CMODE,al
xor al,al
out CDATA,al
out CDATA,al
end;
Function GetClock:LongInt; Assembler;
Asm
mov ah,0
int 01ah
mov ah,dl
mov dl,dh
mov dh,cl
mov al,0
out CMODE,al
mov al,1
out CMODE,al
in al,CDATA
in al,CDATA
neg al
end;
Procedure TreatFrame(Buffer:Pointer;Chunks:Word); Assembler;
Label
Color_Loop, Copy_Bytes, Copy_Bytes2, Exit, Fli_Black, Fli_Brun, Fli_Color,
Fli_Copy, Fli_Lc, Fli_Loop, Jump_Over, Line_Loop, Line_Loop2, Next_Line,
Next_Line2, Pack_Loop, Pack_Loop2;
Asm
cli
push ds
push es
lds si,Buffer
Fli_Loop:
cmp Chunks,0
je Exit
dec Chunks
mov ax,[Word ptr ds:si+4]
add si,6
cmp ax,0Bh
je Fli_Color
cmp ax,0Ch
je Fli_Lc
cmp ax,0Dh
je Fli_Black
cmp ax,0Fh
je Fli_Brun
cmp ax,10h
je Fli_Copy
jmp Fli_Loop
Fli_Color:
mov bx,[Word ptr ds:si]
add si,2
mov al,0
xor cx,cx
Color_Loop:
or bx,bx
jz Fli_Loop
dec bx
mov cl,[Byte ptr ds:si+0]
add al,cl
mov dx,$3C8
out dx,al
inc dx
mov cl,[Byte ptr ds:si+1]
or cl,cl
jnz Jump_Over
inc ch
Jump_Over:
add al,cl
mov di,cx
shl cx,1
add cx,di
add si,2
rep outsb
jmp Color_Loop
Fli_Lc:
mov ax,0A000h
mov es,ax
mov di,[Word ptr ds:si+0]
mov ax,di
shl ax,8
shl di,6
add di,ax
mov bx,[Word ptr ds:si+2]
add si,4
xor cx,cx
Line_Loop:
or bx,bx
jz Fli_Loop
dec bx
mov dl,[Byte ptr ds:si]
inc si
push di
Pack_Loop:
or dl,dl
jz Next_Line
dec dl
mov cl,[Byte ptr ds:si+0]
add di,cx
mov cl,[Byte ptr ds:si+1]
or cl,cl
jns Copy_Bytes
mov al,[Byte ptr ds:si+2]
add si,3
neg cl
rep stosb
jmp Pack_Loop
Copy_Bytes:
add si,2
rep movsb
jmp Pack_Loop
Next_Line:
pop di
add di,320
jmp Line_Loop
Fli_Black:
mov ax,0A000h
mov es,ax
xor di,di
mov cx,32000
xor ax,ax
rep stosw
jmp Fli_Loop
Fli_Brun:
mov ax,0A000h
mov es,ax
xor di,di
mov bx,200
xor cx,cx
Line_Loop2:
mov dl,[Byte ptr ds:si]
inc si
push di
Pack_Loop2:
or dl,dl
jz Next_Line2
dec dl
mov cl,[Byte ptr ds:si]
or cl,cl
js Copy_Bytes2
mov al,[Byte ptr ds:si+1]
add si,2
rep stosb
jmp Pack_Loop2
Copy_Bytes2:
inc si
neg cl
rep movsb
jmp Pack_Loop2
Next_Line2:
pop di
add di,320
dec bx
jnz Line_Loop2
jmp Fli_Loop
Fli_Copy:
mov ax,0A000h
mov es,ax
xor di,di
mov cx,32000
rep movsw
jmp Fli_Loop
Exit:
sti
pop es
pop ds
end;