Skip to content

Commit d08739b

Browse files
author
dosworld
committed
Added XMS 3.51 and unit DETECT
1 parent 395c7c1 commit d08739b

File tree

7 files changed

+270
-73
lines changed

7 files changed

+270
-73
lines changed

ANSI.PAS

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,12 @@ CLREOL = ANSI_ESC + '[K';
4242
CONST
4343
ansi_enabled : BOOLEAN = TRUE;
4444

45-
FUNCTION AnsiSysInstalled : BOOLEAN;
46-
4745
FUNCTION fg(clr : BYTE) : STRING;
4846
FUNCTION bg(clr : BYTE) : STRING;
4947

5048
IMPLEMENTATION
5149

52-
FUNCTION AnsiSysInstalled : BOOLEAN; ASSEMBLER;
53-
ASM
54-
MOV AX,$1A00
55-
INT $2F
56-
XOR AH, AH
57-
END;
50+
USES Detect;
5851

5952
FUNCTION fg(clr : BYTE) : STRING;
6053
BEGIN
@@ -70,4 +63,6 @@ BEGIN
7063
ELSE bg := '';
7164
END;
7265

66+
BEGIN
67+
ansi_enabled := IsAnsiSys AND (NOT IsOutputRedirected);
7368
END.

ARGS.PAS

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ PROCEDURE WriteArgsErrors(VAR state : TARGSTATE);
184184

185185
IMPLEMENTATION
186186

187+
USES Ansi;
188+
187189
VAR prevExitProc : POINTER;
188190

189191
TYPE
@@ -370,23 +372,23 @@ PROCEDURE ArgsHelp(VAR state : TARGSTATE; stop : BOOLEAN);
370372
VAR i, maxLen : INTEGER;
371373
name : STRING;
372374
BEGIN
373-
Write('Usage: ', GetSelfName);
375+
Write(fg(WHITE), bg(BLACK), 'Usage: ', fg(CYAN), GetSelfName, fg(YELLOW));
374376
IF state.cmds_count <> 0 THEN Write(' command');
375377
IF (state.opts_count + state.flags_count) <> 0 THEN Write(' [flags/options]');
376-
WriteLn(' arg0 .. argN');
378+
WriteLn(' arg0 .. argN', fg(WHITE));
377379
IF state.cmds_count <> 0 THEN BEGIN
378380
maxLen := 0;
379381
FOR i := 1 TO state.opts_size DO
380382
IF (maxLen < ORD(state.opts[i]^.name[0]))
381383
AND (state.opts[i]^.otype = OPTCMD)
382384
THEN maxLen := ORD(state.opts[i]^.name[0]);
383385
WriteLn;
384-
WriteLn('Commands:');
386+
WriteLn(fg(CYAN), 'Commands:', fg(WHITE));
385387
FOR i := 1 TO state.opts_size DO
386388
IF state.opts[i]^.otype = OPTCMD THEN BEGIN
387389
name := state.opts[i]^.name;
388390
WHILE ORD(name[0]) < maxLen DO name := name + ' ';
389-
Write(' ', name, ' - ');
391+
Write(' ', fg(YELLOW), name, fg(WHITE), ' - ');
390392
WriteLn(state.opts[i]^.help);
391393
END;
392394
END;
@@ -398,12 +400,12 @@ BEGIN
398400
THEN maxLen := ORD(state.opts[i]^.name[0]);
399401
Inc(maxLen, 1);
400402
WriteLn;
401-
WriteLn('Flags:');
403+
WriteLn(fg(CYAN), 'Flags:', fg(WHITE));
402404
FOR i := 1 TO state.opts_size DO
403405
IF state.opts[i]^.otype = OPTBOOL THEN BEGIN
404406
name := state.opts[i]^.name;
405407
WHILE ORD(name[0]) < maxLen DO name := name + ' ';
406-
WriteLn(' /', name, state.opts[i]^.help);
408+
WriteLn(fg(YELLOW), ' /', name, fg(WHITE), state.opts[i]^.help);
407409
END;
408410
END;
409411
IF state.opts_count <> 0 THEN BEGIN
@@ -414,12 +416,12 @@ BEGIN
414416
THEN maxLen := ORD(state.opts[i]^.name[0]);
415417
Inc(maxLen, 5);
416418
WriteLn;
417-
WriteLn('Options:');
419+
WriteLn(fg(CYAN),'Options:', fg(WHITE));
418420
FOR i := 1 TO state.opts_size DO
419421
IF state.opts[i]^.otype = OPTSTR THEN BEGIN
420422
name := state.opts[i]^.name + '=<v>';
421423
WHILE ORD(name[0]) < maxLen DO name := name + ' ';
422-
Write(' /', name, state.opts[i]^.help);
424+
Write(fg(YELLOW), ' /', name, fg(WHITE), state.opts[i]^.help);
423425
IF Length(state.opts[i]^.default) <> 0 THEN
424426
Write(' (default "', state.opts[i]^.default, '")');
425427
WriteLn;
@@ -500,7 +502,7 @@ END;
500502
PROCEDURE ArgsExitProc;FAR;
501503
BEGIN
502504
IF (ErrorAddr = NIL) AND (ExitCode <> 0) THEN BEGIN
503-
Write('Use /? for help.');
505+
Write(bg(BLACK), fg(WHITE), 'Use ', fg(YELLOW), '/?', fg(WHITE), ' for help.');
504506
END;
505507
exitProc := prevExitProc;
506508
END;

