-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathD_FIRE.PAS
142 lines (107 loc) · 2.71 KB
/
D_FIRE.PAS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
UNIT D_Fire;
{*************************************************************************}
{* *}
{* EFEKT OGNIA - KAMIL SKOCZYLAS *}
{* E - MAIL: BlackAmper@poczta.onet.pl *}
{* pomysˆ ognia: Sebastian Chojniak *}
{* sebek1234@go2.pl *}
{* *}
{*************************************************************************}
{$G+}{OBSLUGA INSTRUKCJI 286 - W ASSEMBLERZE Shr Ax, 2}
INTERFACE
USES Standard, Graph10E, D_Types;
{EYSUJE OGIEN W 13h}
PROCEDURE Make_Fire;
IMPLEMENTATION
TYPE PArrayEkr =^TArrayEkr;
TArrayEkr = ARRAY[0..199, 0..319] OF BYTE;
VAR TAB:PArrayEkr;
A, B, X:INTEGER;
{LOSUJE DOLNE RZEDY OGNIA}
PROCEDURE LOSUJ;
BEGIN
FOR A:=0 TO 319 DO
FOR B:=198 TO 199 DO
BEGIN
TAB^[B, A]:=RANDOM(100)+156;
END;
END;
{PROCEDURA PRZYSPIESZONA W ASSEMBLERZE}
{TYLKO DLA 320 PIKSELI W POZIOMIE PRZY 8 BITACH}
PROCEDURE Blur(Buf:Pointer;Size:Word);
BEGIN
ASM
{POBIERA ADRES BUFORA}
Les Di, Buf
{WCZYTUJE ILE RAZY WYKONA SIE PETLA}
Mov Cx, Size
{PETLA GLOWNA}
@Petla:
{DODAWANIE SASIEDNICH WARTOSCI}
Db $66
Xor Ax, Ax
{1 SKLADOWA}
Mov Al, Es:[Di+319]
{2 SKLADOWA}
Db $66
Xor Dx, Dx
Mov Dl, Es:[Di+321]
Add Ax, Dx
{3 SKLADOWA}
Mov Dl, Es:[Di+320]
Db $66
Add Ax, Dx
{4 SKLADOWA}
Mov Dl, Es:[Di+640]
Db $66
Add Ax, Dx
{DZIELENIE PRZEZ 4}
Shr Ax, 2
Or Ax, Ax
jz @Dalej
Dec Ax
@Dalej:
{ZAPIS NOWEGO BAJTU DO PAMIECI}
Mov Es:[Di], Ax
Inc Di
Loop @Petla
END;
END;
PROCEDURE Make_Fire;
BEGIN
Opcja:=0;
IF MaxAvail<64000 THEN Exit;
New(Tab);
S_FillChar32(Tab, 64000, 0);
ASM
MOV AX, 13H
INT 10H
END;
FOR A:=255 DOWNTO 128 DO
BEGIN
PORT[$3C8]:=A;
PORT[$3C9]:=63;
PORT[$3C9]:=((A-128) DIV 2);
PORT[$3C9]:=0;
END;
FOR A:=127 DOWNTO 0 DO
BEGIN
PORT[$3C8]:=A;
PORT[$3C9]:=(A DIV 2);
PORT[$3C9]:=0;
PORT[$3C9]:=0;
END;
REPEAT
{EFEKT ROZMYCIA}
Blur(TAB, 63360);
{LOSUJE DOLNE RZEDY OGNIA}
LOSUJ;
{POWROT PIONOWY}
V_VRet;
{KOPIUJE CALOSC NA EKRAN}
S_Move32(TAB, Ptr($A000, 0), 64000);
UNTIL PORT[$60]=1;
Dispose(Tab);
V_Set10Eh;
END;
END.