home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD1.img
/
d1xx
/
d183
/
pcq
/
source
/
stanfuncs.p
< prev
next >
Wrap
Text File
|
1989-02-25
|
4KB
|
145 lines
external;
{
Stanfuncs.p (of PCQ Pascal)
Copyright (c) 1989 Patrick Quaid
This module handles all the standard functions.
}
const
{$I "pasconst.i"}
type
{$I "pastype.i"}
var
{$I "pasvar.i"}
function loadaddress(): integer;
forward;
function match(s : integer): boolean;
forward;
function typecheck(t1, t2 : integer): boolean;
forward;
procedure error(s : string);
forward;
function expression() : integer;
forward;
function numbertype(i : integer): boolean;
forward;
procedure needleftparent;
forward;
procedure needrightparent;
forward;
procedure neednumber;
forward;
function getlabel(): integer;
forward;
procedure printlabel(l : integer);
forward;
function suffix(s : integer) : char;
forward;
procedure doopen(nametype, accessmode : integer);
{
This routine handles both open and reopen, depending on the
accessmode sent to it. This is just passed on to the DOS routine.
}
var
filetype : integer;
bufsize : integer;
begin
if typecheck(nametype, stringtype) then begin
writeln(output, "\tmove.l\td0,-(sp)");
if match(comma1) then begin
filetype := loadaddress();
if idents[filetype].offset = vfile then begin
writeln(output, "\tmove.l\t(sp)+,d0");
writeln(output, "\tmove.l\t#", accessmode, ',d2');
bufsize := idents[filetype].vtype;
bufsize := idents[bufsize].size;
writeln(output, "\tmove.l\t#", bufsize, ',8(a0)');
writeln(output, "\tjsr\t_p%open");
end else
error("Need a file variable");
end else
error("Expecting a comma");
end else
error("Expecting a string (the file name).");
end;
procedure stdfunc(varindex : integer);
{
This routine handles all the standard functions. All but
open and reopen are handled in-line.
}
var
exprtype : integer;
lab : integer;
begin
needleftparent;
if idents[varindex].offset < 10 then
exprtype := expression();
if idents[varindex].offset = 1 then begin { ord }
if idents[exprtype].offset = vordinal then begin
if idents[exprtype].size = 1 then
idents[varindex].vtype := bytetype
else if idents[exprtype].size = 2 then
idents[varindex].vtype := shorttype
else
idents[varindex].vtype := inttype;
end else
error("Must be a simple type");
end else if idents[varindex].offset = 2 then begin { chr }
if not numbertype(exprtype) then
neednumber;
end else if idents[varindex].offset = 3 then begin { odd }
if not numbertype(exprtype) then
neednumber;
writeln(output, "\tand.", suffix(idents[exprtype].size), "\t#1,d0");
writeln(output, "\tsne\td0");
end else if idents[varindex].offset = 4 then begin { abs }
if not numbertype(exprtype) then
neednumber;
lab := getlabel();
writeln(output, "\ttst.", suffix(idents[exprtype].size), "\td0");
write(output, "\tbpl.s\t");
printlabel(lab);
writeln(output);
writeln(output, "\tneg.", suffix(idents[exprtype].size), "\td0");
printlabel(lab);
writeln(output);
end else if idents[varindex].offset = 5 then begin { succ }
if idents[exprtype].offset <> vordinal then
error("expecting an ordinal type");
writeln(output, "\taddq.", suffix(idents[exprtype].size), "\t#1,d0");
idents[varindex].vtype := exprtype;
end else if idents[varindex].offset = 6 then begin { pred }
if idents[exprtype].offset <> vordinal then
error("expecting an ordinal type");
writeln(output, "\tsubq.", suffix(idents[exprtype].size), "\t#1,d0");
idents[varindex].vtype := exprtype;
end else if idents[varindex].offset = 7 then begin { reopen }
doopen(exprtype, 1005)
end else if idents[varindex].offset = 8 then begin { open }
doopen(exprtype, 1006)
end else if idents[varindex].offset = 9 then begin { eof }
if idents[exprtype].offset = vfile then begin
writeln(output, "\tmove.l\td0,a0");
writeln(output, "\tmove.b\t12(a0),d0");
end else
error("Expecting a file type");
end else if idents[varindex].offset = 10 then begin { adr }
exprtype := loadaddress();
writeln(output, "\tmove.l\ta0,d0");
end;
needrightparent;
end;