-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmatrix.pas
94 lines (78 loc) · 1.79 KB
/
matrix.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
program matrix;
const chars: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}|:<>?!@#$%^&*()_+~[]\;,./';
screenw = 80; screenh = 25;
black = 0; green = 2; white = 15;
type cell = record
ch: char;
attr: byte;
end;
var vidmem: array [1..screenh, 1..screenw] of cell absolute $B800:0000;
function KeyPressed: boolean; assembler;
asm
mov ax, $100
int $16
mov al, False
jz @1
inc al
@1:
end;
function ReadKey: char; assembler;
asm
mov ah, $07
int $21
end;
procedure Sleep(ms: word); assembler;
asm
mov ax, 1000
mul ms
mov cx, dx
mov dx, ax
mov ah, $86
int $15
end;
function RandRange(lo, hi: integer): integer;
begin RandRange := lo + Random(hi)
end;
function RandChar: char;
begin RandChar := chars[RandRange(1, Length(chars))]
end;
procedure DoCol(col: integer);
var i, j: integer;
begin i := 1;
while (i < screenh) and (vidmem[i, col].attr = black) do Inc(i);
if i = screenh then vidmem[RandRange(1, 10), col].attr := 2
else begin
j := i;
while (j < screenh) and (vidmem[j, col].attr <> black) do Inc(j);
vidmem[j - 1, col].attr := green;
vidmem[j, col].attr := white;
end;
if (j - i > RandRange(2, 5)) or (i > 20) then vidmem[i, col].attr := black;
end;
procedure Tick;
var col: integer;
begin for col := 1 to screenw do DoCol(col)
end;
procedure Init;
var i, j: integer;
begin
for i := 1 to screenh do
for j := 1 to screenw do begin
vidmem[i, j].ch := RandChar;
vidmem[i, j].attr := black;
end;
for i := 1 to screenw do vidmem[RandRange(1, screenh), i].attr := green;
end;
procedure Run;
var i: integer;
begin
while True do begin
for i := 1 to screenw do DoCol(i);
Sleep(50);
if KeyPressed then break
end
end;
begin
Init;
Run
end.