Rev 7983 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7983 | Rev 8097 | ||
---|---|---|---|
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
3 | 3 | ||
4 | Copyright (c) 2019, Anton Krotov |
4 | Copyright (c) 2019-2020, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
6 | *) |
6 | *) |
7 | 7 | ||
8 | MODULE Console; |
8 | MODULE Console; |
9 | 9 | ||
10 | IMPORT SYSTEM, WINAPI, In, Out; |
10 | IMPORT SYSTEM, WINAPI, In, Out; |
11 | 11 | ||
12 | 12 | ||
13 | CONST |
13 | CONST |
14 | 14 | ||
15 | Black* = 0; Blue* = 1; Green* = 2; Cyan* = 3; |
15 | Black* = 0; Blue* = 1; Green* = 2; Cyan* = 3; |
16 | Red* = 4; Magenta* = 5; Brown* = 6; LightGray* = 7; |
16 | Red* = 4; Magenta* = 5; Brown* = 6; LightGray* = 7; |
17 | DarkGray* = 8; LightBlue* = 9; LightGreen* = 10; LightCyan* = 11; |
17 | DarkGray* = 8; LightBlue* = 9; LightGreen* = 10; LightCyan* = 11; |
18 | LightRed* = 12; LightMagenta* = 13; Yellow* = 14; White* = 15; |
18 | LightRed* = 12; LightMagenta* = 13; Yellow* = 14; White* = 15; |
19 | 19 | ||
20 | 20 | ||
21 | VAR |
21 | VAR |
22 | 22 | ||
23 | hConsoleOutput: INTEGER; |
23 | hConsoleOutput: INTEGER; |
24 | 24 | ||
25 | 25 | ||
26 | PROCEDURE SetCursor* (X, Y: INTEGER); |
26 | PROCEDURE SetCursor* (X, Y: INTEGER); |
27 | BEGIN |
27 | BEGIN |
28 | WINAPI.SetConsoleCursorPosition(hConsoleOutput, X + Y * 65536) |
28 | WINAPI.SetConsoleCursorPosition(hConsoleOutput, X + Y * 65536) |
29 | END SetCursor; |
29 | END SetCursor; |
30 | 30 | ||
31 | 31 | ||
32 | PROCEDURE GetCursor* (VAR X, Y: INTEGER); |
32 | PROCEDURE GetCursor* (VAR X, Y: INTEGER); |
33 | VAR |
33 | VAR |
34 | ScrBufInfo: WINAPI.TConsoleScreenBufferInfo; |
34 | ScrBufInfo: WINAPI.TConsoleScreenBufferInfo; |
35 | 35 | ||
36 | BEGIN |
36 | BEGIN |
37 | WINAPI.GetConsoleScreenBufferInfo(hConsoleOutput, ScrBufInfo); |
37 | WINAPI.GetConsoleScreenBufferInfo(hConsoleOutput, ScrBufInfo); |
38 | X := ORD(ScrBufInfo.dwCursorPosition.X); |
38 | X := ORD(ScrBufInfo.dwCursorPosition.X); |
39 | Y := ORD(ScrBufInfo.dwCursorPosition.Y) |
39 | Y := ORD(ScrBufInfo.dwCursorPosition.Y) |
40 | END GetCursor; |
40 | END GetCursor; |
41 | 41 | ||
42 | 42 | ||
43 | PROCEDURE Cls*; |
43 | PROCEDURE Cls*; |
44 | VAR |
44 | VAR |
45 | fill: INTEGER; |
45 | fill: INTEGER; |
46 | ScrBufInfo: WINAPI.TConsoleScreenBufferInfo; |
46 | ScrBufInfo: WINAPI.TConsoleScreenBufferInfo; |
47 | 47 | ||
48 | BEGIN |
48 | BEGIN |
49 | WINAPI.GetConsoleScreenBufferInfo(hConsoleOutput, ScrBufInfo); |
49 | WINAPI.GetConsoleScreenBufferInfo(hConsoleOutput, ScrBufInfo); |
50 | fill := ORD(ScrBufInfo.dwSize.X) * ORD(ScrBufInfo.dwSize.Y); |
50 | fill := ORD(ScrBufInfo.dwSize.X) * ORD(ScrBufInfo.dwSize.Y); |
51 | WINAPI.FillConsoleOutputCharacter(hConsoleOutput, 20H, fill, 0, SYSTEM.ADR(fill)); |
51 | WINAPI.FillConsoleOutputCharacterA(hConsoleOutput, 20H, fill, 0, SYSTEM.ADR(fill)); |
52 | WINAPI.FillConsoleOutputAttribute(hConsoleOutput, ORD(ScrBufInfo.wAttributes), fill, 0, SYSTEM.ADR(fill)); |
52 | WINAPI.FillConsoleOutputAttribute(hConsoleOutput, ORD(ScrBufInfo.wAttributes), fill, 0, SYSTEM.ADR(fill)); |
53 | SetCursor(0, 0) |
53 | SetCursor(0, 0) |
54 | END Cls; |
54 | END Cls; |
55 | 55 | ||
56 | 56 | ||
57 | PROCEDURE SetColor* (FColor, BColor: INTEGER); |
57 | PROCEDURE SetColor* (FColor, BColor: INTEGER); |
58 | BEGIN |
58 | BEGIN |
59 | IF (FColor IN {0..15}) & (BColor IN {0..15}) THEN |
59 | IF (FColor IN {0..15}) & (BColor IN {0..15}) THEN |
60 | WINAPI.SetConsoleTextAttribute(hConsoleOutput, LSL(BColor, 4) + FColor) |
60 | WINAPI.SetConsoleTextAttribute(hConsoleOutput, LSL(BColor, 4) + FColor) |
61 | END |
61 | END |
62 | END SetColor; |
62 | END SetColor; |
63 | 63 | ||
64 | 64 | ||
65 | PROCEDURE GetCursorX* (): INTEGER; |
65 | PROCEDURE GetCursorX* (): INTEGER; |
66 | VAR |
66 | VAR |
67 | ScrBufInfo: WINAPI.TConsoleScreenBufferInfo; |
67 | ScrBufInfo: WINAPI.TConsoleScreenBufferInfo; |
68 | 68 | ||
69 | BEGIN |
69 | BEGIN |
70 | WINAPI.GetConsoleScreenBufferInfo(hConsoleOutput, ScrBufInfo) |
70 | WINAPI.GetConsoleScreenBufferInfo(hConsoleOutput, ScrBufInfo) |
71 | RETURN ORD(ScrBufInfo.dwCursorPosition.X) |
71 | RETURN ORD(ScrBufInfo.dwCursorPosition.X) |
72 | END GetCursorX; |
72 | END GetCursorX; |
73 | 73 | ||
74 | 74 | ||
75 | PROCEDURE GetCursorY* (): INTEGER; |
75 | PROCEDURE GetCursorY* (): INTEGER; |
76 | VAR |
76 | VAR |
77 | ScrBufInfo: WINAPI.TConsoleScreenBufferInfo; |
77 | ScrBufInfo: WINAPI.TConsoleScreenBufferInfo; |
78 | 78 | ||
79 | BEGIN |
79 | BEGIN |
80 | WINAPI.GetConsoleScreenBufferInfo(hConsoleOutput, ScrBufInfo) |
80 | WINAPI.GetConsoleScreenBufferInfo(hConsoleOutput, ScrBufInfo) |
81 | RETURN ORD(ScrBufInfo.dwCursorPosition.Y) |
81 | RETURN ORD(ScrBufInfo.dwCursorPosition.Y) |
82 | END GetCursorY; |
82 | END GetCursorY; |
83 | 83 | ||
84 | 84 | ||
85 | PROCEDURE open*; |
85 | PROCEDURE open*; |
86 | BEGIN |
86 | BEGIN |
87 | WINAPI.AllocConsole; |
87 | WINAPI.AllocConsole; |
88 | hConsoleOutput := WINAPI.GetStdHandle(-11); |
88 | hConsoleOutput := WINAPI.GetStdHandle(-11); |
89 | In.Open; |
89 | In.Open; |
90 | Out.Open |
90 | Out.Open |
91 | END open; |
91 | END open; |
92 | 92 | ||
93 | 93 | ||
94 | PROCEDURE exit* (b: BOOLEAN); |
94 | PROCEDURE exit* (b: BOOLEAN); |
95 | BEGIN |
95 | BEGIN |
96 | WINAPI.FreeConsole |
96 | WINAPI.FreeConsole |
97 | END exit; |
97 | END exit; |
98 | 98 | ||
99 | 99 | ||
100 | END Console. |
100 | END Console. |