| 1 | UNIT CRT;
|
|---|
| 2 |
|
|---|
| 3 | {***************************************************************************
|
|---|
| 4 | * Speed-Pascal/2 V 2.0 *
|
|---|
| 5 | * *
|
|---|
| 6 | * CRT Standard Unit *
|
|---|
| 7 | * *
|
|---|
| 8 | * (C) 1995 SpeedSoft. All rights reserved. *
|
|---|
| 9 | * *
|
|---|
| 10 | * Note: Some constants/variables moved to SYSTEM *
|
|---|
| 11 | * *
|
|---|
| 12 | ***************************************************************************}
|
|---|
| 13 |
|
|---|
| 14 | INTERFACE
|
|---|
| 15 |
|
|---|
| 16 | CONST
|
|---|
| 17 | {Foreground and background color constants}
|
|---|
| 18 | Black = 0;
|
|---|
| 19 | Blue = 1;
|
|---|
| 20 | Green = 2;
|
|---|
| 21 | Cyan = 3;
|
|---|
| 22 | Red = 4;
|
|---|
| 23 | Magenta = 5;
|
|---|
| 24 | Brown = 6;
|
|---|
| 25 | LightGray = 7;
|
|---|
| 26 |
|
|---|
| 27 | {Foreground color constants}
|
|---|
| 28 | DarkGray = 8;
|
|---|
| 29 | LightBlue = 9;
|
|---|
| 30 | LightGreen = 10;
|
|---|
| 31 | LightCyan = 11;
|
|---|
| 32 | LightRed = 12;
|
|---|
| 33 | LightMagenta = 13;
|
|---|
| 34 | Yellow = 14;
|
|---|
| 35 | White = 15;
|
|---|
| 36 |
|
|---|
| 37 | {Add-in for blinking}
|
|---|
| 38 | Blink = 128;
|
|---|
| 39 |
|
|---|
| 40 | VAR
|
|---|
| 41 | CheckBreak: BOOLEAN; { Ctrl-Break check }
|
|---|
| 42 | CheckEOF: BOOLEAN; { Ctrl-Z for EOF? }
|
|---|
| 43 | NormAttr:WORD; { Normal text attribute}
|
|---|
| 44 |
|
|---|
| 45 | PROCEDURE ClrScr;
|
|---|
| 46 | PROCEDURE GotoXY(X,Y:BYTE);
|
|---|
| 47 | PROCEDURE Window(X1,Y1,X2,Y2:BYTE);
|
|---|
| 48 | PROCEDURE TextColor(Color:BYTE);
|
|---|
| 49 | PROCEDURE TextBackground(Color:BYTE);
|
|---|
| 50 | FUNCTION WhereX: Byte;
|
|---|
| 51 | FUNCTION WhereY: WORD;
|
|---|
| 52 | PROCEDURE ClrEol;
|
|---|
| 53 | PROCEDURE InsLine;
|
|---|
| 54 | PROCEDURE DelLine;
|
|---|
| 55 | PROCEDURE LowVideo;
|
|---|
| 56 | PROCEDURE NormVideo;
|
|---|
| 57 | PROCEDURE HighVideo;
|
|---|
| 58 | FUNCTION KeyPressed: BOOLEAN;
|
|---|
| 59 | FUNCTION ReadKey: CHAR;
|
|---|
| 60 | PROCEDURE TextMode(Mode: Integer);
|
|---|
| 61 | PROCEDURE Delay(ms:LONGWORD);
|
|---|
| 62 | {Sound/NoSound are not implemented, they are replaced by beep in SYSTEM}
|
|---|
| 63 |
|
|---|
| 64 | IMPLEMENTATION
|
|---|
| 65 |
|
|---|
| 66 | {$IFDEF OS2}
|
|---|
| 67 | USES PmWin;
|
|---|
| 68 | {$ENDIF}
|
|---|
| 69 |
|
|---|
| 70 | {$IFDEF Win95}
|
|---|
| 71 | USES WinCon,WinBase,WinUser;
|
|---|
| 72 | {$ENDIF}
|
|---|
| 73 |
|
|---|
| 74 | PROCEDURE CrtError;
|
|---|
| 75 | VAR
|
|---|
| 76 | cs:CSTRING;
|
|---|
| 77 | cTitle:CSTRING;
|
|---|
| 78 | BEGIN
|
|---|
| 79 | ctitle:='Wrong linker target';
|
|---|
| 80 | cs:='PM Linker mode does not support text screen IO.'+#13+
|
|---|
| 81 | 'Use the unit WinCrt if you wish to use text'+#13+
|
|---|
| 82 | 'screen IO inside PM applications.';
|
|---|
| 83 | {$IFDEF OS2}
|
|---|
| 84 | WinMessageBox(1,1,cs,ctitle,0,$4000 OR $0010);
|
|---|
| 85 | {$ENDIF}
|
|---|
| 86 | {$IFDEF Win95}
|
|---|
| 87 | MessageBox(0,cs,ctitle,0);
|
|---|
| 88 | {$ENDIF}
|
|---|
| 89 | Halt(0);
|
|---|
| 90 | END;
|
|---|
| 91 |
|
|---|
| 92 |
|
|---|
| 93 | {$IFDEF OS2}
|
|---|
| 94 | {Internal structures from BSESUB}
|
|---|
| 95 | TYPE
|
|---|
| 96 | VIOMODEINFO=RECORD {pack 1}
|
|---|
| 97 | cb:WORD;
|
|---|
| 98 | fbType:BYTE;
|
|---|
| 99 | color:BYTE;
|
|---|
| 100 | col:WORD;
|
|---|
| 101 | row:WORD;
|
|---|
| 102 | hres:WORD;
|
|---|
| 103 | vres:WORD;
|
|---|
| 104 | fmt_ID:BYTE;
|
|---|
| 105 | attrib:BYTE;
|
|---|
| 106 | buf_addr:LONGWORD;
|
|---|
| 107 | buf_length:LONGWORD;
|
|---|
| 108 | full_length:LONGWORD;
|
|---|
| 109 | partial_length:LONGWORD;
|
|---|
| 110 | ext_data_addr:POINTER;
|
|---|
| 111 | END;
|
|---|
| 112 |
|
|---|
| 113 | VIOCONFIGINFO=RECORD {pack 2}
|
|---|
| 114 | cb:WORD;
|
|---|
| 115 | adapter:WORD;
|
|---|
| 116 | display:WORD;
|
|---|
| 117 | cbMemory:LONGWORD;
|
|---|
| 118 | Configuration:WORD;
|
|---|
| 119 | VDHVersion:WORD;
|
|---|
| 120 | Flags:WORD;
|
|---|
| 121 | HWBufferSize:LONGWORD;
|
|---|
| 122 | FullSaveSize:LONGWORD;
|
|---|
| 123 | PartSaveSize:LONGWORD;
|
|---|
| 124 | EMAdaptersOFF:WORD;
|
|---|
| 125 | EMDisplaysOFF:WORD;
|
|---|
| 126 | END;
|
|---|
| 127 | {$ENDIF}
|
|---|
| 128 |
|
|---|
| 129 | {Define a text window}
|
|---|
| 130 | PROCEDURE Window(X1,Y1,X2,Y2: BYTE);
|
|---|
| 131 | VAR MWindMax:WORD;
|
|---|
| 132 | begin
|
|---|
| 133 | ASM
|
|---|
| 134 | MOV AX,SYSTEM.MaxWindMax
|
|---|
| 135 | MOV MWindMax,AX
|
|---|
| 136 | END;
|
|---|
| 137 | IF X1<=X2 THEN IF Y1<=Y2 THEN
|
|---|
| 138 | BEGIN
|
|---|
| 139 | Dec(X1);
|
|---|
| 140 | Dec(Y1);
|
|---|
| 141 | IF X1>=0 THEN IF Y1>=0 THEN
|
|---|
| 142 | BEGIN
|
|---|
| 143 | Dec(Y2);
|
|---|
| 144 | Dec(X2);
|
|---|
| 145 | IF X2<lo(MWindMax)+1 THEN IF Y2<Hi(MWindMax)+1 THEN
|
|---|
| 146 | BEGIN
|
|---|
| 147 | WindMin := X1 + WORD(Y1) SHL 8;
|
|---|
| 148 | WindMax := X2 + WORD(Y2) SHL 8;
|
|---|
| 149 | GotoXY(1,1);
|
|---|
| 150 | END;
|
|---|
| 151 | END;
|
|---|
| 152 | END;
|
|---|
| 153 | END;
|
|---|
| 154 |
|
|---|
| 155 | {Set cursor location}
|
|---|
| 156 | PROCEDURE GotoXY(X,Y: BYTE);
|
|---|
| 157 | BEGIN
|
|---|
| 158 | ScreenInOut.GotoXY(X,Y);
|
|---|
| 159 | END;
|
|---|
| 160 |
|
|---|
| 161 | {internal ANSI color set routine}
|
|---|
| 162 | PROCEDURE SetColors;
|
|---|
| 163 | VAR ColorString:STRING;
|
|---|
| 164 | Tmp:BYTE;
|
|---|
| 165 | Actual:LONGWORD;
|
|---|
| 166 | Handle:LONGWORD;
|
|---|
| 167 | ff:^FileRec;
|
|---|
| 168 | redirected:BOOLEAN;
|
|---|
| 169 | BEGIN
|
|---|
| 170 | ASM
|
|---|
| 171 | MOV AL,SYSTEM.Redirect
|
|---|
| 172 | MOV redirected,AL
|
|---|
| 173 | END;
|
|---|
| 174 |
|
|---|
| 175 | IF Redirected THEN exit;
|
|---|
| 176 |
|
|---|
| 177 | ff:=@Output;
|
|---|
| 178 | Handle:=ff^.Handle;
|
|---|
| 179 |
|
|---|
| 180 | Colorstring:=#27+'[0'; {Reset colors and attributes to black/white}
|
|---|
| 181 | IF TextAttr>127 THEN {IF bit 7 set (blink}
|
|---|
| 182 | Colorstring:=ColorString+';5'; {blink}
|
|---|
| 183 |
|
|---|
| 184 | {Set background colors}
|
|---|
| 185 | Tmp:=TextAttr AND 112 ; {Clear bits 7,0 to 3 }
|
|---|
| 186 | Tmp:=Tmp SHR 4; {Adjust position to reflect bgcolor}
|
|---|
| 187 | Tmp:=Tmp AND 7;
|
|---|
| 188 | CASE Tmp OF
|
|---|
| 189 | Black : Tmp:=40; {Values differ from CLR_ constants!}
|
|---|
| 190 | Blue : Tmp:=44;
|
|---|
| 191 | Green : Tmp:=42;
|
|---|
| 192 | Cyan : Tmp:=46;
|
|---|
| 193 | Red : Tmp:=41;
|
|---|
| 194 | Magenta : Tmp:=45;
|
|---|
| 195 | Brown : Tmp:=43; {Yellow with in lower set!}
|
|---|
| 196 | Lightgray: Tmp:=47;
|
|---|
| 197 | END;
|
|---|
| 198 | Colorstring:=Colorstring+';'+tostr(Tmp);
|
|---|
| 199 |
|
|---|
| 200 | {Now set forefround...}
|
|---|
| 201 | Tmp:=TextAttr AND 15 ; {Clear bits 4 to 7 }
|
|---|
| 202 | IF Tmp>7 THEN {Is bold character}
|
|---|
| 203 | BEGIN
|
|---|
| 204 | Colorstring:=Colorstring+';1'; {High colors}
|
|---|
| 205 | DEC(Tmp,8);
|
|---|
| 206 | END;
|
|---|
| 207 |
|
|---|
| 208 | Tmp:=Tmp AND 7;
|
|---|
| 209 | CASE Tmp OF
|
|---|
| 210 | Black : Tmp:=30;
|
|---|
| 211 | Blue : Tmp:=34;
|
|---|
| 212 | Green : Tmp:=32;
|
|---|
| 213 | Cyan : Tmp:=36;
|
|---|
| 214 | Red : Tmp:=31;
|
|---|
| 215 | Magenta : Tmp:=35;
|
|---|
| 216 | Brown : Tmp:=33; {yellow with in lower set!}
|
|---|
| 217 | Lightgray: Tmp:=37;
|
|---|
| 218 | END;
|
|---|
| 219 |
|
|---|
| 220 | Colorstring:=Colorstring+';'+tostr(Tmp)+'m';
|
|---|
| 221 |
|
|---|
| 222 | {$IFDEF OS2}
|
|---|
| 223 | ASM
|
|---|
| 224 | LEA EAX,Actual
|
|---|
| 225 | PUSH EAX //pcbActual
|
|---|
| 226 | LEA EDI,ColorString
|
|---|
| 227 | MOVZXB EAX,[EDI]
|
|---|
| 228 | PUSH EAX //cbWrite
|
|---|
| 229 | INC EDI
|
|---|
| 230 | PUSH EDI //pBuffer
|
|---|
| 231 | PUSH DWORD PTR Handle //FileHandle
|
|---|
| 232 | MOV AL,4
|
|---|
| 233 | CALLDLL DosCalls,282 //DosWrite
|
|---|
| 234 | ADD ESP,16
|
|---|
| 235 | END;
|
|---|
| 236 | {$ENDIF}
|
|---|
| 237 | {$IFDEF Win95}
|
|---|
| 238 | WriteFile(ff^.Handle,ColorString[1],length(ColorString),actual,NIL);
|
|---|
| 239 | {$ENDIF}
|
|---|
| 240 | END;
|
|---|
| 241 |
|
|---|
| 242 | {Set foreground color}
|
|---|
| 243 | PROCEDURE TextColor(Color:BYTE);
|
|---|
| 244 | BEGIN
|
|---|
| 245 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 246 |
|
|---|
| 247 | IF Color > White THEN Color := (Color AND 15) OR 128; {Blink}
|
|---|
| 248 | TextAttr := (TextAttr AND 112) OR Color;
|
|---|
| 249 | SetColors;
|
|---|
| 250 | END;
|
|---|
| 251 |
|
|---|
| 252 | {Set background color}
|
|---|
| 253 | PROCEDURE TextBackground(Color:BYTE);
|
|---|
| 254 | BEGIN
|
|---|
| 255 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 256 | TextAttr := (TextAttr AND $8F) OR ((Color AND $07) SHL 4);
|
|---|
| 257 | SetColors;
|
|---|
| 258 | END;
|
|---|
| 259 |
|
|---|
| 260 | {Clear screen or window}
|
|---|
| 261 | PROCEDURE ClrScr;
|
|---|
| 262 | VAR
|
|---|
| 263 | Fill: Word;
|
|---|
| 264 | {$IFDEF Win95}
|
|---|
| 265 | ff:^FileRec;
|
|---|
| 266 | co:COORD;
|
|---|
| 267 | Actual:LONGWORD;
|
|---|
| 268 | {$ENDIF}
|
|---|
| 269 | BEGIN
|
|---|
| 270 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 271 | {$IFDEF OS2}
|
|---|
| 272 | Fill:= 32 + WORD(TextAttr) SHL 8;
|
|---|
| 273 | VioScrollUpProc(Hi(WindMin),Lo(WindMin),
|
|---|
| 274 | Hi(WindMax),Lo(WindMax),
|
|---|
| 275 | Hi(WindMax)-Hi(WindMin)+1,Fill,0);
|
|---|
| 276 | {$ENDIF}
|
|---|
| 277 | {$IFDEF Win95}
|
|---|
| 278 | Fill:= TextAttr;
|
|---|
| 279 | ff:=@Output;
|
|---|
| 280 | co.x:=Lo(WindMin);
|
|---|
| 281 | co.y:=Hi(WindMin);
|
|---|
| 282 | FillConsoleOutputAttribute(ff^.Handle,Fill,
|
|---|
| 283 | (Hi(WindMax)-Hi(WindMin))*(Lo(WindMax)-Lo(WindMin)),
|
|---|
| 284 | LONGWORD(co),Actual);
|
|---|
| 285 | FillConsoleOutputCharacter(ff^.Handle,' ',
|
|---|
| 286 | (Hi(WindMax)-Hi(WindMin))*(Lo(WindMax)-Lo(WindMin)),
|
|---|
| 287 | LONGWORD(co),Actual);
|
|---|
| 288 | {$ENDIF}
|
|---|
| 289 | GotoXY(1,1);
|
|---|
| 290 | END;
|
|---|
| 291 |
|
|---|
| 292 | {returns current cursor X position}
|
|---|
| 293 | FUNCTION WhereX: Byte;
|
|---|
| 294 | {$IFDEF Win95}
|
|---|
| 295 | VAR csbi:CONSOLE_SCREEN_BUFFER_INFO;
|
|---|
| 296 | ff:^FileRec;
|
|---|
| 297 | {$ENDIF}
|
|---|
| 298 | BEGIN
|
|---|
| 299 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 300 | {$IFDEF OS2}
|
|---|
| 301 | WhereX := VioWhereXProc - Lo(WindMin);
|
|---|
| 302 | {$ENDIF}
|
|---|
| 303 | {$IFDEF Win95}
|
|---|
| 304 | ff:=@Output;
|
|---|
| 305 | GetConsoleScreenBufferInfo(ff^.Handle,csbi);
|
|---|
| 306 | WhereX:=csbi.dwCursorPosition.X+1-Lo(WindMin);
|
|---|
| 307 | {$ENDIF}
|
|---|
| 308 | END;
|
|---|
| 309 |
|
|---|
| 310 | {returns current cursor Y position}
|
|---|
| 311 | FUNCTION WhereY: WORD;
|
|---|
| 312 | {$IFDEF Win95}
|
|---|
| 313 | VAR csbi:CONSOLE_SCREEN_BUFFER_INFO;
|
|---|
| 314 | ff:^FileRec;
|
|---|
| 315 | {$ENDIF}
|
|---|
| 316 | BEGIN
|
|---|
| 317 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 318 | {$IFDEF OS2}
|
|---|
| 319 | WhereY:= VioWhereYProc - Hi(WindMin);
|
|---|
| 320 | {$ENDIF}
|
|---|
| 321 | {$IFDEF Win95}
|
|---|
| 322 | ff:=@Output;
|
|---|
| 323 | GetConsoleScreenBufferInfo(ff^.Handle,csbi);
|
|---|
| 324 | WhereY:=csbi.dwCursorPosition.Y+1-Hi(WindMin);
|
|---|
| 325 | {$ENDIF}
|
|---|
| 326 | END;
|
|---|
| 327 |
|
|---|
| 328 | {Deletes til end of line}
|
|---|
| 329 | PROCEDURE ClrEol;
|
|---|
| 330 | VAR
|
|---|
| 331 | Value:WORD;
|
|---|
| 332 | Y: BYTE;
|
|---|
| 333 | BEGIN
|
|---|
| 334 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 335 | Value := Ord(' ') + WORD(TextAttr) SHL 8;
|
|---|
| 336 | {$IFDEF OS2}
|
|---|
| 337 | Y:=VioWhereYProc-1;
|
|---|
| 338 | VioScrollUpProc(Y,VioWhereXProc-1,Y,Lo(WindMax),1,Value,0);
|
|---|
| 339 | {$ENDIF}
|
|---|
| 340 | END;
|
|---|
| 341 |
|
|---|
| 342 | {Insert empty line}
|
|---|
| 343 | PROCEDURE InsLine;
|
|---|
| 344 | VAR
|
|---|
| 345 | value:WORD;
|
|---|
| 346 | BEGIN
|
|---|
| 347 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 348 | value := Ord(' ') + WORD(TextAttr) SHL 8;
|
|---|
| 349 | {$IFDEF OS2}
|
|---|
| 350 | VioScrollDnProc(VioWhereYProc-1,Lo(WindMin),Hi(WindMax),Lo(WindMax),1,Value,0);
|
|---|
| 351 | {$ENDIF}
|
|---|
| 352 | END;
|
|---|
| 353 |
|
|---|
| 354 | {Delete the current line}
|
|---|
| 355 | PROCEDURE DelLine;
|
|---|
| 356 | VAR
|
|---|
| 357 | value:WORD;
|
|---|
| 358 | BEGIN
|
|---|
| 359 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 360 | Value := Ord(' ') + WORD(TextAttr) SHL 8;
|
|---|
| 361 | {$IFDEF OS2}
|
|---|
| 362 | VioScrollUpProc(VioWhereYProc-1,Lo(WindMin),Hi(WindMax),Lo(WindMax),1,Value,0);
|
|---|
| 363 | {$ENDIF}
|
|---|
| 364 | END;
|
|---|
| 365 |
|
|---|
| 366 | {sets low intensity}
|
|---|
| 367 | PROCEDURE LowVideo;
|
|---|
| 368 | BEGIN
|
|---|
| 369 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 370 | TextAttr := TextAttr AND $F7;
|
|---|
| 371 | SetColors;
|
|---|
| 372 | END;
|
|---|
| 373 |
|
|---|
| 374 | {sets normal intensity}
|
|---|
| 375 | PROCEDURE NormVideo;
|
|---|
| 376 | BEGIN
|
|---|
| 377 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 378 | TextAttr := NormAttr;
|
|---|
| 379 | SetColors;
|
|---|
| 380 | END;
|
|---|
| 381 |
|
|---|
| 382 | {sets high intensity}
|
|---|
| 383 | PROCEDURE HighVideo;
|
|---|
| 384 | BEGIN
|
|---|
| 385 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 386 | TextAttr := TextAttr OR $08;
|
|---|
| 387 | SetColors;
|
|---|
| 388 | END;
|
|---|
| 389 |
|
|---|
| 390 |
|
|---|
| 391 | PROCEDURE InitCrt;
|
|---|
| 392 | VAR Size:WORD;
|
|---|
| 393 | Value:WORD;
|
|---|
| 394 | {$IFDEF Win95}
|
|---|
| 395 | co:COORD;
|
|---|
| 396 | ff:^FileRec;
|
|---|
| 397 | Actual:LONGWORD;
|
|---|
| 398 | {$ENDIF}
|
|---|
| 399 | BEGIN
|
|---|
| 400 | Size := 2;
|
|---|
| 401 | {$IFDEF OS2}
|
|---|
| 402 | VioReadCellStrProc(Value, Size, WhereY-1, WhereX-1, 0);
|
|---|
| 403 | {$ENDIF}
|
|---|
| 404 | {$IFDEF Win95}
|
|---|
| 405 | co.X:=1;
|
|---|
| 406 | co.Y:=1;
|
|---|
| 407 | ff:=@Output;
|
|---|
| 408 | ReadConsoleOutputAttribute(ff^.Handle,Value,2,LONGWORD(co),Actual);
|
|---|
| 409 | {$ENDIF}
|
|---|
| 410 | NormAttr := Hi(Value) AND $7F;
|
|---|
| 411 | TextAttr:=NormAttr;
|
|---|
| 412 | {NormVideo;}
|
|---|
| 413 | CheckBreak:=TRUE;
|
|---|
| 414 | CheckEOF:=TRUE;
|
|---|
| 415 | END;
|
|---|
| 416 |
|
|---|
| 417 | {checks if a key was pressed}
|
|---|
| 418 | FUNCTION KeyPressed: BOOLEAN;
|
|---|
| 419 | {$IFDEF Win95}
|
|---|
| 420 | VAR ff:^FileRec;
|
|---|
| 421 | ir:INPUT_RECORD;
|
|---|
| 422 | Actual:LONGWORD;
|
|---|
| 423 | {$ENDIF}
|
|---|
| 424 | BEGIN
|
|---|
| 425 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 426 | {$IFDEF OS2}
|
|---|
| 427 | KeyPressed:=KeyPressedProc;
|
|---|
| 428 | {$ENDIF}
|
|---|
| 429 | {$IFDEF Win95}
|
|---|
| 430 | ff:=@Input;
|
|---|
| 431 |
|
|---|
| 432 | SetConsoleMode(ff^.Handle,ENABLE_WINDOW_INPUT);
|
|---|
| 433 |
|
|---|
| 434 | result:=FALSE;
|
|---|
| 435 | PeekConsoleInput(ff^.Handle,ir,1,Actual);
|
|---|
| 436 | IF ir.EventType=KEY_EVENT THEN
|
|---|
| 437 | IF ir.Event.KeyEvent.bKeyDown THEN result:=TRUE;
|
|---|
| 438 |
|
|---|
| 439 | SetConsoleMode(ff^.Handle,ENABLE_PROCESSED_INPUT OR ENABLE_LINE_INPUT OR
|
|---|
| 440 | ENABLE_ECHO_INPUT OR ENABLE_WINDOW_INPUT OR ENABLE_MOUSE_INPUT OR
|
|---|
| 441 | ENABLE_PROCESSED_OUTPUT OR ENABLE_WRAP_AT_EOL_OUTPUT);
|
|---|
| 442 | {$ENDIF}
|
|---|
| 443 | END;
|
|---|
| 444 |
|
|---|
| 445 | {Reads a character}
|
|---|
| 446 | FUNCTION ReadKey: CHAR;
|
|---|
| 447 | {$IFDEF Win95}
|
|---|
| 448 | VAR ff:^FileRec;
|
|---|
| 449 | ir:INPUT_RECORD;
|
|---|
| 450 | Actual:LONGWORD;
|
|---|
| 451 | LABEL l;
|
|---|
| 452 | {$ENDIF}
|
|---|
| 453 | BEGIN
|
|---|
| 454 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 455 | {$IFDEF OS2}
|
|---|
| 456 | ReadKey:=ReadKeyProc;
|
|---|
| 457 | {$ENDIF}
|
|---|
| 458 | {$IFDEF Win95}
|
|---|
| 459 | ff:=@Input;
|
|---|
| 460 |
|
|---|
| 461 | SetConsoleMode(ff^.Handle,ENABLE_WINDOW_INPUT);
|
|---|
| 462 |
|
|---|
| 463 | REPEAT
|
|---|
| 464 | ReadConsoleInput(ff^.Handle,ir,1,Actual);
|
|---|
| 465 | IF ir.EventType=KEY_EVENT THEN
|
|---|
| 466 | IF ir.Event.KeyEvent.bKeyDown THEN goto l;
|
|---|
| 467 | UNTIL FALSE;
|
|---|
| 468 | l:
|
|---|
| 469 | ReadKey:=ir.Event.KeyEvent.uChar.AsciiChar;
|
|---|
| 470 | SetConsoleMode(ff^.Handle,ENABLE_PROCESSED_INPUT OR ENABLE_LINE_INPUT OR
|
|---|
| 471 | ENABLE_ECHO_INPUT OR ENABLE_WINDOW_INPUT OR ENABLE_MOUSE_INPUT OR
|
|---|
| 472 | ENABLE_PROCESSED_OUTPUT OR ENABLE_WRAP_AT_EOL_OUTPUT);
|
|---|
| 473 | {$ENDIF}
|
|---|
| 474 | END;
|
|---|
| 475 |
|
|---|
| 476 | { Set a text mode. (BW40,CO40,BW80,CO80,Mono,Font8x8}
|
|---|
| 477 | PROCEDURE TextMode(Mode: Integer);
|
|---|
| 478 | VAR
|
|---|
| 479 | Bios: BYTE;
|
|---|
| 480 | Value: Word;
|
|---|
| 481 | {$IFDEF OS2}
|
|---|
| 482 | VioMode:VIOMODEINFO;
|
|---|
| 483 | VioConfig:VIOCONFIGINFO;
|
|---|
| 484 | {$ENDIF}
|
|---|
| 485 | BEGIN
|
|---|
| 486 | IF ApplicationType=1 THEN CrtError;
|
|---|
| 487 | {$IFDEF OS2}
|
|---|
| 488 | {Get current video mode}
|
|---|
| 489 | VioMode.cb := SizeOf(VioModeInfo);
|
|---|
| 490 | VioGetModeProc(VioMode, 0);
|
|---|
| 491 |
|
|---|
| 492 | {update LastMode}
|
|---|
| 493 | WITH VioMode DO
|
|---|
| 494 | BEGIN
|
|---|
| 495 | IF Col = 40 THEN LastMode := BW40
|
|---|
| 496 | ELSE LastMode := BW80;
|
|---|
| 497 | IF (fbType AND 4) = 0 THEN
|
|---|
| 498 | IF LastMode = BW40 THEN LastMode := CO40
|
|---|
| 499 | ELSE LastMode := CO80;
|
|---|
| 500 | IF Color = 0 THEN LastMode := Mono;
|
|---|
| 501 | IF Row > 25 THEN Inc(LastMode,Font8x8);
|
|---|
| 502 | END;
|
|---|
| 503 |
|
|---|
| 504 | TextAttr := LightGray;
|
|---|
| 505 | Bios := Lo(Mode);
|
|---|
| 506 | VioConfig.cb := SizeOf(VioConfigInfo);
|
|---|
| 507 |
|
|---|
| 508 | {Get adapter info}
|
|---|
| 509 | VioGetConfigProc(0, VioConfig, 0);
|
|---|
| 510 |
|
|---|
| 511 | WITH VioMode DO
|
|---|
| 512 | BEGIN
|
|---|
| 513 | VRes := 400;
|
|---|
| 514 | HRes := 720;
|
|---|
| 515 | cb := SizeOf(VioModeInfo);
|
|---|
| 516 | Row := 25;
|
|---|
| 517 | Col := 80;
|
|---|
| 518 | fbType := 1;
|
|---|
| 519 | Color := 4; { 16 Colors }
|
|---|
| 520 |
|
|---|
| 521 | IF ((Bios=BW40)OR(Bios=CO40)) THEN
|
|---|
| 522 | BEGIN
|
|---|
| 523 | Col := 40;
|
|---|
| 524 | HRes := 360;
|
|---|
| 525 | END;
|
|---|
| 526 | END;
|
|---|
| 527 |
|
|---|
| 528 | IF (Mode AND Font8x8) <> 0 THEN
|
|---|
| 529 | BEGIN
|
|---|
| 530 | IF VioConfig.Adapter<3 THEN {Mono, CGA, EGA}
|
|---|
| 531 | BEGIN
|
|---|
| 532 | VioMode.VRes := 350;
|
|---|
| 533 | VioMode.HRes := 640;
|
|---|
| 534 | VioMode.Row := 43;
|
|---|
| 535 | END
|
|---|
| 536 | ELSE
|
|---|
| 537 | BEGIN
|
|---|
| 538 | VioMode.VRes := 400;
|
|---|
| 539 | VioMode.HRes := 720;
|
|---|
| 540 | VioMode.Row := 50;
|
|---|
| 541 | END;
|
|---|
| 542 | END;
|
|---|
| 543 |
|
|---|
| 544 | CASE Bios of
|
|---|
| 545 | BW40,BW80: VioMode.fbType := 5;
|
|---|
| 546 | MONO:
|
|---|
| 547 | BEGIN
|
|---|
| 548 | VioMode.HRes := 720;
|
|---|
| 549 | VioMode.VRes := 350;
|
|---|
| 550 | VioMode.Color := 0;
|
|---|
| 551 | VioMode.fbType := 0; {no colors}
|
|---|
| 552 | END;
|
|---|
| 553 | END; {case}
|
|---|
| 554 |
|
|---|
| 555 | {try to set mode}
|
|---|
| 556 | VioSetModeProc(VioMode, 0);
|
|---|
| 557 | {See what mode is set}
|
|---|
| 558 | VioGetModeProc(VioMode, 0);
|
|---|
| 559 | NormVideo;
|
|---|
| 560 |
|
|---|
| 561 | {Set window dimensions}
|
|---|
| 562 | WindMin := 0;
|
|---|
| 563 | WindMax := VioMode.Col - 1 + (VioMode.Row - 1) SHL 8;
|
|---|
| 564 |
|
|---|
| 565 | {Clear screen}
|
|---|
| 566 | Value := 32 + WORD(TextAttr) SHL 8; { Clear screen }
|
|---|
| 567 | VioScrollUpProc(0,0,65535,65535,65535,Value,0);
|
|---|
| 568 | {$ENDIF}
|
|---|
| 569 | END;
|
|---|
| 570 |
|
|---|
| 571 | PROCEDURE Delay(ms:LONGWORD);
|
|---|
| 572 | BEGIN
|
|---|
| 573 | {$IFDEF OS2}
|
|---|
| 574 | IF ApplicationType<>1 THEN
|
|---|
| 575 | ASM
|
|---|
| 576 | PUSH DWORD PTR ms
|
|---|
| 577 | MOV AL,1
|
|---|
| 578 | CALLDLL DosCalls,229 //DosSleep
|
|---|
| 579 | ADD ESP,4
|
|---|
| 580 | END;
|
|---|
| 581 | {$ENDIF}
|
|---|
| 582 | {$IFDEF Win95}
|
|---|
| 583 | ASM
|
|---|
| 584 | PUSH DWORD PTR ms
|
|---|
| 585 | CALLDLL Kernel32,'Sleep'
|
|---|
| 586 | END;
|
|---|
| 587 | {$ENDIF}
|
|---|
| 588 | END;
|
|---|
| 589 |
|
|---|
| 590 | BEGIN
|
|---|
| 591 | IF ApplicationType<>1 THEN InitCrt;
|
|---|
| 592 | END.
|
|---|