dr mt+86 pascal v3.1.1
This commit is contained in:
parent
e866cd3978
commit
3bdae09a1d
BIN
Digital Research MT+86 Pascal v311/87REALS.R86
Normal file
BIN
Digital Research MT+86 Pascal v311/87REALS.R86
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/87TRANS.R86
Normal file
BIN
Digital Research MT+86 Pascal v311/87TRANS.R86
Normal file
Binary file not shown.
124
Digital Research MT+86 Pascal v311/ASMERS.TXT
Normal file
124
Digital Research MT+86 Pascal v311/ASMERS.TXT
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
101 Non-identifier in column 1
|
||||||
|
102 Label identifier preceding colon has been declared before
|
||||||
|
103 Only DD, DW, and DB allowed within a structure definition
|
||||||
|
104 Segment identifier declared before
|
||||||
|
105 Too many nested segments
|
||||||
|
106 Group identifier declared before
|
||||||
|
107 Proc identifier declared before
|
||||||
|
108 Illegal symbol in proc directive
|
||||||
|
109 Structure identifier declared before
|
||||||
|
110 No symbol may follow STRUC
|
||||||
|
111 identifier on ENDS does not match the corresponding SEGMENT command
|
||||||
|
112 More ENDS commands than Segment commands
|
||||||
|
113 identifier on RECORD previously defined
|
||||||
|
114 identifer on DB previously defined
|
||||||
|
115 Group directive must have an identifier
|
||||||
|
116 PROC directive must have an identifier
|
||||||
|
117 STRUC directive must have an identifier
|
||||||
|
118 LABEL directive must have an identifier
|
||||||
|
119 Label identifier on LABEL statement has been declared before
|
||||||
|
120 EXTRN directive must not have a label
|
||||||
|
121 EXTRN directive must be followed by list of "id : type" pairs
|
||||||
|
122 identifier in EXTRN list declared previously
|
||||||
|
123 identifier must be follow by ":" in EXTRN list
|
||||||
|
124 type in EXTRN list must be ABS, BYTE, WORD, DWORD, NEAR, or FAR
|
||||||
|
125 type after LABEL must be BYTE, WORD, DWORD, NEAR, or FAR
|
||||||
|
126 Bad token in SEGMENT directive
|
||||||
|
127 EQU statements must have a label
|
||||||
|
128 Label on EQU statement previously defined
|
||||||
|
129 Improper matching of SEGMENT, ENDS pairs
|
||||||
|
130 Program name must be a unique identifier
|
||||||
|
131 NAME directive has only one argument
|
||||||
|
132 Token following INCLUDE must be a string
|
||||||
|
133 Include file name must end the INCLUDE directive
|
||||||
|
134 Nexted include files are not allowed
|
||||||
|
135 Argument to IF must be an equated symbol
|
||||||
|
136 Mismatch of IF, ELSE, ENDIF directives
|
||||||
|
137 Extra tokens following IF, ELSE, or ENDIF
|
||||||
|
138 End of file encountered
|
||||||
|
139 Only one program name may be declared
|
||||||
|
140 Label type must end the LABEL statement
|
||||||
|
141 Name directive can not have a label
|
||||||
|
201 This opcode must have no operands
|
||||||
|
202 Assume requires a segment register name
|
||||||
|
203 Segment register in assume must be followed by ":"
|
||||||
|
204 Segment name, group name, SEG expression or NOTHING required
|
||||||
|
205 SEG operator in assume must be followed by an identifier
|
||||||
|
206 SEG operator in assume must be followed by a variable or label
|
||||||
|
207 Identifier must follow ":" in assume list
|
||||||
|
208 Comma expected in assume list
|
||||||
|
209 Only one operand allowed with this opcode
|
||||||
|
210 Two operands required with this opcode
|
||||||
|
211 Only two operands allowed with this opcode
|
||||||
|
212 Index expression not closed with right bracket
|
||||||
|
213 PTR expected
|
||||||
|
214 override symbol must be group or segment
|
||||||
|
215 ":" expected
|
||||||
|
216 no fundamental value may start this way
|
||||||
|
217 Right bracket expected
|
||||||
|
218 Invalid symbol for dot operator
|
||||||
|
219 Right paren expected
|
||||||
|
220 Inproper argument to length operator
|
||||||
|
221 Improper argument to size operator
|
||||||
|
222 Improper argument to width operator
|
||||||
|
223 Improper argument to mask operator
|
||||||
|
224 Improper argument to offset operator
|
||||||
|
225 Improper argument to seg operator
|
||||||
|
226 Improper argument to type operator
|
||||||
|
227 THIS must be followed by BYTE, WORD, DWORD, NEAR, or FAR
|
||||||
|
228 Index register encountered outside brackets
|
||||||
|
229 Nested indexing not allowed
|
||||||
|
230 Bad operands to addition operator
|
||||||
|
231 More than one base in expression
|
||||||
|
232 More than one index in expression
|
||||||
|
233 Bad operands to subtraction operator
|
||||||
|
234 Index registers may not be subtracted
|
||||||
|
235 Relative labels in subtraction must have the same base
|
||||||
|
236 Relative number in subtraction must be offsets of the same base
|
||||||
|
237 Invalid id in expression
|
||||||
|
238 Invalid symbol type in type operator
|
||||||
|
239 Low and high are invalid for relocatable segment bases
|
||||||
|
240 Operands must be non-indexed, absolute numbers to this operator
|
||||||
|
241 Operand types not compatable with this opcode
|
||||||
|
242 Nested procedures not allowed
|
||||||
|
243 ENDP not preceded by PROC
|
||||||
|
244 At expression must be an absolute number
|
||||||
|
245 List elements in PUBLIC must be identifiers
|
||||||
|
246 List elements in PUBLIC must be seperated by a comma
|
||||||
|
247 DUP factor in DB, DW, and DD must be an absolute number
|
||||||
|
248 Expressions in list for DB, DW, and DD must be seperated by a comma
|
||||||
|
249 DUP must be followed by a parenthesized expression list
|
||||||
|
250 Bad expression in DUP list
|
||||||
|
251 Relocatable bytes are not allowed
|
||||||
|
252 Only CODE or DATA relative references are allowed
|
||||||
|
253 Can not generate code for group overrides
|
||||||
|
254 Can not generate code for this relocatable number
|
||||||
|
255 No segment register assumed for this segment
|
||||||
|
256 Operand must be accessable through ES for this opcode
|
||||||
|
257 Improper call to Modrm_formal
|
||||||
|
258 Incompatable operans to relation operator
|
||||||
|
259 Argument to OFFSET operator must be a variable or label
|
||||||
|
260 Relative byte out of range (not short)
|
||||||
|
261 CS may not be popped
|
||||||
|
262 Too many expressions to DB, DW, or DD
|
||||||
|
263 Can not generate code for a relocatable segment base
|
||||||
|
264 Can not generate code for relocatable bytes or segment bases
|
||||||
|
265 Relocatables must be CODE or DATA relative
|
||||||
|
266 External references must be from the CODE segment
|
||||||
|
267 Publics must reside in the CODE or DATA segment
|
||||||
|
268 Publics must be labels, variables, or procedures
|
||||||
|
269 Externals must reside in the CODE or DATA segment
|
||||||
|
270 Externals must only be referenced from the CODE segment
|
||||||
|
271 EQU's must be defined before being used.
|
||||||
|
272 Literal strings within expression may not be longer than 2 characters
|
||||||
|
273 Illegal token in opcode field
|
||||||
|
274 END statement may not have a label
|
||||||
|
275 END may only be followed by one code label
|
||||||
|
276 ORG accepts only one expression as an argument
|
||||||
|
277 Expression to ORG must be completely previously defined
|
||||||
|
279 Expression following DUP must be within parenthesis
|
||||||
|
300 Phase 2 location of label does not match phase 3 location
|
||||||
|
400 Illegal character in text
|
||||||
|
401 Illegal digit in number
|
||||||
|
402 Numbers may not terminate with '$'
|
||||||
|
403 Strings may not be greater than one line long
|
BIN
Digital Research MT+86 Pascal v311/ASMT86.001
Normal file
BIN
Digital Research MT+86 Pascal v311/ASMT86.001
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/ASMT86.002
Normal file
BIN
Digital Research MT+86 Pascal v311/ASMT86.002
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/ASMT86.003
Normal file
BIN
Digital Research MT+86 Pascal v311/ASMT86.003
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/ASMT86.004
Normal file
BIN
Digital Research MT+86 Pascal v311/ASMT86.004
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/ASMT86.EXE
Normal file
BIN
Digital Research MT+86 Pascal v311/ASMT86.EXE
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/BCDREALS.R86
Normal file
BIN
Digital Research MT+86 Pascal v311/BCDREALS.R86
Normal file
Binary file not shown.
120
Digital Research MT+86 Pascal v311/CALC.SRC
Normal file
120
Digital Research MT+86 Pascal v311/CALC.SRC
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
(* AS OF 03/12/82 *)
|
||||||
|
(* This program ia a sample PASCAL MT+86 program. It makes your *)
|
||||||
|
(* computed function as a pocket calculator. To use this program *)
|
||||||
|
(* simply compile it, link it with TRANCEND.R86, FPREALS.R86 and *)
|
||||||
|
(* PASLIB. The compiler control command is: *)
|
||||||
|
(* MT+86 CALC *)
|
||||||
|
(* The linker command is: *)
|
||||||
|
(* LINKMT CALC,TRANCEND,FPREALS,PASLIB/S *)
|
||||||
|
(* To execute enter: *)
|
||||||
|
(* CALC *)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROGRAM CALCULATE;
|
||||||
|
|
||||||
|
CONST
|
||||||
|
RCONST = -2.5;
|
||||||
|
RCONST1= 65535.5;
|
||||||
|
|
||||||
|
VAR R1,R2,TEMP:REAL;
|
||||||
|
X : ARRAY [1..2] OF REAL;
|
||||||
|
CH1,OP:CHAR;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION SUBREAL(R1,R2:REAL) : REAL;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
SUBREAL := R1 - R2
|
||||||
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE ADDREAL(VAR R1:REAL; R2:REAL);
|
||||||
|
BEGIN
|
||||||
|
R1 := R1 + R2
|
||||||
|
END;
|
||||||
|
|
||||||
|
PROCEDURE TF(B:BOOLEAN);
|
||||||
|
BEGIN
|
||||||
|
IF B THEN
|
||||||
|
WRITELN('TRUE')
|
||||||
|
ELSE
|
||||||
|
WRITELN('FALSE')
|
||||||
|
END;
|
||||||
|
|
||||||
|
PROCEDURE CALC;
|
||||||
|
BEGIN
|
||||||
|
CASE OP OF
|
||||||
|
'S': WRITELN(SIN(R1));
|
||||||
|
'C': WRITELN(COS(R1));
|
||||||
|
'A': WRITELN(ARCTAN(R1));
|
||||||
|
'L': WRITELN(LN(R1));
|
||||||
|
'E': WRITELN(EXP(R1));
|
||||||
|
'+': BEGIN ADDREAL(X[1],X[2]); WRITELN(X[1]:10:4) END;
|
||||||
|
'-': WRITELN(SUBREAL(X[1],X[2]):10:2);
|
||||||
|
'*': WRITELN(R1 * R2);
|
||||||
|
'/': WRITELN(R1 / R2);
|
||||||
|
'M': WRITELN(-R1);
|
||||||
|
'=': TF(R1 = R2);
|
||||||
|
'N': TF(R1 <> R2);
|
||||||
|
'$': WRITELN(SQRT(R1):10:3,SQRT(R2):10:3);
|
||||||
|
'<': TF(R1 < R2);
|
||||||
|
'>': TF(R1 > R2);
|
||||||
|
'Z': TF(R1 <= R2);
|
||||||
|
'G': TF(R1 >=R2);
|
||||||
|
'1': WRITELN(SQR(R1),' ',SQR(R2));
|
||||||
|
'2': WRITELN(R1 + 1);
|
||||||
|
'3': WRITELN(1+R1);
|
||||||
|
'4': WRITELN(TRUNC(R1));
|
||||||
|
'5': WRITELN(ROUND(R1));
|
||||||
|
'6': WRITELN(RCONST);
|
||||||
|
'7': WRITELN(RCONST1);
|
||||||
|
'8': BEGIN R1 := -2.234; X[1] := 3.456; WRITELN(R1,' ',X[1]); END;
|
||||||
|
|
||||||
|
END;
|
||||||
|
END; (* CALCULATOR *)
|
||||||
|
|
||||||
|
PROCEDURE MENU;
|
||||||
|
BEGIN
|
||||||
|
WRITE('S:SIN ');
|
||||||
|
WRITE('C:COS ');
|
||||||
|
WRITE('A:ARCTAN ');
|
||||||
|
WRITE('L:LN ');
|
||||||
|
WRITE('E:EXP ');
|
||||||
|
WRITE('1:SQR ');
|
||||||
|
WRITELN('$:SQRT ');
|
||||||
|
WRITELN('+, -, *, / ARITHMETIC OPERATORS');
|
||||||
|
WRITELN('M:NEGATE');
|
||||||
|
WRITE('= : EQUAL ');
|
||||||
|
WRITELN('N : NOT EQUAL');
|
||||||
|
WRITE('<:LESS THAN ');
|
||||||
|
WRITELN('>:GREATER THAN ');
|
||||||
|
WRITELN('Z:LESS THAN OR EQUAL TO');
|
||||||
|
WRITELN('G:GREATER THAN OR EQUAL TO');
|
||||||
|
WRITE('4:TRUNC ');
|
||||||
|
WRITELN('5:ROUND');
|
||||||
|
END;
|
||||||
|
|
||||||
|
BEGIN (* MAIN PROGRAM *)
|
||||||
|
REPEAT
|
||||||
|
WRITE('ENTER FIRST OPERAND? ');
|
||||||
|
READ(R1);
|
||||||
|
X[1] := R1;
|
||||||
|
WRITELN('R1=',R1); WRITELN;
|
||||||
|
WRITE('ENTER SECOND OPERAND? ');
|
||||||
|
READ(R2);
|
||||||
|
X[2] := R2;
|
||||||
|
WRITELN('R2=',R2); WRITELN;
|
||||||
|
WRITELN('ENTER OPERATOR:');
|
||||||
|
MENU;
|
||||||
|
WRITE('? ');
|
||||||
|
READ(OP);
|
||||||
|
WRITELN;
|
||||||
|
CALC;
|
||||||
|
WRITELN('Type <ESCAPE> to stop. Any other characer to repeat.');
|
||||||
|
READ(CH1);
|
||||||
|
UNTIL CH1 = CHR(27)
|
||||||
|
END.
|
||||||
|
|
43
Digital Research MT+86 Pascal v311/CPMGET.SRC
Normal file
43
Digital Research MT+86 Pascal v311/CPMGET.SRC
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
(*$S+*) (* rmx/udi version *)
|
||||||
|
MODULE GETREC;
|
||||||
|
|
||||||
|
(*$I FIBDEF.LIB*)
|
||||||
|
|
||||||
|
VAR
|
||||||
|
@LFB: EXTERNAL ^FIB;
|
||||||
|
|
||||||
|
EXTERNAL PROCEDURE @RNB;
|
||||||
|
|
||||||
|
PROCEDURE GET(VAR F:FIB; SZ:INTEGER);
|
||||||
|
VAR
|
||||||
|
IS_EOLN : BOOLEAN;
|
||||||
|
BEGIN
|
||||||
|
F.FEOLN := FALSE; (* DEFAULT IS THAT WE RESET IT *)
|
||||||
|
|
||||||
|
@LFB := ADDR(F);
|
||||||
|
IF F.FEOF THEN
|
||||||
|
BEGIN
|
||||||
|
F.FEOLN := TRUE;
|
||||||
|
EXIT
|
||||||
|
END;
|
||||||
|
|
||||||
|
@RNB; (* GO READ FROM THE FILE/CONSOLE *)
|
||||||
|
|
||||||
|
IF F.FTEXT THEN (* TEXT FILE, EOLN/EOF MUST BE SET *)
|
||||||
|
BEGIN
|
||||||
|
F.FEOF := (F.FBUFFER[0] = CHR($1A)) OR (F.FEOF);
|
||||||
|
IS_EOLN := (F.FBUFFER[0] = CHR($0D)); (* $0D for rmx/udi *)
|
||||||
|
IF (IS_EOLN) OR (F.FEOF) THEN
|
||||||
|
F.FEOLN := TRUE;
|
||||||
|
|
||||||
|
IF (IS_EOLN) AND (F.OPTION = FRDWR) THEN (* GOBBLE LF *)
|
||||||
|
@RNB;
|
||||||
|
|
||||||
|
IF F.FEOF OR F.FEOLN THEN
|
||||||
|
F.FBUFFER[0] := ' ';
|
||||||
|
END
|
||||||
|
END;
|
||||||
|
|
||||||
|
MODEND.
|
||||||
|
|
||||||
|
|
BIN
Digital Research MT+86 Pascal v311/CPMINI.SRC
Normal file
BIN
Digital Research MT+86 Pascal v311/CPMINI.SRC
Normal file
Binary file not shown.
22
Digital Research MT+86 Pascal v311/DBUGHELP.TXT
Normal file
22
Digital Research MT+86 Pascal v311/DBUGHELP.TXT
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<parm> = (<name> or <num>) +/- <num>
|
||||||
|
<num> = <int> or $ <hexnum> or $<hexnum>:<hexnum>
|
||||||
|
<name> = <varname> or <procname> : <varname>
|
||||||
|
|
||||||
|
Display commands:
|
||||||
|
D? <parm> where ? is as follows
|
||||||
|
I - INTEGER C - CHAR L - BOOLEAN R - REAL
|
||||||
|
B - BYTE W - WORD S - STRING X - EXTENDED
|
||||||
|
V - var by name
|
||||||
|
VN - display ALL variable names
|
||||||
|
PN - display procnames
|
||||||
|
VN <procname> - display all var names associated with this proc
|
||||||
|
SB <procname> - Set breakpoint
|
||||||
|
RB <procname> - Remove breakpoint
|
||||||
|
E+ Entry/Exit display on
|
||||||
|
E- Entry/Exit display off
|
||||||
|
BE Begin exec at start of user prog
|
||||||
|
GO Continue exec from breakpont
|
||||||
|
TR Exec one Pascal statement and return
|
||||||
|
SE <parm> SEt <parm>
|
||||||
|
T<num> Trace <num> Pascal statements and return
|
||||||
|
|
BIN
Digital Research MT+86 Pascal v311/DEBUGGER.R86
Normal file
BIN
Digital Research MT+86 Pascal v311/DEBUGGER.R86
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/DIS86.EXE
Normal file
BIN
Digital Research MT+86 Pascal v311/DIS86.EXE
Normal file
Binary file not shown.
42
Digital Research MT+86 Pascal v311/E.PAS
Normal file
42
Digital Research MT+86 Pascal v311/E.PAS
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
program e;
|
||||||
|
|
||||||
|
const
|
||||||
|
DIGITS = 200;
|
||||||
|
|
||||||
|
type
|
||||||
|
arrayType = array[ 0..DIGITS ] of integer;
|
||||||
|
|
||||||
|
var
|
||||||
|
high, n, x : integer;
|
||||||
|
a : arrayType;
|
||||||
|
|
||||||
|
begin
|
||||||
|
high := DIGITS;
|
||||||
|
x := 0;
|
||||||
|
|
||||||
|
n := high - 1;
|
||||||
|
while n > 0 do begin
|
||||||
|
a[ n ] := 1;
|
||||||
|
n := n - 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
a[ 1 ] := 2;
|
||||||
|
a[ 0 ] := 0;
|
||||||
|
|
||||||
|
while high > 9 do begin
|
||||||
|
high := high - 1;
|
||||||
|
n := high;
|
||||||
|
while 0 <> n do begin
|
||||||
|
a[ n ] := x MOD n;
|
||||||
|
x := 10 * a[ n - 1 ] + x DIV n;
|
||||||
|
n := n - 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Write( x );
|
||||||
|
end;
|
||||||
|
|
||||||
|
writeln;
|
||||||
|
writeln( 'done' );
|
||||||
|
end.
|
||||||
|
|
||||||
|
|
17
Digital Research MT+86 Pascal v311/ECHO.SRC
Normal file
17
Digital Research MT+86 Pascal v311/ECHO.SRC
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
program echo;
|
||||||
|
|
||||||
|
type
|
||||||
|
pstrg = ^string;
|
||||||
|
|
||||||
|
var
|
||||||
|
p : pstrg;
|
||||||
|
|
||||||
|
external function @cmd : pstrg;
|
||||||
|
|
||||||
|
begin (* echo *)
|
||||||
|
|
||||||
|
p := @cmd;
|
||||||
|
writeln(p^)
|
||||||
|
end.
|
||||||
|
|
||||||
|
:
|
BIN
Digital Research MT+86 Pascal v311/ECHOCODE.EXE
Normal file
BIN
Digital Research MT+86 Pascal v311/ECHOCODE.EXE
Normal file
Binary file not shown.
26
Digital Research MT+86 Pascal v311/FIBDEF.LIB
Normal file
26
Digital Research MT+86 Pascal v311/FIBDEF.LIB
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
(* VERSION 0001 *)
|
||||||
|
(* DATE 03/17/82*)
|
||||||
|
|
||||||
|
(* definition of file info block for unix/udi *)
|
||||||
|
|
||||||
|
type
|
||||||
|
fibpaoc = packed array [0..0] of char;
|
||||||
|
fib = record
|
||||||
|
fname : string[37]; (* 0 *)
|
||||||
|
dummy, (* to align everything on word boundary *)
|
||||||
|
option: (notopen,fwrite,frdwr,frandom, (* 38 *)
|
||||||
|
fconio,ftrmio,flstout,fauxio)
|
||||||
|
buflen: integer; (* 40 *)
|
||||||
|
bufidx: integer; (* 42 *)
|
||||||
|
iosize: integer; (* 44 *)
|
||||||
|
feoln, (* 47 *)
|
||||||
|
feof : boolean; (* 46 *)
|
||||||
|
fbufadr:^fibpaoc; (* 48 *)
|
||||||
|
nosectrs, (* 53 *)
|
||||||
|
ftext : boolean; (* 52 *)
|
||||||
|
sysid: integer; (*fileid on unix, conn for udi 54 *)
|
||||||
|
fbuffer: fibpaoc (* 56 *)
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
.
|
52
Digital Research MT+86 Pascal v311/FLOAT.PAS
Normal file
52
Digital Research MT+86 Pascal v311/FLOAT.PAS
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
program tf( INPUT, OUTPUT );
|
||||||
|
|
||||||
|
var
|
||||||
|
r, a, b, c : real;
|
||||||
|
i, x : integer;
|
||||||
|
|
||||||
|
procedure phi;
|
||||||
|
var
|
||||||
|
prev2, prev1, i, next : integer;
|
||||||
|
v : real;
|
||||||
|
begin
|
||||||
|
writeln( 'should tend towards 1.618033988749...' );
|
||||||
|
prev1 := 1;
|
||||||
|
prev2 := 1;
|
||||||
|
|
||||||
|
for i := 1 to 21 do begin { integer overflow beyond this }
|
||||||
|
next := prev1 + prev2;
|
||||||
|
prev2 := prev1;
|
||||||
|
prev1 := next;
|
||||||
|
|
||||||
|
v := prev1 / prev2;
|
||||||
|
writeln( ' at ', i, ' iterations: ', v );
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin { tf }
|
||||||
|
a := 1.1;
|
||||||
|
b := 2.2;
|
||||||
|
c := 3.3;
|
||||||
|
for i := 1 to 8 do begin
|
||||||
|
writeln( 'a, b, c, i: ', a, b, c, i );
|
||||||
|
|
||||||
|
a := b * c;
|
||||||
|
b := a * c;
|
||||||
|
r := arctan( a );
|
||||||
|
r := cos( a );
|
||||||
|
{ r := exp( a ); }
|
||||||
|
{ r := frac( a ); }
|
||||||
|
{ if a <= 32727.0 then r := int( a ); }
|
||||||
|
r := ln( a );
|
||||||
|
r := sin( a );
|
||||||
|
r := sqr( a );
|
||||||
|
r := sqrt( a );
|
||||||
|
if a <= 32767.0 then x := round( a );
|
||||||
|
if a <= 32767.0 then x := trunc( a );
|
||||||
|
end;
|
||||||
|
|
||||||
|
writeln;
|
||||||
|
writeln( 'a, b, c: ', a, b, c );
|
||||||
|
|
||||||
|
phi;
|
||||||
|
end. { tf }
|
BIN
Digital Research MT+86 Pascal v311/FPREALS.R86
Normal file
BIN
Digital Research MT+86 Pascal v311/FPREALS.R86
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/FULLHEAP.R86
Normal file
BIN
Digital Research MT+86 Pascal v311/FULLHEAP.R86
Normal file
Binary file not shown.
29
Digital Research MT+86 Pascal v311/HLTPC.I86
Normal file
29
Digital Research MT+86 Pascal v311/HLTPC.I86
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
NAME HLT
|
||||||
|
ASSUME CS:CODE,DS:DATA
|
||||||
|
|
||||||
|
DATA SEGMENT PUBLIC
|
||||||
|
DATA ENDS
|
||||||
|
|
||||||
|
CODE SEGMENT PUBLIC
|
||||||
|
;
|
||||||
|
; @HLT FOR PCDOS ... ALSO INCLUDES @BDOS
|
||||||
|
;
|
||||||
|
; MODIFIED 12-11-81 BY MGL TO SAVE/RESTORE BP AROUND A SYSTEM CALL
|
||||||
|
;
|
||||||
|
|
||||||
|
PUBLIC @HLT
|
||||||
|
EXTRN JTABLE:NEAR ;DEFINED IN PCINT.I86
|
||||||
|
|
||||||
|
@HLT PROC NEAR
|
||||||
|
xor ax,ax ;zero AX
|
||||||
|
mov si,ax
|
||||||
|
jmp jtable
|
||||||
|
@HLT ENDP
|
||||||
|
;
|
||||||
|
; NEVER RETURNS
|
||||||
|
;
|
||||||
|
|
||||||
|
CODE ENDS
|
||||||
|
|
||||||
|
END
|
||||||
|
|
154
Digital Research MT+86 Pascal v311/INIPC.I86
Normal file
154
Digital Research MT+86 Pascal v311/INIPC.I86
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
|
||||||
|
; VERSION 0002
|
||||||
|
NAME INIT3
|
||||||
|
|
||||||
|
ASSUME CS:CODE,DS:DATA
|
||||||
|
|
||||||
|
DATA SEGMENT PUBLIC
|
||||||
|
DATA ENDS
|
||||||
|
|
||||||
|
CODE SEGMENT PUBLIC
|
||||||
|
EXTRN @HLT : NEAR
|
||||||
|
|
||||||
|
PUBLIC INIPC
|
||||||
|
PUBLIC @INI3
|
||||||
|
|
||||||
|
INIPC PROC FAR
|
||||||
|
;
|
||||||
|
; this routine is adapted for PCDOS.
|
||||||
|
;
|
||||||
|
MOV AX,CS
|
||||||
|
ADD AX,CS:WORD PTR [3] ;ADD CODE SIZE
|
||||||
|
ADD AX,CS:WORD PTR [5] ;ADD DATA SIZE
|
||||||
|
ADD AX,CS:WORD PTR [7] ;ADD STACK SIZE
|
||||||
|
ADD AX,CS:WORD PTR [9] ;ADD EXTRA SIZE
|
||||||
|
CMP AX,DS:WORD PTR [2] ;COMPARE WITH MAX MEMORY
|
||||||
|
JNA MEMOK
|
||||||
|
PUSH DS ;SAVE ADDRESS OF PSP
|
||||||
|
CALL OUTOFMEM
|
||||||
|
DB 'OUT OF MEMORY'
|
||||||
|
DB 0AH
|
||||||
|
DB 0DH
|
||||||
|
DB '$'
|
||||||
|
OUTOFMEM:
|
||||||
|
MOV AX,CS ;SET OF DS:DX TO POINT TO MESSAGE
|
||||||
|
MOV DS,AX
|
||||||
|
POP DX
|
||||||
|
MOV AH,09 ;DO PRINT STRING
|
||||||
|
INT 021H
|
||||||
|
XOR AX,AX ;SEGMENT ADDRESS OF PSP IS ON STACK BECAUSE WE
|
||||||
|
;PUSHED DS ABOVE
|
||||||
|
PUSH AX ;PUSH OFFSET=0 ONTO STACK
|
||||||
|
RET ;AND TERMINATE THROUGH PSP
|
||||||
|
MEMOK:
|
||||||
|
;
|
||||||
|
; MEMORY IS AVAILABLE. SET UP BASE PAGE
|
||||||
|
;
|
||||||
|
; DETERMINE DS LOCATION
|
||||||
|
MOV AX,CS
|
||||||
|
ADD AX,CS:WORD PTR [3] ;ADD CODE SIZE TO GET BASE OF DATA
|
||||||
|
; COPY PROGRAM SEGMENT PREFIX TO BASE PAGE
|
||||||
|
MOV ES,AX
|
||||||
|
MOV DI,0
|
||||||
|
MOV SI,DI
|
||||||
|
CLD
|
||||||
|
MOV CX,100H
|
||||||
|
REP
|
||||||
|
MOVSB
|
||||||
|
; SAVE PSP ADDRESS IN BASE PAGE
|
||||||
|
MOV ES:WORD PTR [40H],DS
|
||||||
|
; SET UP DS REGISTER
|
||||||
|
MOV DS,AX
|
||||||
|
; SAVE ADDRESS OF DATA IN BASE PAGE
|
||||||
|
MOV WORD PTR [09H],DS
|
||||||
|
; COMPUTE BASE OF EXTRA SEGMENT
|
||||||
|
ADD AX,CS:WORD PTR [5] ;ADD SIZE OF DATA
|
||||||
|
MOV WORD PTR [0FH],AX
|
||||||
|
;COMPUTE BASE OF STACK
|
||||||
|
ADD AX,CS:WORD PTR [09H] ;ADD LENGTH OF EXTRA
|
||||||
|
MOV WORD PTR [15H],AX
|
||||||
|
MOV CX,4 ;CONVERT STACK SIZE FROM PARA TO BYTES
|
||||||
|
MOV BX,CS:WORD PTR [07H]
|
||||||
|
SHL BX,CL
|
||||||
|
MOV WORD PTR [12H],BX ;SAVE IN BASE PAGE
|
||||||
|
;SET UP STACK POINTERS
|
||||||
|
PUSHF
|
||||||
|
POP DX
|
||||||
|
CLI
|
||||||
|
MOV SS,AX
|
||||||
|
MOV SP,BX
|
||||||
|
STI
|
||||||
|
PUSH DX
|
||||||
|
POPF
|
||||||
|
;
|
||||||
|
;NOW CHANGE SIZES TO BYTES NOT PARAGRAPHS.
|
||||||
|
; AND SAVE IN BASE PAGE
|
||||||
|
;
|
||||||
|
MOV AX,CS:WORD PTR [5] ;GET DATA SIZE
|
||||||
|
MOV CL,04
|
||||||
|
SHL AX,CL
|
||||||
|
MOV WORD PTR [06],AX
|
||||||
|
MOV AX,CS:WORD PTR [09H] ;GET EXTRA SIZE
|
||||||
|
MOV BX,AX ;SAVE SIZE
|
||||||
|
MOV CL,04
|
||||||
|
SHL AX,CL
|
||||||
|
MOV WORD PTR [0CH],AX ;SAVE LOW ORDER BYTES
|
||||||
|
MOV AX,BX
|
||||||
|
MOV CL,12
|
||||||
|
SHR AX,CL
|
||||||
|
MOV BYTE PTR [0EH],AL ;SAVE TOP BYTE
|
||||||
|
MOV AX,CS
|
||||||
|
ADD AX,8
|
||||||
|
PUSH AX
|
||||||
|
XOR AX,AX
|
||||||
|
PUSH AX
|
||||||
|
RET ;RETURN TO MAIN PROGRAM
|
||||||
|
INIPC ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@INI3 PROC NEAR
|
||||||
|
MOV AX,DS
|
||||||
|
MOV ES,AX ;NOW ES:0 IS START OF DATA AREA
|
||||||
|
MOV DI,6 ;6 IS OFFSET OF DSEG LENGTH
|
||||||
|
MOV CX,ES:WORD PTR [DI]
|
||||||
|
SUB CX,100H ;SEGMENT LENGTH IS IN BYTES
|
||||||
|
MOV DI,100H ;START ADDRESS OF FILL
|
||||||
|
XOR AX,AX ;DATA TO FILL WITH
|
||||||
|
REP
|
||||||
|
STOSB ;ZERO IT ALL
|
||||||
|
|
||||||
|
;
|
||||||
|
; NOW IF OVERLAYS ARE LINKED INTO THE ROOT ZERO THE FIRST
|
||||||
|
; BYTE OF THE OVERLAY AREAS
|
||||||
|
;
|
||||||
|
MOV AX,CS
|
||||||
|
MOV ES,AX ;NOW CS:0 IS START OF CODE
|
||||||
|
MOV DI,0CH ;0C IS OFFSET OF NAME CONTROL BLOCK
|
||||||
|
MOV AX,ES:WORD PTR [DI]
|
||||||
|
MOV BX,ES:WORD PTR 2[DI]
|
||||||
|
;
|
||||||
|
; IF AX=BX THEN OVERLAYS WERE NOT LINKED INTO THIS PROGRAM
|
||||||
|
;
|
||||||
|
CMP AX,BX
|
||||||
|
JZ XIT
|
||||||
|
|
||||||
|
MOV DI,BX ;ELSE EI:DI NOW POINTS TO OVERLAY AREA TABLE
|
||||||
|
MOV CX,16 ;NUMBER OF ENTRIES IN THE TABLE
|
||||||
|
|
||||||
|
LP: MOV SI,ES:WORD PTR [DI] ;GET OFFSET OF OVERLAY AREA
|
||||||
|
MOV ES:BYTE PTR [SI],0 ;PUT A ZERO THERE
|
||||||
|
INC DI ;AND BUMP TO NEXT OFFSET IN TABLE
|
||||||
|
INC DI
|
||||||
|
LOOP LP ;DO IT 16 TIMES
|
||||||
|
|
||||||
|
XIT: RET
|
||||||
|
|
||||||
|
@INI3 ENDP
|
||||||
|
|
||||||
|
CODE ENDS
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
|
96
Digital Research MT+86 Pascal v311/IOALONE.DOC
Normal file
96
Digital Research MT+86 Pascal v311/IOALONE.DOC
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
|
||||||
|
|
||||||
|
If you wish to use MT+86 programs in a stand-alone mode, you
|
||||||
|
must rewrite @RNC, @WNC, GET and PUT. Skeletons for these routines
|
||||||
|
are provided below.
|
||||||
|
|
||||||
|
Copyright 1982 by Digital Research, Inc.
|
||||||
|
|
||||||
|
(*$I FIBDEF.LIB*)
|
||||||
|
TYPE
|
||||||
|
PTR = ^BYTE;
|
||||||
|
var
|
||||||
|
@lfb : external ^fib;
|
||||||
|
@SYSIN : EXTERNAL PTR;
|
||||||
|
@SYSOU : EXTERNAL PTR;
|
||||||
|
|
||||||
|
EXTERNAL PROCEDURE @PUTCH(CH:CHAR);
|
||||||
|
EXTERNAL FUNCTION @GETCH : CHAR;
|
||||||
|
EXTERNAL PROCEDURE @RNB;
|
||||||
|
EXTERNAL PROCEDURE @WNB;
|
||||||
|
|
||||||
|
FUNCTION @RNC:CHAR;
|
||||||
|
(* this function returns the first character in the file buffer. *)
|
||||||
|
(* It is used for TEXT and File of Char input. *)
|
||||||
|
BEGIN
|
||||||
|
IF @LFB^.OPTION > FRANDOM THEN (* DON'T GIVE BUFFER, BUT READ DIRECTLY *)
|
||||||
|
(* IF CONSOLE/TERMINAL FILE *)
|
||||||
|
BEGIN
|
||||||
|
GET(@LFB^,@LFB^.BUFLEN); (* fill input buffer *)
|
||||||
|
@RNC := @LFB^.FBUFFER[0] (* return window variable *)
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
@RNC := @LFB^.FBUFFER[0]; (* @RNC := F^ *)
|
||||||
|
GET(@LFB^,@LFB^.BUFLEN); (* GET(F) *)
|
||||||
|
END
|
||||||
|
END;
|
||||||
|
|
||||||
|
PROCEDURE @WNC(CH:CHAR);
|
||||||
|
(* The oposite of RNC *)
|
||||||
|
BEGIN
|
||||||
|
@LFB^.FBUFFER[0] := CH; (* F^ := CH *)
|
||||||
|
PUT(@LFB^,@LFB^.BUFLEN) (* PUT(F) *)
|
||||||
|
END;
|
||||||
|
|
||||||
|
PROCEDURE GET(VAR F:FIB; SZ:INTEGER);
|
||||||
|
(* This routine fills the buffer in the FIB and checks for *)
|
||||||
|
(* EOF and EOLN. @RNB must be written by the user. IOSIZE *)
|
||||||
|
(* is the window size in bytes *)
|
||||||
|
VAR
|
||||||
|
IS_EOLN : BOOLEAN;
|
||||||
|
BEGIN
|
||||||
|
F.FEOLN := FALSE; (* DEFAULT IS THAT WE RESET IT *)
|
||||||
|
|
||||||
|
@LFB := ADDR(F);
|
||||||
|
IF F.FEOF THEN
|
||||||
|
BEGIN
|
||||||
|
F.FEOLN := TRUE;
|
||||||
|
EXIT
|
||||||
|
END;
|
||||||
|
|
||||||
|
@RNB; (* GO READ FROM THE FILE/CONSOLE *)
|
||||||
|
(* into f.fbuffer *)
|
||||||
|
IF F.FTEXT THEN (* TEXT FILE, EOLN/EOF MUST BE SET *)
|
||||||
|
BEGIN
|
||||||
|
F.FEOF := (F.FBUFFER[0] = CHR($1A)) OR (F.FEOF);
|
||||||
|
IS_EOLN := (F.FBUFFER[0] = CHR($0D)); (* $0D for rmx/udi/cpm *)
|
||||||
|
IF (IS_EOLN) OR (F.FEOF) THEN
|
||||||
|
F.FEOLN := TRUE;
|
||||||
|
|
||||||
|
IF (IS_EOLN) AND (F.OPTION = FRDWR) THEN (* GOBBLE LF *)
|
||||||
|
@RNB;
|
||||||
|
|
||||||
|
IF F.FEOF OR F.FEOLN THEN
|
||||||
|
F.FBUFFER[0] := ' ';
|
||||||
|
END
|
||||||
|
END;
|
||||||
|
|
||||||
|
PROCEDURE PUT(VAR F:FIB; SZ:INTEGER);
|
||||||
|
BEGIN
|
||||||
|
@LFB := ADDR(F);
|
||||||
|
@WNB (* GO WRITE BUFFER OUT *)
|
||||||
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Sample routines for @RNB and @WNB can be found in IOMOD.
|
||||||
|
|
||||||
|
|
||||||
|
Licensed users are granted the right to use these skeleton
|
||||||
|
routines.
|
||||||
|
|
||||||
|
Pascal/MT+86 is a trademark of Digital Research. Inc.
|
||||||
|
All information Presented Here Is Proprietary to Digital Research.
|
||||||
|
|
||||||
|
|
487
Digital Research MT+86 Pascal v311/IOMOD.SRC
Normal file
487
Digital Research MT+86 Pascal v311/IOMOD.SRC
Normal file
@ -0,0 +1,487 @@
|
|||||||
|
(* VERSION 0019 *)
|
||||||
|
(* Release 3.0 - April 1, 1982 - MGL *)
|
||||||
|
|
||||||
|
(* 06/08/81 *)
|
||||||
|
(* 08/11/81 *)
|
||||||
|
(* 12/01/81 FIXED @RNB TO SET IOSIZE *)
|
||||||
|
(* 01/14/82 FIXED @CLOSE TO FLUSH BUFFER IF BUFIDX = SIZEOF(SECTOR) *)
|
||||||
|
(* 03/07/82 ADDED maxfcbs and list device i/o, also blockw sets foption *)
|
||||||
|
(* 03/11/82 Added code to handle multi extent files in block i/o *)
|
||||||
|
(* 03/12/82 Split block i/o out into a separate file "blkio.src" *)
|
||||||
|
(* 03/17/82 Added RDR: and PUN: devices *)
|
||||||
|
|
||||||
|
(*$S+*)
|
||||||
|
|
||||||
|
MODULE IOMODULE;
|
||||||
|
|
||||||
|
(* INTERFACE TO CP/M-86 FOR PASCAL/MT+86 *)
|
||||||
|
|
||||||
|
(*$I FIBDEF.LIB*)
|
||||||
|
const
|
||||||
|
maxfcbs = 9;
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
FPTR = ^FIB;
|
||||||
|
FCBLK = PACKED ARRAY [0..36] OF CHAR;
|
||||||
|
SECTOR = PACKED ARRAY [0..127] OF CHAR;
|
||||||
|
DUMMY = PACKED ARRAY[0..0] OF CHAR;
|
||||||
|
PTR = ^DUMMY;
|
||||||
|
|
||||||
|
FCBREC = RECORD
|
||||||
|
ACTIVE : BOOLEAN;
|
||||||
|
FCB : FCBLK;
|
||||||
|
BUFIDX : INTEGER;
|
||||||
|
BUFFER : SECTOR;
|
||||||
|
ENDFILE: BOOLEAN
|
||||||
|
END;
|
||||||
|
|
||||||
|
PTRIX = RECORD
|
||||||
|
CASE BOOLEAN OF
|
||||||
|
TRUE : (LO_VAL:INTEGER;
|
||||||
|
HI_VAL:INTEGER);
|
||||||
|
FALSE: (P:PTR)
|
||||||
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
VAR
|
||||||
|
@LFB : FPTR;
|
||||||
|
RESULTI : INTEGER;
|
||||||
|
|
||||||
|
|
||||||
|
@FCBS : ARRAY [0..maxfcbs] OF FCBREC;
|
||||||
|
(* ALLOWS 10 SIMULTANEOUSLY OPEN FILES *)
|
||||||
|
(* THE CONSOLE TAKES TWO FILE SLOTS *)
|
||||||
|
(* FOR CON: AS INPUT AND CON: AS OUTPUT *)
|
||||||
|
|
||||||
|
EXTERNAL FUNCTION @BDOS86(FUNC:INTEGER; PARM:PTR):BYTE;
|
||||||
|
EXTERNAL FUNCTION @BDOS86A(FUNC:INTEGER; FIRST,SECOND:INTEGER):BYTE;
|
||||||
|
(* @BDOS86A WILL RESOLVE TO @BDOS86 AT LINK TIME BUT USE DIFFERENT PARMS *)
|
||||||
|
EXTERNAL PROCEDURE @BDOSX(FUNC:INTEGER; CH:CHAR);
|
||||||
|
EXTERNAL PROCEDURE @CHN(P:PTR);
|
||||||
|
EXTERNAL PROCEDURE @HLT;
|
||||||
|
|
||||||
|
(*$E-*)
|
||||||
|
FUNCTION GET_AN_FCB:INTEGER;
|
||||||
|
VAR
|
||||||
|
I : INTEGER;
|
||||||
|
BEGIN
|
||||||
|
I := 0;
|
||||||
|
WHILE I <= maxfcbs+1 DO
|
||||||
|
BEGIN
|
||||||
|
IF NOT(@FCBS[I].ACTIVE) THEN (* WE FOUND ONE! *)
|
||||||
|
BEGIN
|
||||||
|
GET_AN_FCB := I;
|
||||||
|
@FCBS[I].ACTIVE := TRUE;
|
||||||
|
EXIT
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
I := I + 1
|
||||||
|
END;
|
||||||
|
I := -1;
|
||||||
|
WRITELN('FCB Table Exhausted!');
|
||||||
|
@HLT;
|
||||||
|
END;
|
||||||
|
|
||||||
|
PROCEDURE FREE_AN_FCB(FCBNUM:INTEGER);
|
||||||
|
BEGIN
|
||||||
|
@FCBS[FCBNUM].ACTIVE := FALSE
|
||||||
|
END;
|
||||||
|
|
||||||
|
PROCEDURE PUTSECTOR(I:INTEGER);
|
||||||
|
BEGIN
|
||||||
|
RESULTI := @BDOS86(26,ADDR(@FCBS[I].BUFFER));
|
||||||
|
RESULTI := @BDOS86(21,ADDR(@FCBS[I].FCB));
|
||||||
|
END;
|
||||||
|
|
||||||
|
FUNCTION GETSECTOR(I:INTEGER):BOOLEAN;
|
||||||
|
BEGIN
|
||||||
|
GETSECTOR := TRUE; (* FALSE MEANS EOF *)
|
||||||
|
RESULTI := @BDOS86(26,ADDR(@FCBS[I].BUFFER));
|
||||||
|
RESULTI := @BDOS86(20,ADDR(@FCBS[I].FCB));
|
||||||
|
IF RESULTI <> 0 THEN
|
||||||
|
GETSECTOR := FALSE;
|
||||||
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION @SPN(VAR F:FIB):BOOLEAN;
|
||||||
|
BEGIN
|
||||||
|
@SPN := FALSE;
|
||||||
|
IF F.FNAME = 'CON:' THEN
|
||||||
|
BEGIN
|
||||||
|
F.OPTION := FCONIO;
|
||||||
|
@SPN := TRUE
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
IF F.FNAME = 'LST:' THEN
|
||||||
|
BEGIN
|
||||||
|
F.OPTION := FLSTOUT;
|
||||||
|
@SPN := TRUE
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
IF (F.FNAME = 'KBD:') OR (F.FNAME = 'TRM:') THEN
|
||||||
|
BEGIN
|
||||||
|
F.OPTION := FTRMIO;
|
||||||
|
@SPN := TRUE
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
IF (F.FNAME = 'RDR:') OR (F.FNAME = 'PUN:') THEN
|
||||||
|
BEGIN
|
||||||
|
F.OPTION := FAUXIO;
|
||||||
|
@SPN := TRUE
|
||||||
|
END
|
||||||
|
END;
|
||||||
|
|
||||||
|
FUNCTION @NOK(VAR S:STRING):BOOLEAN;
|
||||||
|
VAR
|
||||||
|
I : INTEGER;
|
||||||
|
ST: SET OF CHAR;
|
||||||
|
BEGIN
|
||||||
|
@NOK := FALSE;
|
||||||
|
ST := [' '..CHR($7E)];
|
||||||
|
IF (LENGTH(S) > 14) OR (LENGTH(S) < 1) THEN
|
||||||
|
EXIT;
|
||||||
|
|
||||||
|
FOR I := 1 TO LENGTH(S) DO
|
||||||
|
IF NOT(S[I] IN ST) THEN
|
||||||
|
EXIT;
|
||||||
|
@NOK := TRUE
|
||||||
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION UPPERCASE(CH:CHAR):CHAR;
|
||||||
|
BEGIN
|
||||||
|
IF (CH >= 'a') AND (CH <= 'z') THEN
|
||||||
|
CH := CHR(CH & $DF);
|
||||||
|
UPPERCASE := CH
|
||||||
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(*$E+*)
|
||||||
|
PROCEDURE @PARSE(VAR F:FCBLK;VAR S:STRING);
|
||||||
|
VAR
|
||||||
|
DISK : CHAR;
|
||||||
|
NAME : PACKED ARRAY [1..8] OF CHAR;
|
||||||
|
EXT : PACKED ARRAY [1..3] OF CHAR;
|
||||||
|
I,J,MAX: INTEGER;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
(* PARSE CP/M FILE NAME *)
|
||||||
|
|
||||||
|
WHILE (LENGTH(S) <> 0) AND (S[1] = ' ') DO
|
||||||
|
DELETE(S,1,1); (* REMOVE LEADING BLANKS *)
|
||||||
|
|
||||||
|
IF LENGTH(S) <> 0 THEN
|
||||||
|
BEGIN
|
||||||
|
DISK := '@'; (* DEFAULT *)
|
||||||
|
NAME := ' ';
|
||||||
|
EXT := ' ';
|
||||||
|
|
||||||
|
IF S[2] = ':' THEN
|
||||||
|
BEGIN
|
||||||
|
I := 3;
|
||||||
|
DISK := UPPERCASE(S[1])
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
I := 1;
|
||||||
|
MAX := I + 8;
|
||||||
|
J := 1;
|
||||||
|
|
||||||
|
WHILE (NOT(S[I] IN ['.',':'])) AND (I < MAX)
|
||||||
|
AND (I <= LENGTH(S)) DO
|
||||||
|
BEGIN
|
||||||
|
NAME[J] := UPPERCASE(S[I]);
|
||||||
|
J := J + 1;
|
||||||
|
I := I + 1
|
||||||
|
END; (* WHILE *)
|
||||||
|
|
||||||
|
IF (S[I] = '.') AND (I <= LENGTH(S)) THEN
|
||||||
|
BEGIN
|
||||||
|
I := I + 1;
|
||||||
|
J := 1;
|
||||||
|
WHILE (J < 4) AND (I <= LENGTH(S)) DO
|
||||||
|
BEGIN
|
||||||
|
EXT[J] := UPPERCASE(S[I]);
|
||||||
|
J := J + 1;
|
||||||
|
I := I + 1
|
||||||
|
END (* WHILE *)
|
||||||
|
END; (* IF *)
|
||||||
|
|
||||||
|
FILLCHAR(F,SIZEOF(FCBLK)-18,CHR(0));
|
||||||
|
F[0] := CHR(ORD(DISK) - ORD('@'));
|
||||||
|
MOVE(NAME,F[1],8);
|
||||||
|
MOVE(EXT,F[9],3);
|
||||||
|
END (* IF *)
|
||||||
|
|
||||||
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE @INI2; (* INIT @FCBS *)
|
||||||
|
BEGIN
|
||||||
|
FILLCHAR(@FCBS,SIZEOF(@FCBS),CHR(0))
|
||||||
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION @OPEN(VAR F:FIB; MODE:INTEGER):INTEGER;
|
||||||
|
|
||||||
|
(* NOTE: THIS CODE IS DEPENDENT UPON THE FACT THAT THE FIRST FIELD *)
|
||||||
|
(* OF THE FIB DEFINITION IS FNAME! *)
|
||||||
|
|
||||||
|
VAR
|
||||||
|
I : INTEGER;
|
||||||
|
BEGIN
|
||||||
|
I := GET_AN_FCB;
|
||||||
|
@OPEN := I;
|
||||||
|
IF I <> -1 THEN
|
||||||
|
BEGIN
|
||||||
|
FILLCHAR(@FCBS[I].FCB,36,CHR(0));
|
||||||
|
@PARSE(@FCBS[I].FCB,F.FNAME);
|
||||||
|
IF NOT @NOK(F.FNAME) THEN
|
||||||
|
BEGIN
|
||||||
|
@OPEN := -1;
|
||||||
|
RESULTI := 255;
|
||||||
|
FREE_AN_FCB(I); (* DONT NEED FCB IF BAD NAME *)
|
||||||
|
EXIT
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF @SPN(F) THEN
|
||||||
|
BEGIN
|
||||||
|
RESULTI := 0;
|
||||||
|
@FCBS[I].FCB[0] := CHR($FF); {MARK SPECIAL FILE}
|
||||||
|
{FREE_AN_FCB(I); (* DONT NEED AN FCB ON SPECIAL FILES *)}
|
||||||
|
{since on 1/16/82 we implemented i/o redirection }
|
||||||
|
{special files now need an fcb allocated to them! }
|
||||||
|
EXIT
|
||||||
|
END;
|
||||||
|
|
||||||
|
RESULTI := @BDOS86(15,ADDR(@FCBS[I].FCB));
|
||||||
|
IF RESULTI = 255 THEN
|
||||||
|
BEGIN
|
||||||
|
@OPEN := -1;
|
||||||
|
FREE_AN_FCB(I); (* DONT NEED FCB IF NOT FOUND *)
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
@FCBS[I].BUFIDX := SIZEOF(SECTOR);
|
||||||
|
@FCBS[I].ENDFILE:= FALSE
|
||||||
|
END
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
RESULTI := 255
|
||||||
|
END; (* @OPEN *)
|
||||||
|
|
||||||
|
FUNCTION @CREAT(VAR F:FIB; MODE:INTEGER):INTEGER;
|
||||||
|
VAR
|
||||||
|
I : INTEGER;
|
||||||
|
BEGIN
|
||||||
|
I := GET_AN_FCB;
|
||||||
|
@CREAT := I;
|
||||||
|
IF I <> -1 THEN
|
||||||
|
BEGIN
|
||||||
|
FILLCHAR(@FCBS[I].FCB,36,CHR(0));
|
||||||
|
@PARSE(@FCBS[I].FCB,F.FNAME);
|
||||||
|
IF NOT @NOK(F.FNAME) THEN
|
||||||
|
BEGIN
|
||||||
|
@CREAT := -1;
|
||||||
|
RESULTI := 255;
|
||||||
|
FREE_AN_FCB(I); (* DONT NEED FCB IF BAD NAME *)
|
||||||
|
EXIT
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF @SPN(F) THEN
|
||||||
|
BEGIN
|
||||||
|
RESULTI := 0;
|
||||||
|
@FCBS[I].FCB[0] := CHR($FF); {MARK SPECIAL FILE}
|
||||||
|
{FREE_AN_FCB(I); (* DONT NEED AN FCB ON SPECIAL FILES *)}
|
||||||
|
{since on 1/16/82 we implemented i/o redirection }
|
||||||
|
{special files now need an fcb allocated to them! }
|
||||||
|
EXIT
|
||||||
|
END;
|
||||||
|
|
||||||
|
RESULTI := @BDOS86(19,ADDR(@FCBS[I].FCB)); (* DELETE ANY OLD ONES *)
|
||||||
|
RESULTI := @BDOS86(22,ADDR(@FCBS[I].FCB)); (* AND CREATE A NEW ONE *)
|
||||||
|
IF RESULTI = 255 THEN
|
||||||
|
BEGIN
|
||||||
|
@CREAT := -1;
|
||||||
|
FREE_AN_FCB(I); (* DONT NEED FCB IF ERROR *)
|
||||||
|
END;
|
||||||
|
@FCBS[I].BUFIDX := 0;
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
RESULTI := 255
|
||||||
|
END; (* @CREAT *)
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION @UNLINK(VAR F:FIB):INTEGER;
|
||||||
|
BEGIN
|
||||||
|
IF F.SYSID = 0 THEN (* WE MUST ALLOCATE AN FCB FIRST *)
|
||||||
|
F.SYSID := @OPEN(F,2);
|
||||||
|
IF F.SYSID <> -1 THEN (* VALID FILE *)
|
||||||
|
BEGIN
|
||||||
|
IF F.OPTION <= FRANDOM THEN (* IT IS A DISK FILE *)
|
||||||
|
RESULTI := @BDOS86(19,ADDR(@FCBS[F.SYSID].FCB));
|
||||||
|
@UNLINK := 0;
|
||||||
|
FREE_AN_FCB(F.SYSID)
|
||||||
|
END;
|
||||||
|
END;
|
||||||
|
|
||||||
|
PROCEDURE @CLOSE(I:INTEGER; an_infile:boolean);
|
||||||
|
VAR
|
||||||
|
J : INTEGER;
|
||||||
|
BEGIN
|
||||||
|
if (not an_infile) and (@FCBS[I].FCB[0] <> CHR($FF)) then
|
||||||
|
begin (* check to see if stuff to flush *)
|
||||||
|
IF (@FCBS[I].BUFIDX <> 0) THEN
|
||||||
|
BEGIN
|
||||||
|
IF (@FCBS[I].BUFIDX <> SIZEOF(SECTOR)) THEN
|
||||||
|
(* STILL SPACE LEFT TO FILL WITH CTRL/Z'S *)
|
||||||
|
WITH @FCBS[I] DO
|
||||||
|
FILLCHAR(BUFFER[BUFIDX],SIZEOF(SECTOR)-BUFIDX,CHR($1A));
|
||||||
|
PUTSECTOR(I) (* ALWAYS OUTPUT BUFFER IF IDX <> 0 *)
|
||||||
|
END;
|
||||||
|
RESULTI := @BDOS86(16,ADDR(@FCBS[I].FCB))
|
||||||
|
end;
|
||||||
|
FREE_AN_FCB(I); (* WE ALWAYS DO THIS! *)
|
||||||
|
END;
|
||||||
|
|
||||||
|
PROCEDURE @SFB(P:FPTR);
|
||||||
|
BEGIN
|
||||||
|
@LFB := P
|
||||||
|
END;
|
||||||
|
|
||||||
|
(*$E-*)
|
||||||
|
FUNCTION GETBYTE(I:INTEGER; VAR ENDFIL : BOOLEAN):BYTE;
|
||||||
|
BEGIN
|
||||||
|
WITH @FCBS[I] DO
|
||||||
|
BEGIN
|
||||||
|
IF BUFIDX >= SIZEOF(SECTOR) THEN (* GOT TO GO READ SOME DATA *)
|
||||||
|
BEGIN
|
||||||
|
ENDFIL := NOT GETSECTOR(I);
|
||||||
|
BUFIDX := 0
|
||||||
|
END;
|
||||||
|
GETBYTE := BUFFER[BUFIDX];
|
||||||
|
BUFIDX := BUFIDX + 1
|
||||||
|
END
|
||||||
|
END;
|
||||||
|
|
||||||
|
PROCEDURE PUTBYTE(B:BYTE; I:INTEGER);
|
||||||
|
BEGIN
|
||||||
|
WITH @FCBS[I] DO
|
||||||
|
BEGIN
|
||||||
|
IF BUFIDX >= SIZEOF(SECTOR) THEN
|
||||||
|
BEGIN
|
||||||
|
PUTSECTOR(I);
|
||||||
|
BUFIDX := 0
|
||||||
|
END;
|
||||||
|
BUFFER[BUFIDX] := B;
|
||||||
|
BUFIDX := BUFIDX + 1
|
||||||
|
END
|
||||||
|
END;
|
||||||
|
|
||||||
|
(*$E+*)
|
||||||
|
PROCEDURE @RNB;
|
||||||
|
VAR
|
||||||
|
I : INTEGER;
|
||||||
|
J : INTEGER;
|
||||||
|
CH: CHAR;
|
||||||
|
ENDFILE:BOOLEAN;
|
||||||
|
BEGIN
|
||||||
|
RESULTI := 0;
|
||||||
|
IF @LFB^.OPTION = FCONIO THEN (* READ CONSOLE NOT A DISK FILE *)
|
||||||
|
BEGIN
|
||||||
|
CH := @BDOS86(1,ADDR(I)); (* SECOND PARM IS A DUMMY *)
|
||||||
|
IF CH = CHR(8) THEN
|
||||||
|
BEGIN
|
||||||
|
@BDOSX(2,' ');
|
||||||
|
@BDOSX(2,CHR(8))
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
IF CH = CHR($0D) THEN
|
||||||
|
@BDOSX(2,CHR($0A));
|
||||||
|
@LFB^.FBUFFER[0] := CH;
|
||||||
|
@LFB^.FEOF := (CH = CHR($1A));
|
||||||
|
EXIT
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF @LFB^.OPTION = FTRMIO THEN
|
||||||
|
BEGIN
|
||||||
|
CH := @BDOS86A(6,$FFFF,$FFFF);
|
||||||
|
@LFB^.FBUFFER[0] := CH;
|
||||||
|
EXIT
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF @LFB^.OPTION = FAUXIO THEN
|
||||||
|
BEGIN
|
||||||
|
CH := @BDOS86(3,ADDR(I));
|
||||||
|
@LFB^.FBUFFER[0] := CH;
|
||||||
|
EXIT
|
||||||
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
(* ELSE NON-CONSOLE, READ USING GETBYTE *)
|
||||||
|
|
||||||
|
I := @LFB^.SYSID;
|
||||||
|
ENDFILE := @LFB^.FEOF;
|
||||||
|
J := 1;
|
||||||
|
WHILE (J <= @LFB^.BUFLEN) AND (NOT ENDFILE) DO
|
||||||
|
BEGIN
|
||||||
|
WITH @LFB^ DO
|
||||||
|
FBUFFER[J-1] := GETBYTE(I,ENDFILE);
|
||||||
|
J := J + 1
|
||||||
|
END;
|
||||||
|
@LFB^.FEOF := ENDFILE;
|
||||||
|
@LFB^.IOSIZE := J-1; (* THIS IS SO GNB CAN TELL THE DIFFERENCE *)
|
||||||
|
(* BETWEEN A PARTIALLY FULL BUFFER AND *)
|
||||||
|
(* TRUE EOF *)
|
||||||
|
END;
|
||||||
|
|
||||||
|
PROCEDURE @WNB;
|
||||||
|
VAR
|
||||||
|
I : INTEGER;
|
||||||
|
J : INTEGER;
|
||||||
|
CH: CHAR;
|
||||||
|
BEGIN
|
||||||
|
RESULTI := 0;
|
||||||
|
IF @LFB^.OPTION = FCONIO THEN (* WRITE TO THE CONSOLE *)
|
||||||
|
BEGIN
|
||||||
|
@BDOSX(2,@LFB^.FBUFFER[0]);
|
||||||
|
EXIT
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF @LFB^.OPTION = FTRMIO THEN (* USE FUNCTION 6 *)
|
||||||
|
BEGIN
|
||||||
|
@BDOSX(6,@LFB^.FBUFFER[0]);
|
||||||
|
EXIT
|
||||||
|
END;
|
||||||
|
|
||||||
|
if @lfb^.option = flstout then (* use function 5 *)
|
||||||
|
begin
|
||||||
|
@bdosx(5,@lfb^.fbuffer[0]);
|
||||||
|
exit
|
||||||
|
end;
|
||||||
|
|
||||||
|
if @lfb^.option = fauxio then (* use function 4 *)
|
||||||
|
begin
|
||||||
|
@bdosx(4,@lfb^.fbuffer[0]);
|
||||||
|
exit
|
||||||
|
end;
|
||||||
|
|
||||||
|
(* ELSE NON-CONSOLE, WRITE USING PUTBYTE *)
|
||||||
|
I := @LFB^.SYSID;
|
||||||
|
FOR J := 1 TO @LFB^.BUFLEN DO
|
||||||
|
WITH @LFB^ DO
|
||||||
|
PUTBYTE(FBUFFER[J-1],I);
|
||||||
|
@LFB^.BUFIDX := 0; (* SO CLOSE ON A WNB FILE WORKS PROPERLY *)
|
||||||
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE CHAIN(VAR F:FIB; SZ:INTEGER);
|
||||||
|
BEGIN
|
||||||
|
@CHN(ADDR(@FCBS[F.SYSID].FCB))
|
||||||
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
MODEND.
|
||||||
|
|
BIN
Digital Research MT+86 Pascal v311/LIBMT.EXE
Normal file
BIN
Digital Research MT+86 Pascal v311/LIBMT.EXE
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/LINKMT.001
Normal file
BIN
Digital Research MT+86 Pascal v311/LINKMT.001
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/LINKMT.002
Normal file
BIN
Digital Research MT+86 Pascal v311/LINKMT.002
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/LINKMT.EXE
Normal file
BIN
Digital Research MT+86 Pascal v311/LINKMT.EXE
Normal file
Binary file not shown.
15
Digital Research MT+86 Pascal v311/MOD1.SRC
Normal file
15
Digital Research MT+86 Pascal v311/MOD1.SRC
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
MODULE OVERLAY1;
|
||||||
|
|
||||||
|
VAR
|
||||||
|
I : EXTERNAL INTEGER; (* LOCATED IN THE ROOT *)
|
||||||
|
|
||||||
|
PROCEDURE OVL1; (* ONE OF POSSIBLY MANY PROCEDURES IN THIS MODULE *)
|
||||||
|
BEGIN
|
||||||
|
WRITELN('In overlay area 1, Overlay number =',I)
|
||||||
|
END;
|
||||||
|
|
||||||
|
MODEND.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
15
Digital Research MT+86 Pascal v311/MOD2.SRC
Normal file
15
Digital Research MT+86 Pascal v311/MOD2.SRC
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
MODULE OVERLAY2;
|
||||||
|
|
||||||
|
VAR
|
||||||
|
I : EXTERNAL INTEGER; (* LOCATED IN THE ROOT *)
|
||||||
|
|
||||||
|
PROCEDURE OVL2; (* ONE OF POSSIBLY MANY PROCEDURES IN THIS MODULE *)
|
||||||
|
BEGIN
|
||||||
|
WRITELN('In overlay 1, I=',I)
|
||||||
|
END;
|
||||||
|
|
||||||
|
MODEND.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
Digital Research MT+86 Pascal v311/MT2INT.EXE
Normal file
BIN
Digital Research MT+86 Pascal v311/MT2INT.EXE
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/MT86.000
Normal file
BIN
Digital Research MT+86 Pascal v311/MT86.000
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/MT86.001
Normal file
BIN
Digital Research MT+86 Pascal v311/MT86.001
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/MT86.002
Normal file
BIN
Digital Research MT+86 Pascal v311/MT86.002
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/MT86.003
Normal file
BIN
Digital Research MT+86 Pascal v311/MT86.003
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/MT86.004
Normal file
BIN
Digital Research MT+86 Pascal v311/MT86.004
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/MT86.005
Normal file
BIN
Digital Research MT+86 Pascal v311/MT86.005
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/MT86.EXE
Normal file
BIN
Digital Research MT+86 Pascal v311/MT86.EXE
Normal file
Binary file not shown.
134
Digital Research MT+86 Pascal v311/MTERRS.TXT
Normal file
134
Digital Research MT+86 Pascal v311/MTERRS.TXT
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
1 Error in simple type
|
||||||
|
2 Identifier expected
|
||||||
|
3 'PROGRAM' expected
|
||||||
|
4 ')' expected
|
||||||
|
5 ':' expected
|
||||||
|
6 Illegal symbol (possibly missing ';' on line above)
|
||||||
|
7 Error in parameter list
|
||||||
|
8 'OF' expected
|
||||||
|
9 '(' expected
|
||||||
|
10 Error in type
|
||||||
|
11 '[' expected
|
||||||
|
12 ']' expected
|
||||||
|
13 'END' expected
|
||||||
|
14 ';' expected (possibly on line above)
|
||||||
|
15 Integer expected
|
||||||
|
16 '=' expected
|
||||||
|
17 'BEGIN' expected
|
||||||
|
18 Error in declaration part
|
||||||
|
19 error in <field-list>
|
||||||
|
20 '.' expected
|
||||||
|
21 '*' expected
|
||||||
|
50 Error in constant
|
||||||
|
51 ':=' expected
|
||||||
|
52 'THEN' expected
|
||||||
|
53 'UNTIL' expected
|
||||||
|
54 'DO' expected
|
||||||
|
55 'TO' or 'DOWNTO' expected in FOR statement
|
||||||
|
56 'IF' expected
|
||||||
|
57 'FILE' expected
|
||||||
|
58 Error in <factor> (bad expression)
|
||||||
|
59 Error in variable
|
||||||
|
99 MODEND expected
|
||||||
|
101 Identifier declared twice
|
||||||
|
102 Low bound exceeds high bound
|
||||||
|
103 Identifier is not of the appropriate class
|
||||||
|
104 Undeclared identifier
|
||||||
|
105 sign not allowed
|
||||||
|
106 Number expected
|
||||||
|
107 Incompatible subrange types
|
||||||
|
108 File not allowed here
|
||||||
|
109 Type must not be real
|
||||||
|
110 <tagfield> type must be scalar or subrange
|
||||||
|
111 Incompatible with <tagfield> part
|
||||||
|
112 Index type must not be real
|
||||||
|
113 Index type must be a scalar or a subrange
|
||||||
|
114 Base type must not be real
|
||||||
|
115 Base type must be a scalar or a subrange
|
||||||
|
116 Error in type of standard procedure parameter
|
||||||
|
117 Unsatisified forward reference
|
||||||
|
118 Forward reference type identifier in variable declaration
|
||||||
|
119 Re-specified params not OK for a forward declared procedure
|
||||||
|
120 Function result type must be scalar, subrange or pointer
|
||||||
|
121 File value parameter not allowed
|
||||||
|
122 A forward declared function's result type can't be re-specified
|
||||||
|
123 Missing result type in function declaration
|
||||||
|
125 Error in type of standard procedure parameter
|
||||||
|
126 Number of parameters does not agree with declaration
|
||||||
|
127 Illegal parameter substitution
|
||||||
|
128 Result type does not agree with declaration
|
||||||
|
129 Type conflict of operands
|
||||||
|
130 Expression is not of set type
|
||||||
|
131 Tests on equality allowed only
|
||||||
|
133 File comparison not allowed
|
||||||
|
134 Illegal type of operand(s)
|
||||||
|
135 Type of operand must be boolean
|
||||||
|
136 Set element type must be scalar or subrange
|
||||||
|
137 Set element types must be compatible
|
||||||
|
138 Type of variable is not array
|
||||||
|
139 Index type is not compatible with the declaration
|
||||||
|
140 Type of variable is not record
|
||||||
|
141 Type of variable must be file or pointer
|
||||||
|
142 Illegal parameter solution
|
||||||
|
143 Illegal type of loop control variable
|
||||||
|
144 Illegal type of expression
|
||||||
|
145 Type conflict
|
||||||
|
146 Assignment of files not allowed
|
||||||
|
147 Label type incompatible with selecting expression
|
||||||
|
148 Subrange bounds must be scalar
|
||||||
|
149 Index type must be integer
|
||||||
|
150 Assignment to standard function is not allowed
|
||||||
|
151 Assignment to formal function is not allowed
|
||||||
|
152 No such field in this record
|
||||||
|
153 Type error in read
|
||||||
|
154 Actual parameter must be a variable
|
||||||
|
155 Control variable cannot be formal or non-local
|
||||||
|
156 Multidefined case label
|
||||||
|
157 Too many cases in case statement
|
||||||
|
158 No such variant in this record
|
||||||
|
159 Real or string tagfields not allowed
|
||||||
|
160 Previous declaration was not forward
|
||||||
|
161 Again forward declared
|
||||||
|
162 Parameter size must be constant
|
||||||
|
163 Missing variant in declaration
|
||||||
|
164 Substition of standard proc/func not allowed
|
||||||
|
165 Multidefined label
|
||||||
|
166 Multideclared label
|
||||||
|
167 Undeclared label
|
||||||
|
168 Undefined label
|
||||||
|
169 Error in base set
|
||||||
|
170 Value parameter expected
|
||||||
|
171 Standard file was re-declared
|
||||||
|
172 Undeclared external file
|
||||||
|
174 Pascal function or procedure expected
|
||||||
|
183 External declaration not allowed at this nesting level
|
||||||
|
187 Attempt to open library unsuccessful
|
||||||
|
191 No private files
|
||||||
|
193 Not enough room for this operation
|
||||||
|
194 Comment must appear at top of program
|
||||||
|
201 Error in real number - digit expected
|
||||||
|
202 String constant must not exceed source line
|
||||||
|
203 Integer constant exceeds range
|
||||||
|
206 Illegal real number
|
||||||
|
250 Too many scopes of nested identifiers
|
||||||
|
251 Too many nested procedures or functions
|
||||||
|
253 Procedure too long
|
||||||
|
256 Too many external references
|
||||||
|
257 Too many externals
|
||||||
|
258 Too many local files
|
||||||
|
259 Expression too complicated
|
||||||
|
398 Implementation restriction
|
||||||
|
399 Implementation restriction
|
||||||
|
400 Illegal character in text
|
||||||
|
401 Unexpected end of input
|
||||||
|
402 Error in writing code file, not enough room
|
||||||
|
403 Error in reading include file
|
||||||
|
404 Error in writing list file, not enough room
|
||||||
|
405 Call not allowed in separate procedure
|
||||||
|
406 Include file not legal
|
||||||
|
407 *** HEAP OVERFLOW ***
|
||||||
|
496 Invalid argument to INLINE pseudo procedure
|
||||||
|
497 Error in closing code file.
|
||||||
|
500 Non-ISO extension being used!
|
||||||
|
599 Implementation Restriction
|
||||||
|
|
BIN
Digital Research MT+86 Pascal v311/NM.EXE
Normal file
BIN
Digital Research MT+86 Pascal v311/NM.EXE
Normal file
Binary file not shown.
582
Digital Research MT+86 Pascal v311/OVLMGRPC.I86
Normal file
582
Digital Research MT+86 Pascal v311/OVLMGRPC.I86
Normal file
@ -0,0 +1,582 @@
|
|||||||
|
NAME OVERLAY_MANAGER
|
||||||
|
ASSUME CS:CODE,DS:DATA
|
||||||
|
|
||||||
|
DATA SEGMENT PUBLIC
|
||||||
|
DMAPTR DW ? ;DMA ADDRESS FOR INPUT XFER
|
||||||
|
PROCNAME DB 8 DUP(?) ;NAME OF PROCEDURE WHICH WE ARE CALLI
|
||||||
|
NG
|
||||||
|
OVLGNUM DB ? ;OVERLAY NUMBER
|
||||||
|
PROCADR DW ? ;PROCEDURE ADDRESS
|
||||||
|
MYFCB DB 36 DUP(?) ;FCB FOR FILE OPENING
|
||||||
|
;
|
||||||
|
; USRRET STACK CONTAINS RETURN ADDRESS AND
|
||||||
|
; SAVED OVERLAY AREA ADDRESS
|
||||||
|
; AND OVERLAY GROUP NUMBER ;(MAX NESTING 25
|
||||||
|
DB 129 DUP(?) ;SAVED RETURN ADDRESSES
|
||||||
|
USRRET:
|
||||||
|
OVLAREA DW ? ;LOC OF MOST RECENT OVL AREA
|
||||||
|
DATA ENDS
|
||||||
|
|
||||||
|
CODE SEGMENT PUBLIC
|
||||||
|
|
||||||
|
M EQU Byte Ptr 0[BX]
|
||||||
|
;---------------------------------------------------------------;
|
||||||
|
; ;
|
||||||
|
; Overlay Management Module for Pascal/MT+ under PCDOS ;
|
||||||
|
; ;
|
||||||
|
; Created: March 18, 1981 ;
|
||||||
|
; Updated: February 24, 1983 ;
|
||||||
|
; ;
|
||||||
|
;---------------------------------------------------------------;
|
||||||
|
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
|
||||||
|
; equates for pertinant information ;
|
||||||
|
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
|
||||||
|
;
|
||||||
|
; THE FOLLOWING THREE EQUATES DESCRIBE DATA PLACED AT THE
|
||||||
|
; BEGINNING OF THE .CMD FILE BY LINK/MT+86 AFTER THE
|
||||||
|
; STACK POINTER INITIALIZATION CODE.
|
||||||
|
; THEY MUST BE REFERENCED WITH A CS OVERRIDE
|
||||||
|
;
|
||||||
|
NCBPTR EQU 000CH
|
||||||
|
ovlbase EQU 0001h ;base prefix for file name
|
||||||
|
namelen EQU 0000h ;length of names (6 or 7 characters)
|
||||||
|
@XXXX1 EQU 000EH ;PTR TO BASE OF OVL_AREA_TAB
|
||||||
|
|
||||||
|
TRUE EQU -1
|
||||||
|
FALSE EQU 0 ;FOR CONDITIONAL ASSEMBLY
|
||||||
|
RELOAD EQU OFF ;NON-RECURSIVE OVERLAY CALLING
|
||||||
|
|
||||||
|
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
|
||||||
|
; PUBLIC AND EXTRN SYMBOLS ;
|
||||||
|
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
|
||||||
|
|
||||||
|
PUBLIC @OVL ;OVERLAY LOADER
|
||||||
|
PUBLIC @OVS ;OVERLAY DISK SET
|
||||||
|
extrn @hlt : near
|
||||||
|
|
||||||
|
;###############################################################;
|
||||||
|
; ;
|
||||||
|
; MAIN ROUTINE - @OVL ;
|
||||||
|
; PURPOSE - LOAD OVERLAY AND CALL PROCEDURE ;
|
||||||
|
;---------------------------------------------------------------;
|
||||||
|
; ON ENTRY TO @OVL, RETURN ADDRESS POINTS TO OVERLAY CALL ;
|
||||||
|
; DATA BLOCK: ;
|
||||||
|
; ;
|
||||||
|
; +0 : OVERLAY GROUP NUMBER --- 1 BYTE ;
|
||||||
|
; +1 : OVERLAY PROCEDURE NAME-- 8 BYTES ;
|
||||||
|
; ;
|
||||||
|
;###############################################################;
|
||||||
|
@OVL PROC NEAR
|
||||||
|
POP BX
|
||||||
|
MOV AL,CS:M
|
||||||
|
MOV Byte Ptr OVLGNUM,AL
|
||||||
|
INC BX
|
||||||
|
MOV CH,8
|
||||||
|
MOV DX,(Offset PROCNAME)
|
||||||
|
OVL1:
|
||||||
|
MOV AL,CS:M
|
||||||
|
INC BX
|
||||||
|
MOV SI,DX
|
||||||
|
MOV BYTE PTR [SI],AL
|
||||||
|
INC DX
|
||||||
|
DEC CH
|
||||||
|
JNZ OVL1
|
||||||
|
|
||||||
|
CALL PSHUSRRET ;SAVE USER'S RETURN ADDRESSES
|
||||||
|
CALL LOADOVLY ;GO LOAD IT (IF NECESSARY)
|
||||||
|
CALL FINDPROC ;GO SEARCH FOR AND FIND PROCNAME
|
||||||
|
;DOES NOT RETURN IF PROC NOT FOUND
|
||||||
|
MOV BX,(Offset OURRET);PUSH OUR RETURN ADDRESS ON THE STACK
|
||||||
|
PUSH BX
|
||||||
|
MOV BX,Word Ptr PROCADR ;GET ADDRESS OF PROC WITHIN OVERLAY AREA
|
||||||
|
JMP BX ;AND OFF TO USER ROUTINE
|
||||||
|
OURRET:
|
||||||
|
PUSH AX
|
||||||
|
PUSH BX ;SAVE POSSIBLE RETURN VALUES
|
||||||
|
CALL POPUSRRET ;MAY RELOAD OLD OVERLAY GROUP
|
||||||
|
POP BX
|
||||||
|
POP AX ;GET POSSIBLE RETURN VALUES BACK AGAIN
|
||||||
|
JMP CX ;AND BACK TO THE USER (SIMPLE CASE)
|
||||||
|
@OVL ENDP
|
||||||
|
|
||||||
|
;###############################################################;
|
||||||
|
; ;
|
||||||
|
; MAIN ROUTINE - @OVS ;
|
||||||
|
; PURPOSE - SET DRIVE NUMBER FOR A SPECIFIC OVERLAY ;
|
||||||
|
; INPUT - ON STACK : OVLNUM,DRIVE ;
|
||||||
|
; OVLNUM : 1..50 ;
|
||||||
|
; DRIVE : '@'..'O' ;
|
||||||
|
; ;
|
||||||
|
; PASCAL DEFINITION: ;
|
||||||
|
; ;
|
||||||
|
; EXTERNAL PROCEDURE @OVS(OVNUM:INTEGER; DRNUM:CHAR); ;
|
||||||
|
; ;
|
||||||
|
;###############################################################;
|
||||||
|
@OVS PROC NEAR
|
||||||
|
POP BX ;RET ADR
|
||||||
|
POP CX ;DRIVE NUMBER
|
||||||
|
POP DX ;OVERLAY NUMBER
|
||||||
|
PUSH BX
|
||||||
|
MOV AL,CL
|
||||||
|
SUB AL,'@' ;MAKE 0..19
|
||||||
|
DEC DX ;ADJUST OVLNUM (COUNT FROM 0)
|
||||||
|
MOV BX,(Offset DRIVETAB)
|
||||||
|
ADD BX,DX
|
||||||
|
MOV CS:M,AL
|
||||||
|
RET
|
||||||
|
@OVS ENDP
|
||||||
|
|
||||||
|
;===============================================================;
|
||||||
|
; SUBROUTINE: CALCADDR ;
|
||||||
|
; PURPOSE : CALC OVERLAY AREA ADDRESS BASED ON OVLGNUM ;
|
||||||
|
;===============================================================;
|
||||||
|
CALCADDR PROC NEAR
|
||||||
|
|
||||||
|
MOV AL,Byte Ptr OVLGNUM ;GET REQUESTED GROUP NUMBER
|
||||||
|
DEC AL
|
||||||
|
RCR AL,1
|
||||||
|
RCR AL,1
|
||||||
|
RCR AL,1 ;DIVIDE BY 8
|
||||||
|
AND AL,1EH
|
||||||
|
MOV DL,AL
|
||||||
|
MOV DH,0
|
||||||
|
MOV BX,CS:Word Ptr @XXXX1 ;GET ADDR OF OVERLAY AREA TABLE
|
||||||
|
;POINT TO TABLE ENTRY
|
||||||
|
ADD BX,DX
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MOV DX,CS:WORD PTR [BX]
|
||||||
|
|
||||||
|
XCHG BX,DX ;BX NOW POINTS TO OVERLAY AREA
|
||||||
|
MOV Word Ptr OVLAREA,BX ;SAVE IT FOR LATER
|
||||||
|
RET
|
||||||
|
CALCADDR ENDP
|
||||||
|
|
||||||
|
;===============================================================;
|
||||||
|
; SUBROUTINE: PSHUSRRET ;
|
||||||
|
; PURPOSE : SAVE CONTENTS OF HL, OVERLAY AREA ADDR ;
|
||||||
|
; AND OVERLAY GROUP NUMBER ON USRRET STACK ;
|
||||||
|
;===============================================================;
|
||||||
|
; PUBLIC PSHUSRRET
|
||||||
|
PSHUSRRET PROC NEAR
|
||||||
|
PUSH BX
|
||||||
|
CALL CALCADDR
|
||||||
|
|
||||||
|
MOV CX,BX
|
||||||
|
|
||||||
|
POP DX
|
||||||
|
MOV BX,CS:Word Ptr USRSP ;GET STACK POINTER
|
||||||
|
DEC BX
|
||||||
|
MOV M,DH ;STORE RET ADDR
|
||||||
|
DEC BX
|
||||||
|
MOV M,DL
|
||||||
|
DEC BX
|
||||||
|
MOV M,CH ;STORE OVERLAY AREA ADDR
|
||||||
|
DEC BX
|
||||||
|
MOV M,CL
|
||||||
|
DEC BX
|
||||||
|
MOV SI,CX ;GET OVERLAY NUMBER
|
||||||
|
MOV AL,CS:BYTE PTR [SI]
|
||||||
|
MOV M,AL
|
||||||
|
MOV CS:Word Ptr USRSP,BX
|
||||||
|
RET
|
||||||
|
PSHUSRRET ENDP
|
||||||
|
|
||||||
|
;===============================================================;
|
||||||
|
; SUBROUTINE: POPUSRRET ;
|
||||||
|
; PURPOSE : POP RET ADDR, OVERLAY AREA ADDR AND NUMBER ;
|
||||||
|
; IF RECURSE IS SET TO TRUE THEN THIS ROUTINE ;
|
||||||
|
; WILL CALL LOADOVLY TO RE-LOAD PREVIOUS ;
|
||||||
|
; OVERLAY IF NECESSARY ;
|
||||||
|
;===============================================================;
|
||||||
|
; PUBLIC POPUSRRET
|
||||||
|
POPUSRRET PROC NEAR
|
||||||
|
MOV BX,CS:Word Ptr USRSP
|
||||||
|
MOV AL,M
|
||||||
|
MOV Byte Ptr OVLGNUM,AL ;SAVE OVERLAY GROUP NUMBER
|
||||||
|
INC BX
|
||||||
|
MOV DL,M
|
||||||
|
INC BX
|
||||||
|
MOV DH,M
|
||||||
|
INC BX ;DE NOW CONTAINS OVERLAY AREA ADDRESS
|
||||||
|
XCHG BX,DX
|
||||||
|
MOV Word Ptr OVLAREA,BX
|
||||||
|
XCHG BX,DX
|
||||||
|
MOV DL,M
|
||||||
|
INC BX
|
||||||
|
MOV DH,M ;DE NOW CONTAINS CALLERS RET ADDRESS
|
||||||
|
INC BX
|
||||||
|
MOV CS:Word Ptr USRSP,BX
|
||||||
|
XCHG BX,DX ;PUT REAL ADDR INTO HL
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
IF RELOAD ; THEN RELOAD OLD OVERLAY IF NECESSARY
|
||||||
|
PUSH BX
|
||||||
|
MOV AL,Byte Ptr OVLGNUM
|
||||||
|
OR AL,AL
|
||||||
|
JZ L@1
|
||||||
|
CALL LOADOVLY ;ELSE GO LOAD IT IN AGAIN
|
||||||
|
L@1:
|
||||||
|
POP BX ;GET RET ADDR BACK AGAIN
|
||||||
|
ENDIF
|
||||||
|
;----------------------------------------------------------------
|
||||||
|
MOV CX,BX ;RETURN IT IN CX (1/17/82)
|
||||||
|
RET ;BACK TO MAIN @OVL ROUTINE
|
||||||
|
POPUSRRET ENDP
|
||||||
|
|
||||||
|
;===============================================================;
|
||||||
|
; SUBROUTINE: LOADOVLY ;
|
||||||
|
; PURPOSE : USING OVLADDR AND OVLBASE LOAD THE OVERLAY ;
|
||||||
|
;===============================================================;
|
||||||
|
LOADOVLY PROC NEAR
|
||||||
|
CALL CALCADDR ;SETS OVLAREA AND HL-REG
|
||||||
|
MOV AL,Byte Ptr OVLGNUM ;GET GROUP NUMBER BACK AGAIN
|
||||||
|
CMP AL,CS:M ;IS REQUESTED OVERLAY IN THE AREA?
|
||||||
|
JNZ L@2
|
||||||
|
RET ;RETURN IF ALREADY LOADED
|
||||||
|
L@2:
|
||||||
|
;
|
||||||
|
; IF NOT LOADED THEN CONSTRUCT NAME AND LOAD IT
|
||||||
|
;
|
||||||
|
; MOVE OVLBASE,MYFCB+1,8
|
||||||
|
MOV BX,CS:WORD PTR NCBPTR
|
||||||
|
ADD BX,OVLBASE
|
||||||
|
MOV DX,(Offset MYFCB)+1
|
||||||
|
MOV CH,8
|
||||||
|
?1: MOV AL,CS:M ;GET BYTE OF NAME FROM CODE SEG
|
||||||
|
MOV SI,DX
|
||||||
|
MOV BYTE PTR [SI],AL ;AND STORE IN DATA SEG
|
||||||
|
INC BX
|
||||||
|
INC DX
|
||||||
|
DEC CH
|
||||||
|
JNZ ?1
|
||||||
|
|
||||||
|
MOV AL,Byte Ptr OVLGNUM
|
||||||
|
DEC AL
|
||||||
|
MOV DL,AL
|
||||||
|
MOV DH,0
|
||||||
|
MOV BX,(Offset DRIVETAB)
|
||||||
|
ADD BX,DX
|
||||||
|
MOV AL,CS:M ;GET DRIVE NUMBER FROM TABLE
|
||||||
|
MOV Byte Ptr MYFCB,AL ;FOR NOW DEFAULT DRIVE ONLY
|
||||||
|
MOV AL,'0'
|
||||||
|
MOV Byte Ptr MYFCB+9,AL
|
||||||
|
MOV AL,Byte Ptr OVLGNUM
|
||||||
|
RCR AL,1
|
||||||
|
RCR AL,1
|
||||||
|
RCR AL,1
|
||||||
|
RCR AL,1
|
||||||
|
CALL CV2HX ;CONVERT HIGH NIBBLE
|
||||||
|
MOV Byte Ptr MYFCB+10,AL
|
||||||
|
MOV AL,Byte Ptr OVLGNUM
|
||||||
|
CALL CV2HX ;CONVERT LOW NIBBLE
|
||||||
|
MOV Byte Ptr MYFCB+11,AL
|
||||||
|
MOV BX,(Offset MYFCB)+12
|
||||||
|
MOV CH,23 ;NUMBER OF EXTRA BYTES
|
||||||
|
LO2:
|
||||||
|
MOV M,0
|
||||||
|
INC BX
|
||||||
|
DEC CH
|
||||||
|
JNZ LO2
|
||||||
|
|
||||||
|
|
||||||
|
MOV DX,80H ;SET DEFAULT DMA ADDRESS
|
||||||
|
call setdma
|
||||||
|
|
||||||
|
MOV DX,(Offset MYFCB)
|
||||||
|
call open
|
||||||
|
|
||||||
|
CMP AL,255
|
||||||
|
JNZ L@3
|
||||||
|
JMP NOFILE ;BR IF FILE NOT FOUND
|
||||||
|
L@3:
|
||||||
|
;
|
||||||
|
; OK, NOW LOAD IT UNTIL EOF
|
||||||
|
;
|
||||||
|
LO3:
|
||||||
|
|
||||||
|
MOV DX,Word Ptr OVLAREA ;GET OVERLAY AREA ADDRESS
|
||||||
|
mov bx,ds ;save ds
|
||||||
|
mov ax,cs
|
||||||
|
mov ds,ax
|
||||||
|
call setdma
|
||||||
|
mov ds,bx ;RESTORE DS
|
||||||
|
MOV DX,(Offset MYFCB)
|
||||||
|
mov DI,DX
|
||||||
|
mov AX,word ptr [DI+16] ;get file size in bytes
|
||||||
|
mov CL,7 ;set up to divide by 128
|
||||||
|
shr AX,CL ;do divide by shifting
|
||||||
|
mov CX,AX ;move number of records into CX
|
||||||
|
call rdran
|
||||||
|
RET
|
||||||
|
LOADOVLY ENDP
|
||||||
|
|
||||||
|
pcdos PROC NEAR ; the call to PCDOS
|
||||||
|
push es
|
||||||
|
int 21h
|
||||||
|
pop es
|
||||||
|
ret
|
||||||
|
pcdos endp
|
||||||
|
|
||||||
|
open: ; file open (#15)
|
||||||
|
mov ah,15
|
||||||
|
jmp pcdos
|
||||||
|
|
||||||
|
rdran: ;random read (#39)
|
||||||
|
mov ah,39
|
||||||
|
jmp pcdos
|
||||||
|
|
||||||
|
setdma: ;set DMA offset (#26) PCDOS style
|
||||||
|
mov ah,26 ; load function number
|
||||||
|
jmp pcdos
|
||||||
|
|
||||||
|
;
|
||||||
|
; INTERNAL ROUTINE - CV2HX
|
||||||
|
; LOW ORDER 4-BITS OF A-REG CONTAIN BINARY NUMBER
|
||||||
|
; RETURN ASCII CHAR IN A-REG
|
||||||
|
;
|
||||||
|
CV2HX PROC NEAR
|
||||||
|
AND AL,0FH
|
||||||
|
ADD AL,'0'
|
||||||
|
CMP AL,03AH
|
||||||
|
JNB L@4
|
||||||
|
RET ;RETURN IF A VAILD DIGIT
|
||||||
|
L@4:
|
||||||
|
ADD AL,7
|
||||||
|
RET
|
||||||
|
CV2HX ENDP
|
||||||
|
|
||||||
|
;===============================================================;
|
||||||
|
; SUBROUTINE: FINDPROC ;
|
||||||
|
; PURPOSE : GIVEN PROCEDURE NAME IN PROCNAME ;
|
||||||
|
; RETURN ADDRESS OF THIS PROCEDURE IN ;
|
||||||
|
; PROCADR ;
|
||||||
|
;===============================================================;
|
||||||
|
FINDPROC PROC NEAR
|
||||||
|
MOV BX,Word Ptr OVLAREA ;GET ADDR OF OVERLAY AREA
|
||||||
|
INC BX
|
||||||
|
MOV DL,CS:M
|
||||||
|
INC BX
|
||||||
|
MOV DH,CS:M ;POINT TO TABLE
|
||||||
|
XCHG BX,DX
|
||||||
|
FP1:
|
||||||
|
MOV AL,CS:M
|
||||||
|
OR AL,AL
|
||||||
|
JNZ L@5
|
||||||
|
JMP NOPROC
|
||||||
|
L@5:
|
||||||
|
MOV DX,(Offset PROCNAME)
|
||||||
|
MOV SI,CS:WORD PTR NCBPTR
|
||||||
|
MOV AL,CS:BYTE PTR [SI]
|
||||||
|
MOV CH,AL
|
||||||
|
PUSH BX ;SAVE ADDR OF TABLE ENTRY
|
||||||
|
FP2:
|
||||||
|
MOV SI,DX
|
||||||
|
MOV AL,BYTE PTR [SI]
|
||||||
|
CMP AL,CS:M
|
||||||
|
JNZ FP3 ;BR IF NO MATCH
|
||||||
|
INC BX
|
||||||
|
INC DX
|
||||||
|
DEC CH
|
||||||
|
JNZ FP2 ;BR IF MORE TO COMPARE
|
||||||
|
;
|
||||||
|
; WE FOUND IT......
|
||||||
|
;
|
||||||
|
POP BX ;GET BASE ADDR OF TABLE ENTRY
|
||||||
|
MOV DX,8 ;BYPASS NAME
|
||||||
|
|
||||||
|
ADD BX,DX
|
||||||
|
MOV DL,CS:M
|
||||||
|
INC BX
|
||||||
|
MOV DH,CS:M
|
||||||
|
XCHG BX,DX
|
||||||
|
MOV Word Ptr PROCADR,BX
|
||||||
|
RET ;AND EXIT
|
||||||
|
FP3:
|
||||||
|
POP BX
|
||||||
|
MOV DX,10
|
||||||
|
ADD BX,DX
|
||||||
|
JMP SHORT FP1
|
||||||
|
FINDPROC ENDP
|
||||||
|
|
||||||
|
;===============================================================;
|
||||||
|
; ERROR MESSAGE PRINTING ROUTINES ;
|
||||||
|
;===============================================================;
|
||||||
|
NOFILE: ;***OVERLAY FILE NOT FOUND***
|
||||||
|
; MOVE MYFCB+1,NFMSG1+2,8 ;MOVE IN NAME
|
||||||
|
MOV BX,(Offset MYFCB)+1
|
||||||
|
MOV DX,(Offset NFMSG1)+2
|
||||||
|
MOV CX,8
|
||||||
|
?2:
|
||||||
|
MOV AL,M
|
||||||
|
INC BX
|
||||||
|
MOV SI,DX
|
||||||
|
MOV CS:BYTE PTR [SI],AL
|
||||||
|
INC DX
|
||||||
|
DEC CX
|
||||||
|
MOV AL,CH
|
||||||
|
OR AL,CL
|
||||||
|
JNZ ?2
|
||||||
|
; MOVE MYFCB+9,NFMSG1+11,3 ;MOVE IN EXTENSION
|
||||||
|
MOV BX,(Offset MYFCB)+9
|
||||||
|
MOV DX,(Offset NFMSG1)+11
|
||||||
|
MOV CX,3
|
||||||
|
?3:
|
||||||
|
MOV AL,M
|
||||||
|
INC BX
|
||||||
|
MOV SI,DX
|
||||||
|
MOV CS:BYTE PTR[SI],AL
|
||||||
|
INC DX
|
||||||
|
DEC CX
|
||||||
|
MOV AL,CH
|
||||||
|
OR AL,CL
|
||||||
|
JNZ ?3
|
||||||
|
MOV AL,Byte Ptr MYFCB
|
||||||
|
ADD AL,'@'
|
||||||
|
MOV CS:Byte Ptr NFMSG1,AL
|
||||||
|
MOV DX,(Offset NFMSG)
|
||||||
|
CMP AL,'@'
|
||||||
|
JNZ WMSG
|
||||||
|
MOV BX,' '
|
||||||
|
MOV Word Ptr NFMSG1,BX ;CHANGE "@:" TO " "
|
||||||
|
WMSG:
|
||||||
|
PUSH DS
|
||||||
|
MOV AX,CS
|
||||||
|
MOV DS,AX
|
||||||
|
mov ah,9
|
||||||
|
call pcdos
|
||||||
|
POP DS
|
||||||
|
call @hlt
|
||||||
|
|
||||||
|
NFMSG:
|
||||||
|
DB 13,10,'Unable to open: '
|
||||||
|
NFMSG1 DB 40H,': . '
|
||||||
|
DB 13,10
|
||||||
|
DB '$'
|
||||||
|
NOPROC: ;***PROCEDURE NAME NOT FOUND***
|
||||||
|
; MOVE MYFCB+1,NPMSG2+2,8 ;MOVE IN NAME
|
||||||
|
MOV BX,(Offset MYFCB)+1
|
||||||
|
MOV DX,(Offset NPMSG2)+2
|
||||||
|
MOV CX,8
|
||||||
|
?4:
|
||||||
|
MOV AL,M
|
||||||
|
INC BX
|
||||||
|
MOV SI,DX
|
||||||
|
MOV CS:BYTE PTR [SI],AL
|
||||||
|
INC DX
|
||||||
|
DEC CX
|
||||||
|
MOV AL,CH
|
||||||
|
OR AL,CL
|
||||||
|
JNZ ?4
|
||||||
|
; MOVE MYFCB+9,NPMSG2+11,3 ;MOVE IN EXTENSION
|
||||||
|
MOV BX,(Offset MYFCB)+9
|
||||||
|
MOV DX,(Offset NPMSG2)+11
|
||||||
|
MOV CX,3
|
||||||
|
?5:
|
||||||
|
MOV AL,M
|
||||||
|
INC BX
|
||||||
|
MOV SI,DX
|
||||||
|
MOV CS:BYTE PTR [SI],AL
|
||||||
|
INC DX
|
||||||
|
DEC CX
|
||||||
|
MOV AL,CH
|
||||||
|
OR AL,CL
|
||||||
|
JNZ ?5
|
||||||
|
MOV AL,Byte Ptr MYFCB
|
||||||
|
ADD AL,'@'
|
||||||
|
MOV CS:Byte Ptr NPMSG2,AL
|
||||||
|
CMP AL,'@'
|
||||||
|
JNZ NP1
|
||||||
|
MOV BX,' '
|
||||||
|
MOV CS:Word Ptr NPMSG2,BX
|
||||||
|
NP1:
|
||||||
|
; MOVE PROCNAME,NPMSG1,8
|
||||||
|
MOV BX,(Offset PROCNAME)
|
||||||
|
MOV DX,(Offset NPMSG1)
|
||||||
|
MOV CX,8
|
||||||
|
?6:
|
||||||
|
MOV AL,M
|
||||||
|
INC BX
|
||||||
|
MOV SI,DX
|
||||||
|
MOV CS:BYTE PTR [SI],AL
|
||||||
|
INC DX
|
||||||
|
DEC CX
|
||||||
|
MOV AL,CH
|
||||||
|
OR AL,CL
|
||||||
|
JNZ ?6
|
||||||
|
MOV DX,(Offset NPMSG)
|
||||||
|
JMP WMSG
|
||||||
|
|
||||||
|
NPMSG DB 13,10,'Proc: "'
|
||||||
|
NPMSG1 DB ' " not found ovl:'
|
||||||
|
NPMSG2 DB 40H,': . '
|
||||||
|
DB 13,10
|
||||||
|
DB '$'
|
||||||
|
;***************************************************************;
|
||||||
|
; ;
|
||||||
|
; DATA AREA FOR OVERLAY MANAGER ;
|
||||||
|
; ;
|
||||||
|
;***************************************************************;
|
||||||
|
;
|
||||||
|
; NOTE THIS TABLE MUST BE IN THE CSEG AREA BECAUSE IS MUST
|
||||||
|
; BE INITIALIZED VIA DB AND LINKMT WILL NOT SUPPORT INITIALIZED
|
||||||
|
; DATA IN THE DSEG
|
||||||
|
;
|
||||||
|
DRIVETAB: ;DRIVE TABLES FOR 50 OVERLAYS
|
||||||
|
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
DB 0
|
||||||
|
|
||||||
|
USRSP DW (Offset USRRET) ;USRRET STACK POINTER
|
||||||
|
;THIS MUST ALSO BE IN CODE SEG
|
||||||
|
CODE ENDS
|
||||||
|
END
|
||||||
|
|
Binary file not shown.
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/PASLIB.R86
Normal file
BIN
Digital Research MT+86 Pascal v311/PASLIB.R86
Normal file
Binary file not shown.
34
Digital Research MT+86 Pascal v311/PROG.SRC
Normal file
34
Digital Research MT+86 Pascal v311/PROG.SRC
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
PROGRAM DEMO_PROG;
|
||||||
|
|
||||||
|
VAR
|
||||||
|
I : INTEGER; (* TO BE ACCESSED BY THE OVERLAYS *)
|
||||||
|
CH: CHAR;
|
||||||
|
|
||||||
|
EXTERNAL [1] PROCEDURE OVL1; (* COULD HAVE HAD PARAMETERS *)
|
||||||
|
|
||||||
|
EXTERNAL [2] PROCEDURE OVL2; (* ALSO COULD HAVE HAD PARAMETERS *)
|
||||||
|
|
||||||
|
(* EITHER COULD ALSO HAVE BEEN A FUNCTION IF DESIRED *)
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
REPEAT
|
||||||
|
WRITE('Enter character, A/B/Q: ');
|
||||||
|
READ(CH);
|
||||||
|
CASE CH OF
|
||||||
|
'A','a' : BEGIN
|
||||||
|
I := 1; (* TO DEMONSTRATE ACCESS OF GLOBALS *)
|
||||||
|
OVL1 (* FROM AN OVERLAY *)
|
||||||
|
END;
|
||||||
|
|
||||||
|
'B','b' : BEGIN
|
||||||
|
I := 2;
|
||||||
|
OVL2
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
IF NOT(CH IN ['Q','q'])THEN
|
||||||
|
WRITELN('Enter only A or B')
|
||||||
|
END (* CASE *)
|
||||||
|
UNTIL CH IN ['Q','q'];
|
||||||
|
WRITELN('End of program')
|
||||||
|
END.
|
||||||
|
|
BIN
Digital Research MT+86 Pascal v311/RANDOMIO.R86
Normal file
BIN
Digital Research MT+86 Pascal v311/RANDOMIO.R86
Normal file
Binary file not shown.
859
Digital Research MT+86 Pascal v311/READ.ME
Normal file
859
Digital Research MT+86 Pascal v311/READ.ME
Normal file
@ -0,0 +1,859 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
****************************
|
||||||
|
* R E L E A S E N O T E S *
|
||||||
|
****************************
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Version 3.1.1
|
||||||
|
|
||||||
|
|
||||||
|
For The IBM Personal Computer
|
||||||
|
Disk Operating System Version 1.1
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 1983 by Digital Research
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1-1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
These release notes pertain to both the software and
|
||||||
|
the documentation set for the Digital Research
|
||||||
|
product:
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+
|
||||||
|
|
||||||
|
For the IBM Personal Computer
|
||||||
|
|
||||||
|
Disk Operating System Version 1.1 (IBMDOS)
|
||||||
|
|
||||||
|
|
||||||
|
They provide the most current information regarding:
|
||||||
|
|
||||||
|
o changes to the software, or bugs that have been
|
||||||
|
identified since the product was released.
|
||||||
|
|
||||||
|
o errors or omissions in the documentation set
|
||||||
|
that could not be corrected because of the lead
|
||||||
|
time needed for production and printing.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Note: These release notes have been formatted so
|
||||||
|
that you can print them on your own printer, cut them
|
||||||
|
to size (6 1/2 x 8 1/2), and then place them in the
|
||||||
|
back of your manuals.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1-2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
RUNNING UNDER IBMDOS
|
||||||
|
|
||||||
|
|
||||||
|
Under IBMDOS, the space available for the transient
|
||||||
|
program area is not as large as under CP/M-86. If
|
||||||
|
your system has a total memory size of 150K or less,
|
||||||
|
the compiler will have a smaller symbol table, and
|
||||||
|
the linker will have both a smaller symbol table and
|
||||||
|
code buffer. Both programs have messages that inform
|
||||||
|
you of the size of their respective tables. No other
|
||||||
|
programs are affected.
|
||||||
|
|
||||||
|
|
||||||
|
Note: Under IBMDOS, the utility programs NM and SZ do
|
||||||
|
not accept ambiguous filenames as they do under CP/M-
|
||||||
|
86. Only one name is allowed, and it must be unique.
|
||||||
|
For example,
|
||||||
|
|
||||||
|
FPREALS.R86 is valid
|
||||||
|
FPREALS.* is invalid
|
||||||
|
????.R86 is invalid
|
||||||
|
|
||||||
|
|
||||||
|
SOFTWARE CHANGES FROM THE PREVIOUS VERSION
|
||||||
|
|
||||||
|
|
||||||
|
There are four new functions in the run-time library,
|
||||||
|
PASLIB: @SETDATE, @SETTIME, @GETDATE, AND @GETTIME.
|
||||||
|
These functions set and access the system date and
|
||||||
|
time. The SET functions return a completion code
|
||||||
|
exactly as it is set by IBMDOS. Please see your
|
||||||
|
systems manual for return code values and legal
|
||||||
|
values for each parameter.
|
||||||
|
|
||||||
|
To use these functions, declare each as an EXTERNAL
|
||||||
|
PROCEDURE with the following syntax:
|
||||||
|
|
||||||
|
@GETTIME(HOUR,MINUTE,SECOND,HUND : INTEGER);
|
||||||
|
@GETDATE(MONTH,DAY,YEAR : INTEGER);
|
||||||
|
@SETTIME(HOUR,MINUTE,SECOND,HUND : INTEGER) : INTEGER;
|
||||||
|
@SETDATE(MONTH,DAY,YEAR : INTEGER) : INTEGER;
|
||||||
|
|
||||||
|
|
||||||
|
1-3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
SOFTWARE BUGS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
The following software bugs have been identified in
|
||||||
|
the current release (3.1.1):
|
||||||
|
|
||||||
|
|
||||||
|
o There are errors in allocating array bounds for
|
||||||
|
conformant arrays of two or more dimensions.
|
||||||
|
One-dimensional conformant arrays work
|
||||||
|
correctly.
|
||||||
|
|
||||||
|
Solution: There is no fix available at this
|
||||||
|
time. Work is in progress, and the problem will
|
||||||
|
be fixed by the next release.
|
||||||
|
|
||||||
|
o Sometimes, expressions used as procedure
|
||||||
|
parameters do not result in the correct values
|
||||||
|
being passed to the procedure.
|
||||||
|
|
||||||
|
Solution: First assign the value of the
|
||||||
|
expression to a variable, and then pass the
|
||||||
|
variable to the procedure.
|
||||||
|
|
||||||
|
o When using the OUT function, the port number and
|
||||||
|
the value are inadvertently swapped.
|
||||||
|
|
||||||
|
Solution: Use OUT as follows:
|
||||||
|
|
||||||
|
OUT[(value to put out)] := PORT number
|
||||||
|
|
||||||
|
o After the compiler reports a syntax error it
|
||||||
|
asks if you want to continue or abort.
|
||||||
|
Occasionally, attempting to continue will hang
|
||||||
|
the system and require a reboot.
|
||||||
|
|
||||||
|
Solution: If this error occurs, correct the
|
||||||
|
reported syntax error before attempting to
|
||||||
|
recompile. This error will be corrected in the
|
||||||
|
next release.
|
||||||
|
|
||||||
|
|
||||||
|
1-4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
o Some users have reported an incompatibality
|
||||||
|
between some CP/M-86 implementations and the
|
||||||
|
IBMDOS version. IBMDOS V1.1 does not interpret
|
||||||
|
ANSI standard escape sequences. Consequently,
|
||||||
|
programs that attempt to handle displays via
|
||||||
|
escape sequences for cursor control will not
|
||||||
|
execute properly.
|
||||||
|
|
||||||
|
Solution: There is no fix available at this
|
||||||
|
time.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1-5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
DOCUMENTATION ERRATA
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
The following are errors in the Pascal/MT+ Language
|
||||||
|
Reference Manual (February 1983 edition):
|
||||||
|
|
||||||
|
|
||||||
|
Page 3-3. Change WORD(x) to WRD(x)
|
||||||
|
|
||||||
|
Page 6-2. Change the third paragraph to read:
|
||||||
|
|
||||||
|
"The data type for a function must be a
|
||||||
|
simple type. Put the type name after a
|
||||||
|
colon at the end of the function heading.
|
||||||
|
|
||||||
|
Page 6-8. In Table 6-1, change the Returns type for
|
||||||
|
the Function ABS from REAL to "same as
|
||||||
|
NUM".
|
||||||
|
|
||||||
|
Page 6-10. In Table 6-1, the Function @HERR returns
|
||||||
|
a BOOLEAN type, and the the Function ADDR
|
||||||
|
returns a POINTER not an INTEGER type.
|
||||||
|
Also change FUNCTION @RLS to PROCEDURE
|
||||||
|
@RLS.
|
||||||
|
|
||||||
|
Page 6-12. Change the first sentence in the second
|
||||||
|
paragraph to read:
|
||||||
|
|
||||||
|
"You can use ADDR to reference external
|
||||||
|
variables."
|
||||||
|
|
||||||
|
Page 6-13. Change the example to ARCTAN(1) = 0.78539
|
||||||
|
|
||||||
|
Page 6-19. Change the first sentence in the second
|
||||||
|
paragraph to read:
|
||||||
|
|
||||||
|
"CLOSEDEL closes and deletes files after
|
||||||
|
use." In the last paragraph, change File
|
||||||
|
Control Blocks (FCBs) to File Information
|
||||||
|
Blocks (FIBs).
|
||||||
|
|
||||||
|
|
||||||
|
1-6
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Page 6-68. Change the fifth paragraph to read:
|
||||||
|
|
||||||
|
"WRITE and WRITELN treat strings as
|
||||||
|
arrays of characters. They do not write
|
||||||
|
the length byte to TEXT files."
|
||||||
|
|
||||||
|
Page 7-2. In the second paragraph, change F2 to F3
|
||||||
|
in:
|
||||||
|
|
||||||
|
F2^ := 45;
|
||||||
|
|
||||||
|
puts the integer value 45 in the buffer
|
||||||
|
of the file variable F2.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1-7
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
The following are errors in the Pascal/MT+
|
||||||
|
Programmer's Guide for the IBM Personal Computer Disk
|
||||||
|
Operating System (April 1983 edition):
|
||||||
|
|
||||||
|
|
||||||
|
Page 1-5. Delete the following files from Table 1-
|
||||||
|
2. They are NOT distributed with the
|
||||||
|
product:
|
||||||
|
|
||||||
|
o CONCAT.EXE
|
||||||
|
o 8087.I86
|
||||||
|
o 87XOP.I86
|
||||||
|
o 87TRS.I86
|
||||||
|
o 87REALS.BLD
|
||||||
|
|
||||||
|
Page 1-6. The second paragraph states you can use
|
||||||
|
the distribution disks just as they are.
|
||||||
|
This is not true; they are write-
|
||||||
|
protected. You must copy them onto
|
||||||
|
backup disks.
|
||||||
|
|
||||||
|
Page 2-3. Change the first paragraph to read:
|
||||||
|
|
||||||
|
"During Phase 0, When the compiler finds
|
||||||
|
a syntax error, it displays the line
|
||||||
|
containing the error. If you are using
|
||||||
|
the MTERRS.TXT file, the compiler also
|
||||||
|
displays an error description. In all
|
||||||
|
other Phases, if you are not using the
|
||||||
|
MTERRS.TXT file, or you have a nonsyntax
|
||||||
|
error, the compiler displays the line
|
||||||
|
number and an error identification
|
||||||
|
number."
|
||||||
|
|
||||||
|
Page 2-15. Table 2-5 is incomplete. Add the
|
||||||
|
following Linker error messages:
|
||||||
|
|
||||||
|
Unable to open input file: xxxxxxxx
|
||||||
|
|
||||||
|
Explanation: The linker cannot find the
|
||||||
|
specified input file.
|
||||||
|
|
||||||
|
|
||||||
|
1-8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Incompatible relocatable file format
|
||||||
|
|
||||||
|
Explanation: Either the R86 file is
|
||||||
|
corrupted or it has a format that is
|
||||||
|
incompatible with the format expected by
|
||||||
|
LINK/MT+86.
|
||||||
|
|
||||||
|
Initialization of DSEG not allowed
|
||||||
|
|
||||||
|
Explanation: The linker has encountered a
|
||||||
|
DB or DW instruction in the Data segment.
|
||||||
|
|
||||||
|
Undefined symbol: xxxxxxxxx
|
||||||
|
|
||||||
|
Explanation: The specified symbol is
|
||||||
|
referenced but not defined in the module.
|
||||||
|
|
||||||
|
Page 3-8. The explanation of the /O option is
|
||||||
|
incorrect. Change as follows:
|
||||||
|
|
||||||
|
"/O:n tells the linker that the previous
|
||||||
|
file is a SYM file and that n is the
|
||||||
|
overlay number, in hexadecimal. You must
|
||||||
|
specify the overlay filename and number
|
||||||
|
in the link command line. This option is
|
||||||
|
for overlays only."
|
||||||
|
|
||||||
|
Page 3-10. Change the command line for linking an
|
||||||
|
overlay to:
|
||||||
|
|
||||||
|
LINKMT <prog.00n>=<sym file>/O:,<modules|libraries>/P:mmmm/X:ssss
|
||||||
|
|
||||||
|
|
||||||
|
Page 3-11. Change section 3.2.5 to 3.2.6. Insert
|
||||||
|
section 3.2.5 as follows:
|
||||||
|
|
||||||
|
3.2.5 Overlay Symbol Table
|
||||||
|
|
||||||
|
LINKMT creates a symbol table at the end
|
||||||
|
of the code segment for each overlay
|
||||||
|
|
||||||
|
|
||||||
|
1-9
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
module. This symbol table can be very
|
||||||
|
large because it includes all the symbols
|
||||||
|
in the overlay and the root. However,
|
||||||
|
not all the entries in the symbol table
|
||||||
|
are required by the overlay. The overlay
|
||||||
|
requires only those entries called from
|
||||||
|
the root or another overlay. Therefore,
|
||||||
|
after linking each overlay module, you
|
||||||
|
should use the STRIP utility to reduce
|
||||||
|
the size of the symbol table.
|
||||||
|
|
||||||
|
Note: LINKMT provides the size of the
|
||||||
|
code segment which does not include the
|
||||||
|
symbol table for overlay modules. Thus,
|
||||||
|
the total code size required for an
|
||||||
|
overlay module will be much larger than
|
||||||
|
the size given by LINKMT if you do not
|
||||||
|
use STRIP.
|
||||||
|
|
||||||
|
To use STRIP, enter the command
|
||||||
|
|
||||||
|
A>strip
|
||||||
|
|
||||||
|
|
||||||
|
Once invoked, STRIP asks for the name of
|
||||||
|
the file to strip, the location of the
|
||||||
|
symbol table (the same number used with
|
||||||
|
the P parameter when you link the
|
||||||
|
overlay), and the name of each entry
|
||||||
|
point you want to retain in the symbol
|
||||||
|
table. You must enter the entry points
|
||||||
|
in reverse order of their declaration.
|
||||||
|
|
||||||
|
STRIP searches the symbol table for the
|
||||||
|
first entry point and deletes all others
|
||||||
|
it encounters until it finds the correct
|
||||||
|
one. STRIP then requests another entry
|
||||||
|
point and continues. When the last one
|
||||||
|
is found, you enter a dummy entry point
|
||||||
|
such as ZZZ and then STRIP continues to
|
||||||
|
delete the other entries until it finds
|
||||||
|
|
||||||
|
|
||||||
|
1-10
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
the end to the table.
|
||||||
|
|
||||||
|
After deleting all the unused entry
|
||||||
|
points, STRIP lists the remaining entry
|
||||||
|
points and asks if it should replace the
|
||||||
|
original version with the stripped
|
||||||
|
version. You must answer with "YESDOIT"
|
||||||
|
to replace the original. Any other
|
||||||
|
response terminates STRIP and does not
|
||||||
|
change the original.
|
||||||
|
|
||||||
|
|
||||||
|
Page 3-13. The example command lines for linking
|
||||||
|
overlays 1 and 2 are incorrect. They
|
||||||
|
should be:
|
||||||
|
|
||||||
|
A>LINKMT DEMOPROG.001=DEMOPROG/O.1,MOD1,PASLIB,/S/P:4000/L
|
||||||
|
|
||||||
|
A>LINKMT DEMOPROG.002=DEMOPROG/O.2,MOD2,PASLIB,/S/P:4000/L
|
||||||
|
|
||||||
|
|
||||||
|
Page 3-14. Insert the following before paragraph 6:
|
||||||
|
|
||||||
|
"To chain from one EXE file to another,
|
||||||
|
you must perform the following steps:
|
||||||
|
|
||||||
|
1) Using the linker, determine the code
|
||||||
|
size of the largest program you want
|
||||||
|
to chain to.
|
||||||
|
|
||||||
|
2) Round the value of the code size to
|
||||||
|
the nearest multiple of 512 bytes
|
||||||
|
(200H), and then add 512 bytes.
|
||||||
|
|
||||||
|
3) Use this new value for the code size
|
||||||
|
of the root program, unless the root
|
||||||
|
is already larger.
|
||||||
|
|
||||||
|
Page 3-14. Add the following to paragraph 6
|
||||||
|
concerning shared variables:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1-11
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
"You must also rewrite the initialization
|
||||||
|
routine in PASLIB because it zeros out
|
||||||
|
the data area. Change @INI3.I86 to
|
||||||
|
reflect the size of the common area. For
|
||||||
|
example,
|
||||||
|
|
||||||
|
SUB CX, 100H + common area size
|
||||||
|
MOV DI, 100H + " " "
|
||||||
|
|
||||||
|
|
||||||
|
Page 4-7. Delete the third paragraph, and insert the
|
||||||
|
following:
|
||||||
|
|
||||||
|
"Floating-point real numbers are returned
|
||||||
|
in the DX, CX, BX, and AX registers. BCD
|
||||||
|
reals are returned in DI, DX, CX, BX, and
|
||||||
|
AX. The high-order byte is in DX (or
|
||||||
|
DI), and the low-order is always in AX."
|
||||||
|
|
||||||
|
Page 4-14. In the paragraph under Listing 4-6 add
|
||||||
|
the sentence:
|
||||||
|
|
||||||
|
"An extra eight bytes of code is
|
||||||
|
generated here, but the amount can vary
|
||||||
|
depending on the number and type of
|
||||||
|
parameters. There is no empirical
|
||||||
|
formula for determining the extra
|
||||||
|
amount."
|
||||||
|
|
||||||
|
Page 4-18. Add the following to the explanation of
|
||||||
|
MEMAVAIL:
|
||||||
|
|
||||||
|
"FULLHEAP.R86 has been extended to make
|
||||||
|
available up to 1 megabyte of heap space.
|
||||||
|
MEMAVAIL and MAXAVAIL both return INTEGER
|
||||||
|
values, so if you are using more than 32K
|
||||||
|
of heap space, you must declare them as
|
||||||
|
follows:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1-12
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pascal/MT+ Release Notes
|
||||||
|
|
||||||
|
|
||||||
|
EXTERNAL FUNCTION LMEMAVAIL : LONGINT;
|
||||||
|
EXTERNAL FUNCTION LMAXAVAIL : LONGINT;
|
||||||
|
|
||||||
|
These functions are both in PASLIB.
|
||||||
|
|
||||||
|
Page 5-1. The first paragraph in Section 5.1 refers
|
||||||
|
to the Intel publication named "MCS-86
|
||||||
|
Macro Assembly Language Reference
|
||||||
|
Manual." This manual is no longer in
|
||||||
|
print, but has been replaced by the
|
||||||
|
"ASM86 Language Reference Manual". The
|
||||||
|
Intel order number for this new manual is
|
||||||
|
121703-002.
|
||||||
|
|
||||||
|
Page 5-3. In Table 5-1, add the following to the
|
||||||
|
explanation of the Pd option:
|
||||||
|
|
||||||
|
Unlike the similar MT86 compiler option,
|
||||||
|
P does not send output to the printer.
|
||||||
|
|
||||||
|
Page 5-9. In Table 5-3, 320 bytes should be 32
|
||||||
|
bytes.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1-13
|
||||||
|
|
||||||
|
|
||||||
|
|
31
Digital Research MT+86 Pascal v311/SIEVE.PAS
Normal file
31
Digital Research MT+86 Pascal v311/SIEVE.PAS
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
program sieve( INPUT, OUTPUT );
|
||||||
|
|
||||||
|
const
|
||||||
|
size = 8190;
|
||||||
|
|
||||||
|
type
|
||||||
|
flagType = array[ 0..size ] of boolean;
|
||||||
|
|
||||||
|
var
|
||||||
|
i, k, prime, count, iter : integer;
|
||||||
|
flags : flagType;
|
||||||
|
|
||||||
|
begin
|
||||||
|
for iter := 1 to 10 do begin
|
||||||
|
count := 0;
|
||||||
|
for i := 0 to size do flags[ i ] := true;
|
||||||
|
for i := 0 to size do begin
|
||||||
|
if flags[ i ] then begin
|
||||||
|
prime := i + i + 3;
|
||||||
|
k := i + prime;
|
||||||
|
while k <= size do begin
|
||||||
|
flags[ k ] := false;
|
||||||
|
k := k + prime;
|
||||||
|
end;
|
||||||
|
count := count + 1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
writeln( 'count of primes: ', count );
|
||||||
|
end.
|
BIN
Digital Research MT+86 Pascal v311/STRIP.EXE
Normal file
BIN
Digital Research MT+86 Pascal v311/STRIP.EXE
Normal file
Binary file not shown.
BIN
Digital Research MT+86 Pascal v311/SZ.EXE
Normal file
BIN
Digital Research MT+86 Pascal v311/SZ.EXE
Normal file
Binary file not shown.
82
Digital Research MT+86 Pascal v311/TAP.PAS
Normal file
82
Digital Research MT+86 Pascal v311/TAP.PAS
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
program tap;
|
||||||
|
|
||||||
|
var
|
||||||
|
loops, i, rsf, prev, total, greatest, a, b, c : integer;
|
||||||
|
v, ri, rtotal : real;
|
||||||
|
|
||||||
|
function gcd( m : integer; n : integer ) : integer;
|
||||||
|
var
|
||||||
|
a, b, r : integer;
|
||||||
|
begin { gcd }
|
||||||
|
a := 0;
|
||||||
|
if ( m > n ) then begin
|
||||||
|
b := m;
|
||||||
|
r := n;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
b := n;
|
||||||
|
r := m;
|
||||||
|
end;
|
||||||
|
|
||||||
|
while ( 0 <> r ) do begin
|
||||||
|
a := b;
|
||||||
|
b := r;
|
||||||
|
r := a MOD b;
|
||||||
|
end;
|
||||||
|
|
||||||
|
gcd := b;
|
||||||
|
end; { gcd }
|
||||||
|
|
||||||
|
procedure first_implementation;
|
||||||
|
var
|
||||||
|
total, i, prev : integer;
|
||||||
|
sofar, ri, iq : real;
|
||||||
|
begin
|
||||||
|
total := 10000;
|
||||||
|
sofar := 0.0;
|
||||||
|
prev := 1;
|
||||||
|
|
||||||
|
for i := 1 to total do begin
|
||||||
|
ri := i;
|
||||||
|
iq := ri * ri * ri;
|
||||||
|
sofar := sofar + ( 1.0 / iq );
|
||||||
|
if ( i = ( prev * 10 ) ) then begin
|
||||||
|
prev := i;
|
||||||
|
write( ' at ', i );
|
||||||
|
writeln( ' iterations: ', sofar );
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin { tap }
|
||||||
|
writeln( 'tap starting, should tend towards 1.2020569031595942854...' );
|
||||||
|
|
||||||
|
writeln( 'first implementation...' );
|
||||||
|
first_implementation;
|
||||||
|
|
||||||
|
{ no Random
|
||||||
|
writeln( 'second implementation...' );
|
||||||
|
loops := 10000;
|
||||||
|
total := 0;
|
||||||
|
prev := 1;
|
||||||
|
|
||||||
|
for i := 1 to loops do begin
|
||||||
|
a := Random( 32767 );
|
||||||
|
b := Random( 32767 );
|
||||||
|
c := Random( 32767 );
|
||||||
|
|
||||||
|
greatest := gcd( a, gcd( b, c ) );
|
||||||
|
if ( 1 = greatest ) then total := total + 1;
|
||||||
|
if ( i = ( prev * 10 ) ) then begin
|
||||||
|
prev := i;
|
||||||
|
rtotal := total;
|
||||||
|
ri := i;
|
||||||
|
v := ri / rtotal;
|
||||||
|
writeln( ' at ', i, ' iterations: ', v );
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
}
|
||||||
|
|
||||||
|
writeln( 'tap completed with great success' );
|
||||||
|
end. { tap }
|
||||||
|
|
BIN
Digital Research MT+86 Pascal v311/TRANCEND.R86
Normal file
BIN
Digital Research MT+86 Pascal v311/TRANCEND.R86
Normal file
Binary file not shown.
4
Digital Research MT+86 Pascal v311/m.bat
Normal file
4
Digital Research MT+86 Pascal v311/m.bat
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
ntvdm mt86 %1
|
||||||
|
ntvdm linkmt %1 paslib.r86 fpreals.r86
|
||||||
|
|
||||||
|
ntvdm -c -p %1
|
76
Digital Research MT+86 Pascal v311/mm.pas
Normal file
76
Digital Research MT+86 Pascal v311/mm.pas
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
{ BYTE magazine October 1982. Jerry Pournelle. }
|
||||||
|
{ various bugs not found because dimensions are square fixed by David Lee }
|
||||||
|
{ expected result: 4.65880E+05 }
|
||||||
|
|
||||||
|
program matrix( output );
|
||||||
|
|
||||||
|
const
|
||||||
|
l = 20; { rows in A and resulting matrix C }
|
||||||
|
m = 20; { columns in A and rows in B (must be identical) }
|
||||||
|
n = 20; { columns in B and resulting matrix C }
|
||||||
|
|
||||||
|
var
|
||||||
|
A : array [ 1 .. l, 1 .. m ] of real; { [row,col] }
|
||||||
|
B : array [ 1 .. m, 1 .. n ] of real;
|
||||||
|
C : array [ 1 .. l, 1 .. n ] of real;
|
||||||
|
|
||||||
|
Summ: real;
|
||||||
|
|
||||||
|
procedure filla;
|
||||||
|
var
|
||||||
|
i, j : integer;
|
||||||
|
begin { filla }
|
||||||
|
for i := 1 to l do
|
||||||
|
for j := 1 to m do
|
||||||
|
A[ i, j ] := i + j;
|
||||||
|
end; { filla }
|
||||||
|
|
||||||
|
procedure fillb;
|
||||||
|
var
|
||||||
|
i, j : integer;
|
||||||
|
begin { fillb }
|
||||||
|
for i := 1 to m do
|
||||||
|
for j := 1 to n do
|
||||||
|
B[ i, j ] := trunc( ( i + j ) / j );
|
||||||
|
end; { fillb }
|
||||||
|
|
||||||
|
procedure fillc;
|
||||||
|
var
|
||||||
|
i, j : integer;
|
||||||
|
begin { fillc }
|
||||||
|
for i := 1 to l do
|
||||||
|
for j := 1 to n do
|
||||||
|
C[ i, j ] := 0;
|
||||||
|
end; { fillc }
|
||||||
|
|
||||||
|
procedure matmult;
|
||||||
|
var
|
||||||
|
i, j, k : integer;
|
||||||
|
begin { matmult }
|
||||||
|
for i := 1 to l do
|
||||||
|
for j := 1 to n do
|
||||||
|
for k := 1 to m do
|
||||||
|
C[ i, j ] := C[ i, j ] + A[ i, k ] * B[ k, j ];
|
||||||
|
end; { matmult }
|
||||||
|
|
||||||
|
procedure summit;
|
||||||
|
var
|
||||||
|
i, j : integer;
|
||||||
|
begin { summit }
|
||||||
|
for i := 1 to l do
|
||||||
|
for j := 1 to n do
|
||||||
|
Summ := Summ + C[ i, j ];
|
||||||
|
end; { summit }
|
||||||
|
|
||||||
|
begin { matrix }
|
||||||
|
Summ := 0;
|
||||||
|
|
||||||
|
filla;
|
||||||
|
fillb;
|
||||||
|
fillc;
|
||||||
|
matmult;
|
||||||
|
summit;
|
||||||
|
|
||||||
|
Writeln( 'summ is :', Summ );
|
||||||
|
end. { matrix }
|
||||||
|
|
BIN
Digital Research MT+86 Pascal v311/mtpas3.exe
Normal file
BIN
Digital Research MT+86 Pascal v311/mtpas3.exe
Normal file
Binary file not shown.
304
Digital Research MT+86 Pascal v311/ttt.pas
Normal file
304
Digital Research MT+86 Pascal v311/ttt.pas
Normal file
@ -0,0 +1,304 @@
|
|||||||
|
{ App to prove you can't win at Tic-Tac-Toe }
|
||||||
|
{ Written to target MT+86 - Pascal V3.1.1 }
|
||||||
|
|
||||||
|
program ttt;
|
||||||
|
|
||||||
|
const
|
||||||
|
scoreWin = 6;
|
||||||
|
scoreTie = 5;
|
||||||
|
scoreLose = 4;
|
||||||
|
scoreMax = 9;
|
||||||
|
scoreMin = 2;
|
||||||
|
scoreInvalid = 0;
|
||||||
|
|
||||||
|
pieceBlank = 0;
|
||||||
|
pieceX = 1;
|
||||||
|
pieceO = 2;
|
||||||
|
|
||||||
|
iterations = 1;
|
||||||
|
|
||||||
|
type
|
||||||
|
boardType = array[ 0..8 ] of integer;
|
||||||
|
PSTRING = ^STRING;
|
||||||
|
|
||||||
|
var
|
||||||
|
evaluated: integer;
|
||||||
|
board: boardType;
|
||||||
|
|
||||||
|
var
|
||||||
|
i, loops, code: integer;
|
||||||
|
startTicks, endTicks, elapsedTicks : longint;
|
||||||
|
|
||||||
|
external function @cmd : PSTRING;
|
||||||
|
external procedure @GETTIME( var hour,minute,second,hund : integer );
|
||||||
|
|
||||||
|
procedure dumpBoard;
|
||||||
|
var
|
||||||
|
i : integer;
|
||||||
|
begin
|
||||||
|
Write( '{' );
|
||||||
|
for i := 0 to 8 do
|
||||||
|
Write( board[i] );
|
||||||
|
Write( '}' );
|
||||||
|
end;
|
||||||
|
|
||||||
|
function lookForWinner : integer;
|
||||||
|
var
|
||||||
|
t, p : integer;
|
||||||
|
begin
|
||||||
|
{dumpBoard;}
|
||||||
|
p := pieceBlank;
|
||||||
|
t := board[ 0 ];
|
||||||
|
if pieceBlank <> t then
|
||||||
|
begin
|
||||||
|
if ( ( ( t = board[1] ) and ( t = board[2] ) ) or
|
||||||
|
( ( t = board[3] ) and ( t = board[6] ) ) ) then
|
||||||
|
p := t;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if pieceBlank = p then
|
||||||
|
begin
|
||||||
|
t := board[1];
|
||||||
|
if ( t = board[4] ) and ( t = board[7] ) then
|
||||||
|
p := t
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
t := board[2];
|
||||||
|
if ( t = board[5] ) and ( t = board[8] ) then
|
||||||
|
p := t
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
t := board[3];
|
||||||
|
if ( t = board[4] ) and ( t = board[5] ) then
|
||||||
|
p := t
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
t := board[6];
|
||||||
|
if ( t = board[7] ) and ( t = board[8] ) then
|
||||||
|
p := t
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
t := board[4];
|
||||||
|
if ( ( ( t = board[0] ) and ( t = board[8] ) ) or
|
||||||
|
( ( t = board[2] ) and ( t = board[6] ) ) ) then
|
||||||
|
p := t
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
lookForWinner := p;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function winner2( move: integer ) : integer;
|
||||||
|
var
|
||||||
|
x : integer;
|
||||||
|
begin
|
||||||
|
case move of
|
||||||
|
0: begin
|
||||||
|
x := board[ 0 ];
|
||||||
|
if not ( ( ( x = board[1] ) and ( x = board[2] ) ) or
|
||||||
|
( ( x = board[3] ) and ( x = board[6] ) ) or
|
||||||
|
( ( x = board[4] ) and ( x = board[8] ) ) )
|
||||||
|
then x := PieceBlank;
|
||||||
|
end;
|
||||||
|
1: begin
|
||||||
|
x := board[ 1 ];
|
||||||
|
if not ( ( ( x = board[0] ) and ( x = board[2] ) ) or
|
||||||
|
( ( x = board[4] ) and ( x = board[7] ) ) )
|
||||||
|
then x := PieceBlank;
|
||||||
|
end;
|
||||||
|
2: begin
|
||||||
|
x := board[ 2 ];
|
||||||
|
if not ( ( ( x = board[0] ) and ( x = board[1] ) ) or
|
||||||
|
( ( x = board[5] ) and ( x = board[8] ) ) or
|
||||||
|
( ( x = board[4] ) and ( x = board[6] ) ) )
|
||||||
|
then x := PieceBlank;
|
||||||
|
end;
|
||||||
|
3: begin
|
||||||
|
x := board[ 3 ];
|
||||||
|
if not ( ( ( x = board[4] ) and ( x = board[5] ) ) or
|
||||||
|
( ( x = board[0] ) and ( x = board[6] ) ) )
|
||||||
|
then x := PieceBlank;
|
||||||
|
end;
|
||||||
|
4: begin
|
||||||
|
x := board[ 4 ];
|
||||||
|
if not ( ( ( x = board[0] ) and ( x = board[8] ) ) or
|
||||||
|
( ( x = board[2] ) and ( x = board[6] ) ) or
|
||||||
|
( ( x = board[1] ) and ( x = board[7] ) ) or
|
||||||
|
( ( x = board[3] ) and ( x = board[5] ) ) )
|
||||||
|
then x := PieceBlank;
|
||||||
|
end;
|
||||||
|
5: begin
|
||||||
|
x := board[ 5 ];
|
||||||
|
if not ( ( ( x = board[3] ) and ( x = board[4] ) ) or
|
||||||
|
( ( x = board[2] ) and ( x = board[8] ) ) )
|
||||||
|
then x := PieceBlank;
|
||||||
|
end;
|
||||||
|
6: begin
|
||||||
|
x := board[ 6 ];
|
||||||
|
if not ( ( ( x = board[7] ) and ( x = board[8] ) ) or
|
||||||
|
( ( x = board[0] ) and ( x = board[3] ) ) or
|
||||||
|
( ( x = board[4] ) and ( x = board[2] ) ) )
|
||||||
|
then x := PieceBlank;
|
||||||
|
end;
|
||||||
|
7: begin
|
||||||
|
x := board[ 7 ];
|
||||||
|
if not ( ( ( x = board[6] ) and ( x = board[8] ) ) or
|
||||||
|
( ( x = board[1] ) and ( x = board[4] ) ) )
|
||||||
|
then x := PieceBlank;
|
||||||
|
end;
|
||||||
|
8: begin
|
||||||
|
x := board[ 8 ];
|
||||||
|
if not ( ( ( x = board[6] ) and ( x = board[7] ) ) or
|
||||||
|
( ( x = board[2] ) and ( x = board[5] ) ) or
|
||||||
|
( ( x = board[0] ) and ( x = board[4] ) ) )
|
||||||
|
then x := PieceBlank;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
winner2 := x;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function minmax( alpha: integer; beta: integer; depth: integer; move: integer ): integer;
|
||||||
|
var
|
||||||
|
p, value, pieceMove, score : integer;
|
||||||
|
begin
|
||||||
|
evaluated := evaluated + 1;
|
||||||
|
value := scoreInvalid;
|
||||||
|
if depth >= 4 then
|
||||||
|
begin
|
||||||
|
p := winner2( move ); { lookForWinner; }
|
||||||
|
if p <> pieceBlank then
|
||||||
|
begin
|
||||||
|
if p = pieceX then
|
||||||
|
value := scoreWin
|
||||||
|
else
|
||||||
|
value := scoreLose
|
||||||
|
end
|
||||||
|
else if depth = 8 then
|
||||||
|
value := scoreTie;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if value = scoreInvalid then
|
||||||
|
begin
|
||||||
|
if Odd( depth ) then
|
||||||
|
begin
|
||||||
|
value := scoreMin;
|
||||||
|
pieceMove := pieceX;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
value := scoreMax;
|
||||||
|
pieceMove := pieceO;
|
||||||
|
end;
|
||||||
|
|
||||||
|
p := 0;
|
||||||
|
repeat
|
||||||
|
if board[ p ] = pieceBlank then
|
||||||
|
begin
|
||||||
|
board[ p ] := pieceMove;
|
||||||
|
score := minmax( alpha, beta, depth + 1, p );
|
||||||
|
board[ p ] := pieceBlank;
|
||||||
|
|
||||||
|
if Odd( depth ) then
|
||||||
|
begin
|
||||||
|
if ( score > value ) then
|
||||||
|
begin
|
||||||
|
value := score;
|
||||||
|
if ( value = scoreWin ) or ( value >= beta ) then p := 10
|
||||||
|
else if ( value > alpha ) then alpha := value;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if ( score < value ) then
|
||||||
|
begin
|
||||||
|
value := score;
|
||||||
|
if ( value = scoreLose ) or ( value <= alpha ) then p := 10
|
||||||
|
else if ( value < beta ) then beta := value;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
p := p + 1;
|
||||||
|
until p > 8;
|
||||||
|
end;
|
||||||
|
|
||||||
|
minmax := value;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function argAsInt : integer;
|
||||||
|
var
|
||||||
|
offset, x, len, result : integer;
|
||||||
|
CommandString : STRING[ 127 ];
|
||||||
|
PTR : PSTRING;
|
||||||
|
begin
|
||||||
|
result := 0;
|
||||||
|
PTR := @CMD;
|
||||||
|
CommandString := PTR^;
|
||||||
|
len := ORD( CommandString[ 0 ] );
|
||||||
|
if 0 <> len then
|
||||||
|
begin
|
||||||
|
offset := 2;
|
||||||
|
x := ORD( CommandString[ 2 ] );
|
||||||
|
while ( ( x >= 48 ) and ( x <= 57 ) ) do
|
||||||
|
begin
|
||||||
|
result := result * 10;
|
||||||
|
result := result + x - 48;
|
||||||
|
offset := offset + 1;
|
||||||
|
x := ORD( CommandString[ offset ] );
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
argAsInt := result;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function tickCount : longint;
|
||||||
|
var
|
||||||
|
h, m, s, hu : integer;
|
||||||
|
lh, lm, ls, lhu, result : longint;
|
||||||
|
begin
|
||||||
|
@gettime( h, m, s, hu );
|
||||||
|
lh := long( h );
|
||||||
|
lm := long( m );
|
||||||
|
ls := long( s );
|
||||||
|
lhu := long( hu );
|
||||||
|
result := lhu + ( ls * #100 ) + ( lm * #6000 ) + ( lh * #360000 );
|
||||||
|
tickCount := result;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure runit( move : integer );
|
||||||
|
var
|
||||||
|
score: integer;
|
||||||
|
begin
|
||||||
|
board[move] := pieceX;
|
||||||
|
score := minmax( scoreMin, scoreMax, 0, move );
|
||||||
|
board[move] := pieceBlank;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
loops := argAsInt;
|
||||||
|
if 0 = loops then loops := Iterations;
|
||||||
|
|
||||||
|
WriteLn( 'begin' );
|
||||||
|
|
||||||
|
for i := 0 to 8 do
|
||||||
|
board[i] := pieceBlank;
|
||||||
|
|
||||||
|
startTicks := tickCount;
|
||||||
|
|
||||||
|
for i := 1 to loops do
|
||||||
|
begin
|
||||||
|
evaluated := 0; { once per loop to prevent overflow }
|
||||||
|
runit( 0 );
|
||||||
|
runit( 1 );
|
||||||
|
runit( 4 );
|
||||||
|
end;
|
||||||
|
|
||||||
|
endTicks := tickCount;
|
||||||
|
elapsedTicks := endTicks - startTicks;
|
||||||
|
WriteLn( 'hundredths of a second: ', short( elapsedTicks ) );
|
||||||
|
WriteLn( 'moves evaluated: ', evaluated );
|
||||||
|
WriteLn( 'iterations: ', loops );
|
||||||
|
end.
|
Loading…
Reference in New Issue
Block a user