home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS - Coast to Coast
/
simteldosarchivecoasttocoast2.iso
/
turbopas
/
thelp.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-03-05
|
32KB
|
859 lines
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 <ESC> 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 <DEL> -> ');
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(dr,9); write(' Write(var F:text;I:Integer);');
gotoxy(dr,10); write(' Write(var F:text;R:Real);');
gotoxy(dr,11); write(' Write(var F:text;B:Boolean);');
gotoxy(dr,12); write(' Write(var F:text;C:Char);');
gotoxy(dr,13); write(' Write(var F:text;S:string);');
gotoxy(dr,14); write(' Writeln(var F:text);');
Wait;
end;
procedure Arithmetic;
begin
gotoxy(dr,2); write('ARITHMETIC FUNCTIONS :');
gotoxy(dr,3); write(' Abs(I:Integer):Integer;');
gotoxy(dr,4); write(' Abs(R:Real):Real;');
gotoxy(dr,5); write(' ArcTan(R:Real):Real;');
gotoxy(dr,6); write(' Cos(R:Real):Real;');
gotoxy(dr,7); write(' Exp(R:Real):Real;');
gotoxy(dr,8); write(' Frac(R:Real):Real;');
gotoxy(dr,9); write(' Int(R:Real):Real;');
gotoxy(dr,10); write(' Ln(R:Real):Real;');
gotoxy(dr,11); write(' Sin(R:Real):Real;');
gotoxy(dr,12); write(' Sqr(I:Integer):Integer;');
gotoxy(dr,13); write(' Sqr(R:Real):Real;');
gotoxy(dr,14); write(' Sqrt(R:Real):Real;');
Wait;
end;
procedure ScalarHeap;
begin
gotoxy(dr,2); write('SCALAR FUNCTIONS :');
gotoxy(dr,3); write(' Odd(I:Integer):Boolean;');
gotoxy(dr,4); write(' Pred(X:scalar):scalar;');
gotoxy(dr,5); write(' Succ(X:scalar):scalar;');
gotoxy(dr,6); write('HEAP CONTROL PROCEDURES :');
gotoxy(dr,7); write(' GetMem(var P:pointer;I:Integer);');
gotoxy(dr,8); write(' Mark(var P:pointer);');
gotoxy(dr,9); write(' New(var P:pointer);');
gotoxy(dr,10); write(' Release(var P:pointer);');
gotoxy(dr,11); write('HEAP CONTROL FUNCTIONS :');
gotoxy(dr,12); write(' MemAvail:Integer;');
gotoxy(dr,13); write(' Ord(P:pointer):Integer;');
gotoxy(dr,14); write(' Ptr(I:Integer):pointer;');
Wait;
end;
procedure Strings;
begin
gotoxy(dr,2); write('STRING PROCEDURES :');
gotoxy(dr,3); write(' Delete(var S:string;Pos,Len:Integer);');
gotoxy(dr,4); write(' Insert(S:string;var D:string;Pos:Integer);');
gotoxy(dr,5); write(' Str(I:Integer;var S:string);');
gotoxy(dr,6); write(' Str(R:Real;var S:string);');
gotoxy(dr,7); write(' Val(S:string;var R:Real;var p:Integer);');
gotoxy(dr,8); write(' Val(S:string;var I,P:Integer);');
gotoxy(dr,9); write('STRING FUNCTIONS :');
gotoxy(dr,10); write(' Concat(S1,S2,...,Sn:string):string;');
gotoxy(dr,11); write(' Copy(S:string;Pos,Len:Integer):string;');
gotoxy(dr,12); write(' Length(S:string):Integer;');
gotoxy(dr,13); write(' Pos(Pattern,Source:string):Integer;');
Wait;
end;
procedure FileProc;
begin
gotoxy(dr,2); write('FILE PROCEDURES :');
gotoxy(dr,3); write(' Assign(var F:file;name:string);');
gotoxy(dr,4); write(' BlockRead(var F:file;var Dest:Type;Num:Integer);');
gotoxy(dr,5); write(' BlockWrite(var F:file;var Dest:Type;Num:Integer);');
gotoxy(dr,6); write(' Chain(var F:file);');
gotoxy(dr,7); write(' Close(var F:file);');
gotoxy(dr,8); write(' Erase(var F:file);');
gotoxy(dr,9); write(' Execute(var F:file);');
gotoxy(dr,10); write(' Rename(var F:file;Name:string);');
gotoxy(dr,11); write(' Reset(var F:file);');
gotoxy(dr,12); write(' Rewrite(var F:file);');
gotoxy(dr,13); write(' Seek(var F:file of type;Pos:Integer);');
Wait;
end;
procedure FileFunc;
begin
gotoxy(dr,2); write('FILE FUNCTIONS :');
gotoxy(dr,3); write(' Eof(var F:file):Boolean;');
gotoxy(dr,4); write(' Eoln(var F:Text):Boolean;');
gotoxy(dr,5); write(' FilePos(var F:file of type):Integer;');
gotoxy(dr,6); write(' FilePos(var F:file):Integer;');
gotoxy(dr,7); write(' FileSize(var F:file of type):Integer;');
gotoxy(dr,8); write(' FileSize(var F:file):Integer;');
Wait;
end;
procedure TransferScreen;
begin
gotoxy(dr,1); write('TRANSFER FUNCTIONS :');
gotoxy(dr,2); write(' Chr(I:Integer):Char;');
gotoxy(dr,3); write(' Ord(X:scalar):Integer;');
gotoxy(dr,4); write(' Round(R:Real):Integer;');
gotoxy(dr,5); write(' Trunc(R:Real):Integer;');
gotoxy(dr,6); write('SCREEN RELATED PROCEDURES :');
gotoxy(dr,7); write(' CrtExit;');
gotoxy(dr,8); write(' CrtInit;');
gotoxy(dr,9); write(' ClrEol;');
gotoxy(dr,10); write(' ClrScr;');
gotoxy(dr,11); write(' DelLine;');
gotoxy(dr,12); write(' GotoXY(X,Y:Integer);');
gotoxy(dr,13); write(' InsLine;');
gotoxy(dr,14); write(' LowVideo;');
gotoxy(dr,15); write(' NormVideo;');
Wait;
end;
procedure MiscProc;
begin
gotoxy(dr,1); write('MISCELLANEOUS PROCEDURES :');
gotoxy(dr,2); write(' Bdos(func,param:Integer);');
gotoxy(dr,3); write(' Bios(func,param:Integer);');
gotoxy(dr,4); write(' Delay(mS:Integer);');
gotoxy(dr,5); write(' FillChar(var dest;length:Integer;data:Char);');
gotoxy(dr,6); write(' FillChar(var dest;length:Integer;data:Byte);');
gotoxy(dr,7); write(' Halt;');
gotoxy(dr,8); write(' Move(var source,dest;length:Integer);');
gotoxy(dr,9); write(' Randomize;');
gotoxy(dr,10); write(' Inline($CD/$10);');
gotoxy(dr,11); write(' Intr(intrnum:Integer;regs:Regtype);');
gotoxy(dr,12); write('MISCELLANEOUS FUNCTIONS Part I :');
gotoxy(dr,13); write(' Addr(var variable):Integer;');
gotoxy(dr,14); write(' Addr(<function identifier>):Integer;');
gotoxy(dr,15); write(' Addr(<procedure identifier>):Integer;');
Wait;
end;
procedure MiscFunc;
begin
gotoxy(dr,1); write('MISCELLANEOUS FUNCTIONS Part II :');
gotoxy(dr,2); write(' Bdos(Func,Param:Integer):Byte;');
gotoxy(dr,3); write(' BdosHL(Func,Param:Integer):Integer;');
gotoxy(dr,4); write(' Bios(Func,Param:Integer):Byte;');
gotoxy(dr,5); write(' BiosHL(Func,Param:Integer):Integer');
gotoxy(dr,6); write(' Hi(I:Integer):Integer;');
gotoxy(dr,7); write(' IOresult:Boolean;');
gotoxy(dr,8); write(' KeyPressed:Boolean;');
gotoxy(dr,9); write(' Lo(I:Integer):Integer;');
gotoxy(dr,10); write(' Random(Range:Integer):Integer;');
gotoxy(dr,11); write(' Random:Real;');
gotoxy(dr,12); write(' SizeOf(var variable):Integer;');
gotoxy(dr,13); write(' SizeOf(<type identifier>):Integer;');
gotoxy(dr,14); write(' Swap(I:Integer):Integer;');
gotoxy(dr,15); write(' Upcase(Ch:Char):Char;');
Wait;
end;
procedure PrintDirectives;
begin
gotoxy(dr,1); write('COMPILER DIRECTIVES :');
gotoxy(dr,2); write(' B - I/O Mode Selection [ default B+ ]');
gotoxy(dr,3); write(' C - CNTL S and CNTL C [ default C+ ]');
gotoxy(dr,4); write(' I - I/O Error Handling [ default I+ ]');
gotoxy(dr,5); write(' I - Include Files');
gotoxy(dr,6); write(' R - Index Range Check [ default R- ]');
gotoxy(dr,7); write(' V - Var-parameter Type Checking [ default V+ ]');
gotoxy(dr,8); write(' U - User Interupt [ default U- ]');
gotoxy(dr,9); write(' K - Stack Checking [ default K+ ]');
gotoxy(dr,10); write(' examples :');
gotoxy(dr,11); write(' {$I-}');
gotoxy(dr,12); write(' {$I INCLUDE.FIL}');
gotoxy(dr,13); write(' {$B-,R+,V-}');
gotoxy(dr,14); write(' (*$U+*)');
Wait;
end;
procedure RuntimeErrors;
begin
gotoxy(dr,2); write('RUN-TIME ERROR MESSAGES :');
gotoxy(dr,3); write(' 01 - Floating point overflow.');
gotoxy(dr,4); write(' 02 - Division by zero attempted.');
gotoxy(dr,5); write(' 03 - Sqrt argument error.');
gotoxy(dr,6); write(' 04 - Ln argument error.');
gotoxy(dr,7); write(' 10 - String length error.');
gotoxy(dr,8); write(' 11 - Invalid string index.');
gotoxy(dr,9); write(' 90 - Index out of range.');
gotoxy(dr,10); write(' 91 - Scalar or subrange out of range.');
gotoxy(dr,11); write(' 92 - Out of integer range.');
gotoxy(dr,12); write(' FF - Heap/stack collision.');
Wait;
end;
procedure IOErrors;
begin
gotoxy(dr,1); write('I/O ERROR MESSAGES :');
gotoxy(dr,2); write(' 01 - File does not exist.');
gotoxy(dr,3); write(' 02 - File not open for input.');
gotoxy(dr,4); write(' 03 - File not open for output.');
gotoxy(dr,5); write(' 04 - File not open.');
gotoxy(dr,6); write(' 10 - Error in numeric format.');
gotoxy(dr,7); write(' 20 - Operation not allowed on a logical device.');
gotoxy(dr,8); write(' 21 - Not allowed in direct mode.');
gotoxy(dr,9); write(' 22 - Assign to std files not allowed.');
gotoxy(dr,10); write(' 90 - Record length mismatch.');
gotoxy(dr,11); write(' 91 - Seek beyond end-of-file.');
gotoxy(dr,12); write(' 99 - Unexpected end-of-file.');
gotoxy(dr,13); write(' F0 - Disk write error.');
gotoxy(dr,14); write(' F1 - Directory is full.');
gotoxy(dr,15); write(' F2 - File size overflow. FF - File disappeared.');
Wait;
end;
procedure StdIdentifiers;
begin
gotoxy(dr,2); write('STANDARD IDENTIFIERS :');
gotoxy(dr,3); write(' DSeg:Integer');
gotoxy(dr,4); write(' CSeg:Integer');
gotoxy(dr,5); write(' SSeg:Integer');
gotoxy(dr,6); write(' Seg(Name):Integer');
gotoxy(dr,7); write(' Addr(Name):pointer');
gotoxy(dr,8); write(' Ofs(Name):Integer');
gotoxy(dr,9); write(' Mem[segment:offset]');
gotoxy(dr,10); write(' MemW[segment:offset]');
gotoxy(dr,11); write(' Port[portnum]');
gotoxy(dr,12); write(' PortW[portnum]');
gotoxy(dr,13); write(' LongFilePos LongFileSize');
gotoxy(dr,14); write(' LongSeek MsDos');
Wait;
end;
procedure Version2I;
begin
gotoxy(dr,2); write('VERSION 2 Part I ');
gotoxy(dr,3); write(' Procedures Part I :');
gotoxy(dr,4); write(' Dispose(var P:pointer);');
gotoxy(dr,5); write(' Draw(X1,Y1,X2,Y2,Color:Integer);');
gotoxy(dr,6); write(' FreeMem(var P:pointer,I:Integer);');
gotoxy(dr,7); write(' GraphBackground(Color:Integer);');
gotoxy(dr,8); write(' GraphColorMode;');
gotoxy(dr,9); write(' GraphMode;');
gotoxy(dr,10); write(' GraphWindow(X1,Y1,X2,Y2,Color:Integer);');
gotoxy(dr,11); write(' HiRes;');
gotoxy(dr,12); write(' HiResColor(Color:Integer);');
gotoxy(dr,13); write(' NoSound;');
gotoxy(dr,14); write(' Palette(Color:Integer);');
Wait;
end;
procedure Version2II;
begin
gotoxy(dr,2); write('VERSION 2 Part II');
gotoxy(dr,3); write(' Procedures Part II :');
gotoxy(dr,4); write(' Plot(X,Y,Color:Integer);');
gotoxy(dr,5); write(' Sound(I:Integer);');
gotoxy(dr,6); write(' TextBackground(Color:Integer);');
gotoxy(dr,7); write(' TextColor(Color:Integer);');
gotoxy(dr,8); write(' TextMode(Color:Integer);');
gotoxy(dr,9); write(' Window(X1,Y1,X2,Y2,Color:Integer);');
gotoxy(dr,10); write(' Functions :');
gotoxy(dr,11); write(' MaxAvail:Integer;');
gotoxy(dr,12); write(' WhereX:Integer;');
gotoxy(dr,13); write(' WhereY:Integer;');
Wait;
end;
{ MAIN INTERUPT SERVICE PROCEDURES }
procedure EditCommands;
begin
repeat
PrintMenu(1);
case selection of
1 : CursorMoveI;
2 : CursorMoveII;
3 : InsertDelete;
4 : BlockCommands;
5 : MiscEditing;
end;
until selection = escape;
selection := 10;
end;
procedure Syntax;
begin
repeat
PrintMenu(2);
case selection of
1 : PrintType;
2 : PrintConst;
3 : PrintVar;
4 : PrintCase;
5 : RepeatWhile;
6 : IfFor;
7 : ProgProcFunc;
8 : ProgramStructure;
end;
until selection = escape;
selection := 10;
end;
procedure ProcFunc;
begin
repeat
PrintMenu(3);
case selection of
1 : InputOutput;
2 : Arithmetic;
3 : ScalarHeap;
4 : Strings;
5 : FileProc;
6 : FileFunc;
7 : TransferScreen;
8 : MiscProc;
9 : MiscFunc;
end;
until selection = escape;
selection := 10;
end;
procedure DOIT;
begin
textcolor(7);
repeat
PrintMenu(0);
case selection of
1 : EditCommands;
2 : Syntax;
3 : ProcFunc;
4 : PrintDirectives;
5 : RuntimeErrors;
6 : IOErrors;
7 : StdIdentifiers;
8 : Version2I;
9 : Version2II;
end;
until selection = escape;
end;
procedure ProcessInt; { Start of interupt service }
begin
{when invoked, this procedure saves the registers into the structured constant
'REGS' and restores the ds from the previously saved integer constant 'saveds'}
inline(
$53/ {PUSH BX}
$BB/regs/ {MOV BX,OFFSET REGS}
$2E/$89/$47/$00/ {CS:MOV [BX]0,AX}
$58/ {POP AX}
$2E/$89/$47/$02/ {CS:MOV [BX]2,AX}
$2E/$89/$4F/$04/ {CS:MOV [BX]4,CX}
$2E/$89/$57/$06/ {CS:MOV [BX]6,DX}
$2E/$89/$6F/$08/ {CS:MOV [BX]8,BP}
$2E/$89/$77/$0A/ {CS:MOV [BX]A,SI}
$2E/$89/$7F/$0C/ {CS:MOV [BX]C,DI}
$2E/$8C/$5F/$0E/ {CS:MOV [BX]E,DS}
$2E/$8C/$47/$10/ {CS:MOV [BX]10,ES}
$9C/ {PUSHF}
$58/ {POP AX}
$2E/$89/$47/$12/ {CS:MOV [BX]12,AX}
$2E/$8E/$1E/saveds {CS:MOV DS,SAVEDS -- PUT PROPER DS}
);
if halfreg.ah <> 0 then Intr(userint,regs) else
begin
Intr(userint,regs);
if (halfreg.ah = EntryChar) and (halfreg.al = $00) then
begin
savereg.ax := $0300;
savereg.bx := $0;
Intr($10,savereg); { get cursor position }
cursorpos := savereg.dx;
OpenWindow; { save text in window }
DOIT;
CloseWindow; { put back the text in the window }
savereg.ax := $0200;
savereg.bx := $0;
savereg.dx := cursorpos;
Intr($10,savereg); { restore cursor position }
halfreg.ah := 0;
Intr(userint,regs);
end;
end;
{when invoked this routine restores the registers from the structure constant}
inline(
$BB/REGS/ {MOV BX,OFFSET REGS}
$2E/$8E/$47/$10/ {CS:MOV ES,[BX]10}
$2E/$8E/$5F/$0E/ {CS:MOV DS,[BX]0E}
$2E/$8B/$7F/$0C/ {CS:MOV DI,[BX]0C}
$2E/$8B/$77/$0A/ {CS:MOV SI,[BX]0A}
$2E/$8B/$6F/$08/ {CS:MOV BP,[BX]08}
$2E/$8B/$57/$06/ {CS:MOV DX,[BX]06}
$2E/$8B/$4F/$04/ {CS:MOV CX,[BX]04}
$2E/$8B/$47/$00/ {CS:MOV AX,[BX]00}
$2E/$FF/$77/$12/ {CS:PUSH [BX]12}
$9D/ {POPF}
$2E/$8B/$5F/$02/ {CS:MOV BX,[BX]02}
$5D/ {POP BP} {restore the stack pointer}
$5D {POP BP}
);
inline ($CA/$02/$00) {RETF 02}
end;
{ PROGRAM 'THELP' } { Program installation }
begin
SaveDS := dseg;
SaveReg.ax := $3500 + UserInt;
Intr($21,SaveReg); { get user interupt }
if SaveReg.es <> $00 then
writeln('User Interupt in use -- cant install THELP.')
else
begin
writeln('Installing THELP -- Press < ALT "R" > to Recall help.');
writeln(' Press < ESC > to exit help.');
savereg.ax := $3500 + KybdInt;
Intr($21,savereg); { get keyboard interupt }
savereg.ax := $2500 + UserInt;
savereg.ds := savereg.es;
savereg.dx := savereg.bx;
Intr($21,savereg); { put in user interupt }
savereg.ax := $2500 + KybdInt;
savereg.ds := cseg;
savereg.dx := ofs(ProcessInt);
Intr($21,savereg); { install our interupt processor }
savereg.dx := ProgSize;
Intr($27,savereg); { terminate and stay resident }
end;
inline($CD/$20); { terminate if interupt in use }
end.