{ Program THELP was written by a Mr. Glenn Wood of the Greenville PC Club of Greenville, Texas. Mr. Wood learned the principles demonstrated in this program in a class taught by Mr. Stephen R. Davis, also of Greenville. One suggestion for a way to improve this program can be inferred from Mr. Davis's own comment about the program in a letter he wrote to Borland International: "Note that the window opening is slow because in our class we insisted on using the BIOS interrupt rather than go directly to screen memory ourselves." } PROGRAM THELP; {$C-} {$K-} {VARIABLE SECTION FOR 'THELP'} type text80 = string[80]; RegType = record ax,bx,cx,dx,bp,si,di,ds,es,flags:integer end; HalfRegType = record al,ah,bl,bh,cl,ch,dl,dh:byte end; IntrType = record ip,cs : integer end; const EntryChar = 19; { ALT 'R' } Escape = 0; FirstRow = 3; FirstCol = 11; WindowWidth = 60; WindowLength = 18; Dr = 3; Mr = 12; Cr = $0D; UserInt = $66; KybdInt = $16; ProgSize : integer = $A000; { approx. program size } Regs : regtype = (ax:0;bx:0;cx:0;dx:0;bp:0;si:0;di:0;ds:0;es:0;flags:0); SaveDS :integer = 0; var SaveReg : RegType; SaveHalf : HalfRegType absolute SaveReg; HalfReg : HalfRegType absolute regs; i,j,x,y : integer; CursorPos : integer; Selection : integer; savebuf : array[1..windowwidth] of array[1..windowlength] of integer; { MISC. PROCEDURES AND FUNTIONS FOR THELP } procedure Bright(line:text80); begin textcolor(15); write(line); textcolor(7); end; procedure PrintHeading; begin bright('T'); write('URBO Pascal '); bright('Help '); write('Ver 2.0'); end; procedure PrintMCS; begin bright('M'); write('agnum '); bright('C'); write('ustom '); bright('S'); write('oftware'); end; procedure Border; begin GotoXY(1,1); {clear the window now} Write(chr(218)); for i:=2 to windowwidth-1 do Write(chr(196)); Write(chr(191)); for i:=2 to windowlength-1 do begin GotoXY(1, i); Write(chr(179)); for j := 2 to windowwidth-1 do Write(' '); GotoXY(windowwidth, i); Write(chr(179)); end; GotoXY(1, windowlength); Write(chr(192)); for i:=2 to windowwidth-1 do Write(chr(196)); Write(chr(217)); END; function GetScreenChar:integer; begin savereg.ax := $0800; {9 -> get character/attr @ cursor} savereg.bx := 0; Intr($10,savereg); GetScreenChar := savereg.ax end; procedure PutScreenChar(input:integer); begin savereg.ax := $0900 + (input and $FF); {a -> put character/attr @ cursor} savereg.bx := input shr 8; {put the attrib in bl and 0 in bh} savereg.cx := 1; Intr($10,savereg) end; procedure OpenWindow; begin window (firstcol, firstrow, firstcol+windowwidth, firstrow+windowlength); for j := 1 to windowlength do for i := 1 to windowwidth do begin GoToXY(i,j); savebuf[i][j] := GetScreenChar {get a attribute/character at the cursor} end; border; window (firstcol+1,firstrow+1,firstcol+windowwidth-2,firstrow+windowlength-2); gotoxy(1,1); end; procedure closewindow; begin window (firstcol, firstrow, firstcol+windowwidth, firstrow+windowlength); for j := 1 to windowlength do for i := 1 to windowwidth do begin GoToXY(i,j); PutScreenChar(savebuf[i][j]) end end; { MENU PRINT PROCEDURES FOR THELP } procedure PrintMenu(number:integer); begin case number of 0 : begin gotoxy(mr+3,2); PrintHeading; gotoxy(mr+7,3); PrintMCS; gotoxy(mr+12,5); write('MAIN MENU'); gotoxy(mr,6); write('<1> Edit Commands'); gotoxy(mr,7); write('<2> Syntax Structure'); gotoxy(mr,8); write('<3> Standard Procedures/Functions'); gotoxy(mr,9); write('<4> Compiler Directives'); gotoxy(mr,10); write('<5> Runtime Errors'); gotoxy(mr,11); write('<6> I/O Errors'); gotoxy(mr,12); write('<7> Standard Identifiers'); gotoxy(mr,13); write('<8> Version 2 Additions Part I'); gotoxy(mr,14); write('<9> Version 2 Additions Part II'); end; 1 : begin gotoxy(mr+3,2); PrintHeading; gotoxy(mr+7,3); PrintMCS; gotoxy(mr+7,5); write('EDITOR COMMANDS MENU'); gotoxy(mr,7); write('<1> Cursor Movements Part I'); gotoxy(mr,8); write('<2> Cursor Movements Part II'); gotoxy(mr,9); write('<3> Insert and Delete Commands'); gotoxy(mr,10); write('<4> Block Commands'); gotoxy(mr,11); write('<5> Miscellaneous and Options'); end; 2 : begin gotoxy(mr+3,2); PrintHeading; gotoxy(mr+7,3); PrintMCS; gotoxy(mr+6,5); write('SYNTAX STRUCTURE MENU'); gotoxy(mr,6); write('<1> TYPE'); gotoxy(mr,7); write('<2> CONST'); gotoxy(mr,8); write('<3> VAR'); gotoxy(mr,9); write('<4> WITH DO and CASE'); gotoxy(mr,10); write('<5> REPEAT UNTIL and WHILE DO'); gotoxy(mr,11); write('<6> IF THEN ELSE and FOR TO DO'); gotoxy(mr,12); write('<7> PROGRAM, PROCEDURE and FUNCTION'); gotoxy(mr,13); write('<8> Program Structure'); end; 3 : begin gotoxy(mr+3,2); PrintHeading; gotoxy(mr+7,3); PrintMCS; gotoxy(mr,5); write('STANDARD PROCEDURES/FUNCTIONS MENU'); gotoxy(mr,6); write('<1> Input/Output Procedures'); gotoxy(mr,7); write('<2> Arithmetic Functions'); gotoxy(mr,8); write('<3> Scalar Functions/Heap Control'); gotoxy(mr,9); write('<4> String Procedures and Functions'); gotoxy(mr,10); write('<5> File Handling Procedures'); gotoxy(mr,11); write('<6> File Handling Functions'); gotoxy(mr,12); write('<7> Transfer/Screen Procs & Funcs'); gotoxy(mr,13); write('<8> Miscellaneous Proc/Func Part I'); gotoxy(mr,14); write('<9> Miscellaneous Functions Part II'); end; end; repeat gotoxy(19,15); write('Enter Selection ? '); savereg.ax := $00; Intr(userint,savereg); selection := savehalf.ah - 1; until ((selection in [0..9]) and (number in [0,3])) or ((selection in [0..5]) and (number = 1)) or ((selection in [0..8]) and (number = 2)); clrscr; end; procedure Wait; begin gotoxy(14,16); write('PRESS TO RETURN TO MENU'); repeat savereg.ax := 0; Intr(userint,savereg); until savehalf.ah = $01; clrscr; end; procedure CursorMoveI; begin gotoxy(dr,2); write('CURSOR MOVEMENTS Part I :'); gotoxy(dr,4); write(' Character left Ctrl-S -> ',#$1B); gotoxy(dr,5); write(' Alternative Ctrl-H -> '); gotoxy(dr,6); write(' Character right Ctrl-D -> ',#$1A); gotoxy(dr,7); write(' Word left Ctrl-A -> Ctrl ',#$1B); gotoxy(dr,8); write(' Word right Ctrl-F -> Ctrl ',#$1A); gotoxy(dr,9); write(' Line up Ctrl-E -> ',#$18); gotoxy(dr,10); write(' Line down Ctrl-X -> ',#$19); gotoxy(dr,11); write(' Scroll up Ctrl-W -> '); gotoxy(dr,12); write(' Scroll down Ctrl-Z -> '); gotoxy(dr,13); write(' Page up Ctrl-R -> PgUp'); gotoxy(dr,14); write(' Page down Ctrl-C -> PgDn'); Wait; end; procedure CursorMoveII; begin gotoxy(dr,2); write('CURSOR MOVEMENTS Part II :'); gotoxy(dr,4); write(' To left on line Ctrl-Q Ctrl-S -> Home'); gotoxy(dr,5); write(' To right on line Ctrl-Q Ctrl-D -> End'); gotoxy(dr,6); write(' To top of page Ctrl-Q Ctrl-E -> Ctrl Home'); gotoxy(dr,7); write(' To bottom of page Ctrl-Q Ctrl-X -> Ctrl End'); gotoxy(dr,8); write(' To top of file Ctrl-Q Ctrl-R -> Ctrl PgUp'); gotoxy(dr,9); write(' To end of file Ctrl-Q Ctrl-C -> Ctrl PgDn'); gotoxy(dr,10); write(' To top of block Ctrl-Q Ctrl-B -> '); gotoxy(dr,11); write(' To end of block Ctrl-Q Ctrl-K -> '); gotoxy(dr,12); write(' To last cur.pos. Ctrl-Q Ctrl-P -> '); Wait; end; procedure InsertDelete; begin gotoxy(dr,2); write('INSERT and DELETE :'); gotoxy(dr,4); write(' Insert mode on/off Ctrl-V -> Ins'); gotoxy(dr,5); write(' Insert line Ctrl-N -> '); gotoxy(dr,6); write(' Delete line Ctrl-Y -> '); gotoxy(dr,7); write(' Del to end of line Ctrl-Q Ctrl-Y -> '); gotoxy(dr,8); write(' Delete right word Ctrl-T -> '); gotoxy(dr,9); write(' Del char under cursor Ctrl-G -> Del'); gotoxy(dr,10); write(' Delete left character -> '); gotoxy(dr,11); write(' Alternative nothing -> '); Wait; end; procedure BlockCommands; begin gotoxy(dr,2); write('BLOCK COMMANDS :'); gotoxy(dr,4); write(' Mark block begin Ctrl-K Ctrl-B -> F7'); gotoxy(dr,5); write(' Mark block end Ctrl-K Ctrl-K -> F8'); gotoxy(dr,6); write(' Mark single word Ctrl-K Ctrl-T -> '); gotoxy(dr,7); write(' Hide/display block Ctrl-K Ctrl-H -> '); gotoxy(dr,8); write(' Copy block Ctrl-K Ctrl-C -> '); gotoxy(dr,9); write(' Move block Ctrl-K Ctrl-V -> '); gotoxy(dr,10); write(' Delete block Ctrl-K Ctrl-Y -> '); gotoxy(dr,11); write(' Read block from disk Ctrl-K Ctrl-R -> '); gotoxy(dr,12); write(' Write block to disk Ctrl-K Ctrl-W -> '); Wait; end; procedure MiscEditing; begin gotoxy(dr,1); write('MISC. EDITING COMMANDS :'); gotoxy(dr,2); write(' End edit Ctrl-K Ctrl-D -> '); gotoxy(dr,3); write(' Tab Ctrl-I -> Tab'); gotoxy(dr,4); write(' Auto tab on/off Ctrl-Q Ctrl-I -> '); gotoxy(dr,5); write(' Restore line Ctrl-Q Ctrl-L -> '); gotoxy(dr,6); write(' Find Ctrl-Q Ctrl-F -> '); gotoxy(dr,7); write(' Find and Replace Ctrl-Q Ctrl-A -> '); gotoxy(dr,8); write(' Repeat last find Ctrl-L -> '); gotoxy(dr,9); write(' Control char prefix Ctrl-P -> '); gotoxy(dr,10); write(' Abort operation Ctrl-U -> '); gotoxy(dr,11); write('OPTIONS :'); gotoxy(dr,12); write(' B - Backwards U - Ignore upper/lowercase'); gotoxy(dr,13); write(' G - Global W - Whole words only'); gotoxy(dr,14); write(' N - No qestions n - Number of occurences'); Wait; end; procedure PrintType; begin gotoxy(dr,2); write('{ integer, real, boolean, char, string[xx] }'); gotoxy(dr,4); write('TYPE'); gotoxy(dr,5); write(' text80 = STRING[80];'); gotoxy(dr,6); write(' letter = ''a''..''z'';'); gotoxy(dr,7); write(' tones = 1..12;'); gotoxy(dr,8); write(' row = SET OF tones;'); gotoxy(dr,9); write(' chtype = char;'); gotoxy(dr,10); write(' regtype = record'); gotoxy(dr,11); write(' ax,bx,cx,dx,bp,si,di,ds,es,flags:INTEGER'); gotoxy(dr,12); write(' end;'); gotoxy(dr,13); write(' day = (monday,tuesday,wenesday,thursday,'); gotoxy(dr,14); write(' friday,saturday,sunday);'); Wait; end; procedure PrintConst; begin gotoxy(dr,2); write('{ stored in code_segment }'); gotoxy(dr,3); write('{ integer, real, boolean, char, string[xx] }'); gotoxy(dr,5); write('CONST'); gotoxy(dr,6); write(' minus2 = -2;'); gotoxy(dr,7); write(' pagesize = 60;'); gotoxy(dr,8); write(' pi = 3.1415926535;'); gotoxy(dr,9); write(' histring = ''hello'';'); gotoxy(dr,10); write(' valid = TRUE;'); gotoxy(dr,11); write(' msb : BYTE = 0;'); gotoxy(dr,12); write(' lsb : BYTE = 0;'); Wait; end; procedure PrintVar; begin gotoxy(dr,2); write('{ stored in data_segment }'); gotoxy(dr,3); write('{ integer, real, boolean, char, string[xx] }'); gotoxy(dr,4); write('VAR'); gotoxy(dr,5); write(' count,index : INTEGER;'); gotoxy(dr,6); write(' result,value : REAL;'); gotoxy(dr,7); write(' eom,character : CHAR;'); gotoxy(dr,8); write(' line : STRING[80];'); gotoxy(dr,9); write(' error : BOOLEAN;'); gotoxy(dr,10); write(' inventory : FILE OF invtype;'); gotoxy(dr,11); write(' matrix : ARRAY [1..50,1..50] OF INTEGER;'); gotoxy(dr,12); write(' cmdlength : BYTE ABSOLUTE CSEG:$0080;'); gotoxy(dr,13); write(' cmdline : STRING[127] ABSOLUTE CSEG:$0080;'); gotoxy(dr,14); write(' intrip : INTEGER ABSOLUTE $0000:$0040;'); Wait; end; procedure PrintCase; begin gotoxy(dr,2); write('WITH record_identifier DO'); gotoxy(dr,3); write(' statement;'); gotoxy(dr,6); write('CASE expression OF'); gotoxy(dr,7); write(' constant : statement;'); gotoxy(dr,8); write(' constant : statement'); gotoxy(dr,9); write('ELSE'); gotoxy(dr,10); write(' statement;'); gotoxy(dr,11); write(' statement'); gotoxy(dr,12); write('END;'); Wait; end; procedure RepeatWhile; begin gotoxy(dr,4); write('REPEAT'); gotoxy(dr,5); write(' statement;'); gotoxy(dr,6); write(' statement '); gotoxy(dr,7); write('UNTIL condition;'); gotoxy(dr,10); write('WHILE condition DO'); gotoxy(dr,11); write(' statement;'); Wait; end; procedure IfFor; begin gotoxy(dr,2); write('IF condition'); gotoxy(dr,3); write(' THEN statement'); gotoxy(dr,4); write(' ELSE statement;'); gotoxy(dr,7); write('FOR variable := expression1 TO expression2 DO'); gotoxy(dr,8); write(' statement;'); gotoxy(dr,10); write(' or'); gotoxy(dr,12); write('FOR variable := expression1 DOWNTO expression2 DO'); gotoxy(dr,13); write(' statement;'); Wait; end; procedure ProgProcFunc; begin gotoxy(dr,4); write('PROGRAM progname;'); gotoxy(dr,7); write('PROCEDURE procname(VAR num1,num2 : INTEGER; ch : CHAR);'); gotoxy(dr,8); write('PROCEDURE procname(str1 : STRING80; length : REAL);'); gotoxy(dr,11); write('FUNCTION funcname(VAR value : REAL) : INTEGER;'); gotoxy(dr,12); write('FUNCTION funcname(ch : CHAR; num : INTEGER) : STRING80;'); Wait; end; procedure ProgramStructure; begin gotoxy(dr,1); write('PROGRAM programname;'); gotoxy(dr,2); write('type'); gotoxy(dr,3); write(' .....'); gotoxy(dr,4); write('const'); gotoxy(dr,5); write(' .....'); gotoxy(dr,6); write('var'); gotoxy(dr,7); write(' .....'); gotoxy(dr,8); write('PROCEDURE procedurename(variable_list);'); gotoxy(dr,9); write(' .....'); gotoxy(dr,10); write('FUNCTION functionname(variable_list):type_identifier;'); gotoxy(dr,11); write(' .....'); gotoxy(dr,12); write('begin'); gotoxy(dr,13); write(' .....'); gotoxy(dr,14); write('end.'); Wait; end; procedure InputOutput; begin gotoxy(dr,1); write('INPUT/OUTPUT PROCEDURES :'); gotoxy(dr,2); write(' Read(var F:file of type;var v:type);'); gotoxy(dr,3); write(' Read(var F:text;var I:Integer);'); gotoxy(dr,4); write(' Read(var F:text;var R:Real);'); gotoxy(dr,5); write(' Read(var F:text;var C:Char);'); gotoxy(dr,6); write(' Read(var F:text;var S:string);'); gotoxy(dr,7); write(' Readln(var F:text);'); gotoxy(dr,8); write(' Write(var F:file of type;var v:type);'); gotoxy(d