home *** CD-ROM | disk | FTP | other *** search
-
- {DECLARE.PA2}
-
-
- { This utility will let you change the type (shape and visibility) of the
- cursor. At the same time, it saves the previous type.
- For block cursor, set new:= 13 (Works on all machines.)
- For invisible cursor, set new:=8192 }
- {Added by David Malmberg}
-
-
- PROCEDURE ChangeCursor(NewSize : Integer; VAR OldSize : Integer);
-
- BEGIN
- INLINE(
- $31/$C0 { XOR AX,AX ;Set AX=0}
- /$8E/$C0 { MOV ES,AX ;Set ES=0}
- /$26/$A1/$60/$04 { ES: MOV AX,WO[$0460] ;Read old cursor type}
- /$C4/$7E/<OldSize { LES DI,[BP+<OldSize] ;Set address for Old}
- /$AB { STOSW ;Store old value}
- /$B4/$01 { MOV AH,$01 ;}
- /$8B/$4E/<NewSize { MOV CX,[BP+<NewSize] ;Get New value}
- /$CD/$10 { INT $10 ;Set cursor change}
- );
- END;
-
-
-
- FUNCTION DisplayMode : Byte;
-
- VAR Regs : registers;
-
- BEGIN
- Regs.ah := $0F;
- INTR($10, Dos.registers(Regs));
- DisplayMode := Regs.al;
- END; {DisplayMode}
-
-
-
- PROCEDURE reverse;
-
- BEGIN
- IF DisplayMode = Mono
- THEN BEGIN
- TEXTCOLOR(BLACK);
- TEXTBACKGROUND(LIGHTGRAY);
- END
- ELSE BEGIN {some kind of color capability}
- TEXTCOLOR(ReverseTextColor);
- TEXTBACKGROUND(ReverseTextBackground);
- END;
- END; {Reverse}
-
-
-
- PROCEDURE normal;
-
- BEGIN
- IF DisplayMode = Mono
- THEN BEGIN
- TEXTCOLOR(LIGHTGRAY);
- TEXTBACKGROUND(BLACK);
- END
- ELSE BEGIN {some kind of color capability}
- TEXTCOLOR(NormalTextColor);
- TEXTBACKGROUND(NormalTextBackground);
- END;
- END; {Normal}
-
-
- PROCEDURE highlight;
- BEGIN
- IF DisplayMode = Mono
- THEN BEGIN
- TEXTCOLOR(WHITE);
- TEXTBACKGROUND(BLACK);
- END
- ELSE BEGIN {some kind of color capability}
- TEXTCOLOR(HighLightTextColor);
- TEXTBACKGROUND(NormalTextBackground);
- END;
- END;
-
-
-
- PROCEDURE RestoreCursor;
-
-
- PROCEDURE SetCursor(Starting, Ending : Byte);
- {-Set the starting and ending scan lines for the cursor.}
- BEGIN
- INLINE(
- $B4/$01 {MOV AH,1}
- /$8A/$6E/<Starting {MOV CH,[BP+<Starting]}
- /$8A/$4E/<Ending {MOV CL,[BP+<Ending]}
- /$55 {PUSH BP}
- /$CD/$10 {INT $10}
- /$5D {POP BP}
-
- );
- END;
-
- BEGIN
- IF DisplayMode = Mono THEN
- SetCursor(11, 12)
- ELSE
- SetCursor(6, 7);
- END; {RestoreCursor}
-
-
- { Pause }
- {Prompt the user and wait until}
- {a RETURN key is pressed. }
-
- PROCEDURE Pause;
-
- BEGIN
- WriteLn(IO, ' ');
- highlight;
- ChangeCursor(8192, Old_Cursor); {make cursor invisible}
- Write(IO, ' -- Hit <RETURN> to continue --');
- ReadLn;
- normal;
- WriteLn(IO, ' ');
- END; {pause}
-
-
-
- PROCEDURE EXPLAIN_Keys;
- {exhibits diagram of special input key assignments}
-
- BEGIN
- ChangeCursor(8192, Old_Cursor); {make cursor invisible}
- WriteLn(IO, 'EXPLAIN KEYS');
- WriteLn(IO, ' ');
- WriteLn(IO, ' ');
- WriteLn(IO, 'You may use a single key to enter many of the most common commands:');
- WriteLn(IO, ' ');
- WriteLn(IO, ' FUNCTION KEYS CURSOR KEYS');
- WriteLn(IO, ' ┌─────────┬─────────┐ ┌─────────┬─────────┬─────────┬─────────┐');
- WriteLn(IO, ' │ F1 │ F2 │ │ Home │ ^ │ Pg Up │ - │');
- WriteLn(IO, ' │ GET │ DROP │ │NORTHWEST│ NORTH │NORTHEAST│ UP │');
- WriteLn(IO, ' ├─────────┼─────────┤ ├─────────┼─────────┼─────────┼─────────┤');
- WriteLn(IO, ' │ F3 │ F4 │ │ <-- │ │ --> │ + │');
- WriteLn(IO, ' │ EXAMINE │ READ │ │ WEST │ │ EAST │ DOWN │');
- WriteLn(IO, ' ├─────────┼─────────┤ ├─────────┼─────────┼─────────┼─────────┘');
- WriteLn(IO, ' │ F5 │ F6 │ │ End │ v │ Pg Dn │');
- WriteLn(IO, ' │ OPEN │ CLOSE │ │SOUTHWEST│ SOUTH │SOUTHEAST│');
- WriteLn(IO, ' ├─────────┼─────────┤ ├─────────┼─────────┼─────────┘');
- WriteLn(IO, ' │ F7 │ F8 │ │ Ins │ Del │');
- WriteLn(IO, ' │INVENTORY│ LOOK │ │ ENTER │ EXIT │');
- WriteLn(IO, ' ├─────────┼─────────┤ └─────────┴─────────┘');
- WriteLn(IO, ' │ F9 │ F10 │');
- WriteLn(IO, ' │ SCORE │ HELP │');
- WriteLn(IO, ' └─────────┴─────────┘');
- WriteLn(IO, ' ');
- Pause;
- Previous_room := 0; {will print full room description}
- ChangeCursor(13, Old_Cursor); {make cursor visible}
- END;
-
-
-
- FUNCTION GetInputString : s;
- {Gets adventure input sentences -- also inputs function and direction keys}
-
- VAR
- Ch : Char;
- Done : Boolean;
- TempString : s;
- BEGIN
- TempString := ''; {to begin with}
- Done := False;
- ChangeCursor(13, Old_Cursor); {make cursor visible}
- highlight;
- REPEAT
- IF KEYPRESSED
- THEN BEGIN
- Read(KBD, Ch); {Read a character, if ESC (chr(27) then}
- IF ((Ch = Chr(27)) AND OK_To_Display_Keys)
- THEN BEGIN {keystroke must be either ESC key or one}
- {that generates a two-digit code}
- Read(KBD, Ch);
- TempString := ''; {default case for function keys}
- CASE Ch OF
- 'H' {Up arrow} : TempString := 'NORTH';
- 'P' {Down arrow} : TempString := 'SOUTH';
- 'K' {Left arrow} : TempString := 'WEST';
- 'M' {Right arrow} : TempString := 'EAST';
- 'G' {Home} : TempString := 'NORTHWEST';
- 'O' {End} : TempString := 'SOUTHWEST';
- 'I' {PgUp} : TempString := 'NORTHEAST';
- 'Q' {PgDn} : TempString := 'SOUTHEAST';
- 'R' {INS key} : TempString := 'ENTER';
- 'S' {DEL key} : TempString := 'EXIT';
- ';' {F1} : TempString := 'GET ';
-
- '<' {F2 Key} : TempString := 'DROP ';
- '=' {F3 Key} : TempString := 'EXAMINE ';
- '>' {F4 Key} : TempString := 'READ ';
- '?' {F5 Key} : TempString := 'OPEN ';
- '@' {F6 Key} : TempString := 'CLOSE ';
- 'A' {F7 Key} : TempString := 'INVENTORY';
- 'B' {F8 Key} : TempString := 'LOOK';
- 'C' {F9 Key} : TempString := 'SCORE';
- 'D' {F10 Key} : TempString := 'HELP';
- END; {Case}
- IF TempString <> ''
- THEN BEGIN
- Done := True;
- IF POS(' ', TempString) = 0
- THEN WriteLn(IO, TempString) {with CR}
- ELSE BEGIN {GET or EXAMINE or READ}
- Write(IO, TempString); {without CR}
- Done := False;
- END;
- END;
- END {Special Key}
- ELSE {normal key}
- CASE Ch OF
- '?' {Display special keys} : BEGIN
- EXPLAIN_Keys;
- TempString := 'LOOK';
- Done := True;
- END;
- '-' {minus sign} : IF Length(TempString) = 0
- THEN BEGIN
- TempString := 'UP';
- WriteLn(IO, TempString); {with CR}
- Done := True;
- END
- ELSE BEGIN
- Write(IO, Ch); {echo on screen}
- TempString := TempString+Ch;
- END;
- '+' {plus sign} : BEGIN
- TempString := 'DOWN';
- WriteLn(IO, TempString); {with CR}
- Done := True;
- END;
- ^H {backspace} : BEGIN
- IF Length(TempString) > 0
- THEN BEGIN
- Delete(TempString, Length(TempString), 1);
- Write(IO, Chr(8), ' ', Chr(8));
- END;
- END;
- ELSE {for Case}
- BEGIN {default -- for normal keys}
- IF DoingUpperCase THEN Ch := Upcase(Ch); {Capitalize input}
- Write(IO, Ch); {echo on screen}
- IF Ch <> Chr(13)
- THEN TempString := TempString+Upcase(Ch)
- ELSE BEGIN
- Done := True;
- WriteLn(IO, ' ');
- END;
- END; {ELSE of case}
- END; {Case}
- END; {IF keypressed}
- UNTIL Done;
- GetInputString := TempString;
- ChangeCursor(8192, Old_Cursor); {make cursor invisible}
- normal;
- END; {of GetInputString}
-