DETECT.PAS

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
{ MIT License
2+
3+
Copyright (c) 2022 Viacheslav Komenda
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE. }
22+
{$A+,I-,S-,R-,D+,L+,Q-,F-,G-,O-,B-}
23+
UNIT Detect;
24+
25+
INTERFACE
26+
27+
CONST
28+
CPU_86 = 0;
29+
CPU_286 = 1;
30+
CPU_386 = 2;
31+
32+
FUNCTION IsEga : BOOLEAN;
33+
FUNCTION IsVga : BOOLEAN;
34+
FUNCTION IsMonochrome : BOOLEAN;
35+
36+
FUNCTION IsInputRedirected : BOOLEAN;
37+
FUNCTION IsOutputRedirected : BOOLEAN;
38+
FUNCTION IsAnsiSys : BOOLEAN;
39+
40+
FUNCTION IsFreeDos : BOOLEAN;
41+
FUNCTION GetFreeDosVer : PCHAR;
42+
43+
FUNCTION IsAT : BOOLEAN;
44+
FUNCTION GetCpu : WORD;
45+
46+
IMPLEMENTATION
47+
48+
FUNCTION IsEga : BOOLEAN;ASSEMBLER;
49+
ASM
50+
MOV AX, $1200
51+
MOV BX, $10
52+
MOV CX, $FFFF
53+
INT $10
54+
INC CX
55+
MOV AL, CL
56+
OR AL, CH
57+
END;
58+
59+
FUNCTION IsVga : BOOLEAN;ASSEMBLER;
60+
ASM
61+
MOV AX, $1A00
62+
INT $10 {check for VGA/MCGA}
63+
CMP AL, $1A
64+
JNE @err {no VGA Bios}
65+
CMP BL, 7
66+
JB @err {is VGA or better?}
67+
CMP BL, $FF
68+
JNE @ok
69+
@err:
70+
XOR AL, AL
71+
JMP @end
72+
@ok:
73+
MOV AL, 1
74+
@end:
75+
END;
76+
77+
FUNCTION IsFreeDos : BOOLEAN;ASSEMBLER;
78+
ASM
79+
MOV AX, $3000
80+
XOR BX, BX
81+
INT $21
82+
CMP BH, $FD
83+
JE @end
84+
XOR BH, BH
85+
@end:
86+
MOV AL, BH
87+
END;
88+
89+
FUNCTION GetFreeDosVer : PCHAR; ASSEMBLER;
90+
ASM
91+
MOV AX, $33FF
92+
XOR DX, DX
93+
INT $21
94+
TEST DX, DX
95+
JNZ @end
96+
XOR AX, AX
97+
MOV DX, AX
98+
@end:
99+
END;
100+
101+
FUNCTION IsMonochrome : BOOLEAN;ASSEMBLER;
102+
ASM
103+
PUSH DS
104+
MOV AX, WORD PTR [seg0040]
105+
MOV DS, AX
106+
MOV AL, BYTE PTR [$0065]
107+
POP DS
108+
AND AL, 4
109+
END;
110+
111+
FUNCTION IsInputRedirected : BOOLEAN; ASSEMBLER;
112+
ASM
113+
MOV AX, $4400
114+
XOR BX, BX
115+
INT $21
116+
XOR AL, AL
117+
AND DL, $81
118+
XOR AL, AL
119+
OR DL, DL
120+
JNZ @end
121+
INC AL
122+
@end:
123+
END;
124+
125+
FUNCTION IsOutputRedirected : BOOLEAN; ASSEMBLER;
126+
ASM
127+
MOV AX, $4400
128+
MOV BX, 1
129+
INT $21
130+
XOR AL, AL
131+
AND DL, $82
132+
XOR AL, AL
133+
OR DL, DL
134+
JNZ @end
135+
INC AL
136+
@end:
137+
END;
138+
139+
FUNCTION IsAnsiSys : BOOLEAN; ASSEMBLER;
140+
ASM
141+
MOV AX,$1A00
142+
INT $2F
143+
XOR AH, AH
144+
END;
145+
146+
FUNCTION GetCpu : WORD; ASSEMBLER;
147+
ASM
148+
XOR DX, DX
149+
PUSH DX
150+
POPF
151+
PUSHF
152+
POP AX
153+
AND AX, $F000
154+
CMP AX, $F000
155+
JE @end
156+
INC DX
157+
MOV AX, $F000
158+
PUSH AX
159+
POPF
160+
PUSHF
161+
POP AX
162+
AND AX, $F000
163+
JZ @end
164+
INC DX
165+
@end:
166+
MOV AX, DX
167+
END;
168+
169+
FUNCTION IsAT : BOOLEAN;
170+
BEGIN
171+
IsAT := MEM[$F000 : $FFFE] = $FC;
172+
END;
173+
174+
END.
175+

EXCACHE.PAS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ PROCEDURE excache_Free(c : PEXCACHE);
8282
BEGIN
8383
IF c = NIL THEN EXIT;
8484
IF c^.h <> 0 THEN exms_free(c^.h);
85-
FillChar(r^, SizeOf(TEXCACHE), #0);
85+
FillChar(c^, SizeOf(TEXCACHE), #0);
8686
FreeMem(c, SizeOf(TEXCACHE));
8787
END;
8888

0 commit comments

Comments
 (0)