163 lines
3 KiB
ObjectPascal
163 lines
3 KiB
ObjectPascal
Unit Moon;
|
|
Interface
|
|
Uses
|
|
CRT,DOS,GRAPHVGA,LIBUSES;
|
|
const
|
|
MoonX = 111;
|
|
MoonY = 89;
|
|
MaskX = 151;
|
|
MaskY = 89;
|
|
|
|
Procedure InitMoon;
|
|
Procedure CloseMoon;
|
|
|
|
Procedure BouffeLaLune;
|
|
|
|
Procedure GerbeLaLune;
|
|
|
|
Implementation
|
|
Var
|
|
P : RGB;
|
|
Moon1 : Pointer; { Array of Byte; {10080 }
|
|
Moon2 : Pointer;
|
|
Mask1 : Pointer; {13680 }
|
|
Mask2 : Pointer;
|
|
|
|
Procedure PutBob(X1,Y1,X2,Y2 : word; P : Pointer);
|
|
Begin
|
|
asm
|
|
{ Calcul des pts de depart }
|
|
cli
|
|
Push DS
|
|
Mov AX,WriteS
|
|
Mov ES,AX
|
|
|
|
Lds SI,P
|
|
INC SI
|
|
INC SI
|
|
Mov AX,Y1
|
|
mov BX,320
|
|
Mul bx
|
|
add ax,X1 { DI = Y2*320+X2 }
|
|
Mov Di,AX { DI = DI + 289 (320-31) }
|
|
Sub BX,X2
|
|
|
|
mov DX,Y2
|
|
@@Bcl:Mov CX,X2
|
|
rep movsb
|
|
Add DI,BX
|
|
dec dx
|
|
jnz @@Bcl
|
|
|
|
pop DS
|
|
sti
|
|
end;
|
|
End;
|
|
|
|
Procedure InitMoon;
|
|
var
|
|
X,Y,C : Word;
|
|
Begin
|
|
FillChar(Screen^,64000,0);
|
|
PaletteOff;
|
|
opensub(Moon_walk);
|
|
|
|
GetMem(Moon1,10080);
|
|
GetMem(Moon2,10080);
|
|
GetMem(Mask1,13680);
|
|
GetMem(Mask2,13680);
|
|
|
|
LoadRaw(P,SizeOf(P));
|
|
LoadRaw(Moon1^,10080); {SizeOf(Moon1));}
|
|
LoadRaw(Moon2^,10080); {SizeOf(Moon2));}
|
|
LoadRaw(Mask1^,13680); {SizeOf(Mask1));}
|
|
LoadRaw(Mask2^,13680); {SizeOf(Mask2));}
|
|
SetRgb(P);
|
|
end;
|
|
|
|
Procedure CloseMoon;
|
|
Begin
|
|
FreeMem(Moon1,10080);
|
|
FreeMem(Moon2,10080);
|
|
FreeMem(Mask1,13680);
|
|
FreeMem(Mask2,13680);
|
|
end;
|
|
|
|
Procedure AddBob(X1,Y1,X2,Y2 : word; P : Pointer);
|
|
Begin
|
|
asm
|
|
{ Calcul des pts de depart }
|
|
cli
|
|
Push DS
|
|
Mov AX,WriteS
|
|
Mov ES,AX
|
|
Lds SI,P
|
|
inc SI
|
|
inc SI
|
|
Mov AX,Y1
|
|
mov BX,320
|
|
Mul bx
|
|
add ax,X1 { DI = Y2*320+X2 }
|
|
Mov Di,AX { DI = DI + 289 (320-31) }
|
|
|
|
Sub BX,X2
|
|
|
|
mov DX,Y2
|
|
@@Bcl:Mov CX,X2
|
|
@@Bc2:Mov AH,Byte Ptr ES:[DI]
|
|
xor AL,AL
|
|
mov AL,Byte Ptr DS:[SI]
|
|
cmp AL,0
|
|
je @@go
|
|
inc AL
|
|
@@go: inc SI
|
|
cmp AL,16
|
|
jbe @@ok
|
|
xor AL,AL
|
|
@@ok: Sub AH,AL
|
|
Mov AL,AH
|
|
cmp AL,0
|
|
jnle @@sor
|
|
Xor AL,AL
|
|
@@Sor:Stosb
|
|
Loop @@Bc2
|
|
Add DI,BX
|
|
dec dx
|
|
jnz @@Bcl
|
|
|
|
pop DS
|
|
sti
|
|
end;
|
|
End;
|
|
|
|
Procedure BouffeLaLune;
|
|
Var
|
|
C : Word;
|
|
Begin
|
|
For C:=0 to 138 do
|
|
begin
|
|
PutBob(160-55,100-44,MoonX,MoonY,Moon1);
|
|
AddBob(214-C,100-44,MaskX,MaskY,Mask1);
|
|
Move(Ptr(WriteS,0)^,Ptr($A000,0)^,64000);
|
|
WaitVbl;
|
|
WaitVbl;
|
|
WaitVbl;
|
|
end;
|
|
End;
|
|
|
|
Procedure GerbeLaLune;
|
|
Var
|
|
C : Word;
|
|
Begin
|
|
For C:=138 to 138*2 do
|
|
begin
|
|
PutBob(160-55,100-44,MoonX,MoonY,Moon2);
|
|
AddBob(210-C,100-44,MaskX,MaskY,Mask2);
|
|
Move(Ptr(WriteS,0)^,Ptr($A000,0)^,64000);
|
|
WaitVbl;
|
|
WaitVbl;
|
|
WaitVbl;
|
|
end;
|
|
End;
|
|
|
|
End.
|