-
Notifications
You must be signed in to change notification settings - Fork 2
/
mktetio.pas
105 lines (100 loc) · 2.63 KB
/
mktetio.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
{
-----------------------------------------------------------
Project: MKTRIS
Tetris-like game / Tetris clone.
File: mktetio.pas
Purpose: Routines to handle keyboard input.
Author: Copyright (C) by Marek Karcz 2016-2020.
All rights reserved.
-----------------------------------------------------------
}
{
---------------------------------------------------------
Initialize pressed keys FIFO buffer.
---------------------------------------------------------
}
procedure InitKeyBuf;
var
i: Integer;
begin
Key := InvalidKey;
ValidKey := False;
KeyBufBegin := 1;
KeyBufEnd := 1;
for i := 1 to KeyBufLen do
begin
KeyBuf[i] := InvalidKey;
end;
end;
{
---------------------------------------------------------
Add character to a circular FIFO buffer.
---------------------------------------------------------
}
procedure AddKey2Buf(key2Add: Char);
begin
KeyBuf[KeyBufEnd] := key2Add;
KeyBufEnd := KeyBufEnd + 1;
if (KeyBufEnd > KeyBufLen) then
begin
KeyBufEnd := 1;
end;
if (KeyBufEnd = KeyBufBegin) then
begin
KeyBufBegin := KeyBufBegin + 1;
if (KeyBufBegin > KeyBufLen) then
begin
KeyBufBegin := 1;
end;
end;
end;
{
---------------------------------------------------------
Get character from a circular FIFO buffer.
---------------------------------------------------------
}
function GetKeyFromBuf: Char;
begin
if (KeyBufBegin = KeyBufEnd) then
begin
GetKeyFromBuf := InvalidKey; { empty buffer }
end
else
begin
GetKeyFromBuf := KeyBuf[KeyBufBegin];
KeyBufBegin := KeyBufBegin + 1;
if (KeyBufBegin > KeyBufLen) then
begin
KeyBufBegin := 1;
end;
end;
end;
{
---------------------------------------------------------
Get input from player (keyboard).
Previous key must be consumed before new read is
allowed.
---------------------------------------------------------
}
procedure GetInput;
var
LocKey: Char;
begin
LocKey := InvalidKey; { undefined }
{ if key was pressed, add character to FIFO }
if KeyPressed then
begin
Read(Kbd,LocKey);
AddKey2Buf(LocKey);
end;
{ if time to read user input, get character from FIFO }
if (ValidKey = False) then
begin
Key := GetKeyFromBuf;
if (Key <> InvalidKey) then
begin
ValidKey := True;
end;
end;
end;
{ * * * EOF * * * }