|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 8576 (0x2180)
Types: TextFile
Names: »POLYPAS.PAS«
└─⟦042fc77f4⟧ Bits:30004107/disk4.imd SW1400 CCP/M 86 Distributionsdiskette 3.1
└─⟦this⟧ »POLYPAS.PAS«
└─⟦490a8e2df⟧ Bits:30003937 SW1501 RcComal-80 v3.0 (thykier)
└─⟦this⟧ »POLYPAS.PAS«
└─⟦72a4952a6⟧ Bits:30004362 SW1501 RcComal-80 v3.0
└─⟦this⟧ »POLYPAS.PAS«
└─⟦dcb507fe6⟧ Bits:30003936 SW1501 RcComal-80 v3.0 (ils)
└─⟦this⟧ »POLYPAS.PAS«
CONST
versno : INTEGER = $8324;
ppasmodif = 41;
valuepar = 0;
refpar = 1;
realpar = 0;
stringpar = 2;
proc = 5;
realfunc = 9;
stringfunc = 10;
ppaserr = 190;
konverr = 191;
TYPE
navne = STRINGÆ16Å;
VAR
(* de fire reserver må ikke slettes *)
reserver,
reserver1,
reserver2,
reserver3 : INTEGER;
hovedfil : FILE OF BYTE;
helptal : ARRAY Æ1..8Å OF BYTE;
(* -------------------------------- *)
(* RUTINER TIL UDSKRIVNING AF HOVED *)
PROCEDURE openfile(filnavn : navne);
BEGIN
assign(hovedfil, filnavn);
rewrite(hovedfil);
END;
PROCEDURE closefile;
BEGIN
close(hovedfil);
END;
PROCEDURE skriv_byte(tal : byte);
BEGIN
write(hovedfil,tal);
END;
PROCEDURE skriv_navn(varnavn : navne);
VAR
i : integer;
BEGIN
skriv_byte(len(varnavn));
FOR i:=1 TO len(varnavn) DO
skriv_byte(ord(varnavnÆiÅ));
END;
PROCEDURE skriv_offset(offset : integer);
BEGIN
skriv_byte(lo(offset));
skriv_byte(hi(offset));
END;
PROCEDURE skriv_packtype;
BEGIN
skriv_offset(ppasmodif);
END;
PROCEDURE skriv_versionsno;
BEGIN
skriv_offset(versno);
END;
PROCEDURE skriv_proc;
BEGIN
skriv_byte(proc);
END;
PROCEDURE skriv_realfunc;
BEGIN
skriv_byte(realfunc);
END;
PROCEDURE skriv_stringfunc;
BEGIN
skriv_byte(stringfunc);
END;
PROCEDURE skriv_typeogdim(partype, pardim : byte);
BEGIN
skriv_byte(partype);
skriv_byte(pardim);
END;
PROCEDURE skriv_reserver;
BEGIN
skriv_offset(ofs(reserver));
END;
(* -------------------------------- *)
(* RUTINER TIL PARAMETER BEHANDLING *)
TYPE
stringmax = STRINGÆ255Å;
PROCEDURE comalerror(errorkode : integer);
BEGIN CODE
$8B,$76,$04, (* MOV SI,4ÆBPÅ ; ERRORKODE *)
$BB,$20,$00, (* MOV BX,32 *)
$8B,$2E,reserver3, (* MOV BP,RESERVER3 *)
$1E, (* PUSH DS *)
$8E,$5E,$04, (* MOV DS,4ÆBPÅ *)
$FF,$5E,$00, (* CALLF DWORD PTR ÆBPÅ *)
$1F, (* POP DS *)
$8B,$2E,reserver3, (* MOV BP,RESERVER3 *)
$83,$ED,$06, (* SUB BP,6 *)
$8B,$E5, (* MOV SP,BP *)
$CB; (* RETF *)
END;
(* UNDERRUTINER *)
PROCEDURE henttal(segadr, ofsadr : integer; VAR tal : real);
VAR
i,
expo : integer;
help : real;
FUNCTION konv(segadr, ofsadr, no : integer): integer;
VAR
j,
k : integer;
BEGIN
j:=no div 2;
k:=memÆsegadr:ofsadr+jÅ;
IF no mod 2 = 0 THEN konv:=k div 16
ELSE konv:=k mod 16;
END; (* konv *)
BEGIN
help:=0.0;
FOR i:=1 TO 13 DO
BEGIN
help:=help*10+konv(segadr, ofsadr, i);
END;
IF konv(segadr,ofsadr,0) <> 0 THEN help:=-help;
IF help <> 0 THEN
BEGIN
help:=help*pwrten(-13);
expo:=memÆsegadr:ofsadr+7Å-128;
IF (expo>63) OR (expo<-63) THEN
BEGIN
comalerror(konverr);
END;
help:=help*pwrten(expo);
END;
tal:=help;
END; (* henttal *)
PROCEDURE gemtal(segadr, ofsadr : integer; tal : real);
VAR
expo,
k,
ciffer : integer;
mystr : stringÆ18Å;
PROCEDURE nibble(segadr, ofsadr : integer; no, value : byte);
VAR
j,
k : integer;
BEGIN
j:=no div 2;
k:=memÆsegadr:ofsadr+jÅ;
IF no mod 2 = 0 THEN memÆsegadr:ofsadr+jÅ:=value*16+k mod 16
ELSE memÆsegadr:ofsadr+jÅ:=(k div 16)*16+value;
END; (* nibble *)
FUNCTION somtal(ch :char): integer;
BEGIN
somtal:=ord(ch)-ord('0');
END;
BEGIN
str(tal,mystr);
IF mystrÆ2Å='-' THEN nibble(segadr,ofsadr,0,8)
ELSE nibble(segadr,ofsadr,0,0);
k:=1;
WHILE (k<=13) DO
BEGIN
IF k>=12 THEN ciffer:=0
ELSE
IF k=1 THEN ciffer:=somtal(mystrÆ3Å)
ELSE ciffer:=somtal(mystrÆk+3Å);
nibble(segadr, ofsadr, k, ciffer);
k:=k+1;
END;
expo:=somtal(mystrÆ17Å)*10+somtal(mystrÆ18Å);
IF mystrÆ16Å='-' THEN expo:=-expo;
expo:=129+expo;
memÆsegadr:ofsadr+7Å:=expo;
END; (* gemtal *)
PROCEDURE hentstring(segadr, ofsadr : integer; VAR mystr : stringmax);
VAR
i,
antal,
myseg,
myofs : integer;
BEGIN
antal:=memwÆsegadr:ofsadr+2Å;
IF antal>255 THEN comalerror(konverr);
myseg:=seg(mystr);
myofs:=ofs(mystr);
FOR i:=1 TO antal DO
BEGIN
memÆmyseg:myofs+iÅ:=memÆsegadr:ofsadr+i+3Å;
END;
memÆmyseg:myofsÅ:=antal;
END; (* hentstring *)
PROCEDURE gemstring(segadr, ofsadr : integer; mystr : stringmax);
VAR
i,
antal,
myseg,
myofs : integer;
BEGIN
antal:=len(mystr);
IF antal > memwÆsegadr:ofsadrÅ THEN comalerror(konverr);
myseg:=seg(mystr);
myofs:=ofs(mystr);
FOR i:=1 TO antal DO
BEGIN
memÆsegadr:ofsadr+i+3Å:=memÆmyseg:myofs+iÅ;
END;
memwÆsegadr:ofsadr+2Å:=antal;
END; (* gemstring *)
(* DE VÆSENTLIGE RUTINER *)
PROCEDURE getrealpar(no : byte; VAR tal : real);
VAR
stackadr : integer;
BEGIN
stackadr:=memwÆseg(reserver):ofs(reserver)+6Å;
henttal(memwÆsseg:stackadr+4Å,memwÆsseg:stackadr+4+no*2Å,tal);
END; (* getrealpar *)
PROCEDURE putrealpar(no : byte; tal : real);
VAR
stackadr : integer;
BEGIN
stackadr:=memwÆseg(reserver):ofs(reserver)+6Å;
gemtal(memwÆsseg:stackadr+4Å,memwÆsseg:stackadr+4+no*2Å,tal);
END; (* putrealpar *)
PROCEDURE getstringpar(no : byte; VAR mystr : stringmax);
VAR
stackadr : integer;
BEGIN
stackadr:=memwÆseg(reserver):ofs(reserver)+6Å;
hentstring(memwÆsseg:stackadr+4Å,memwÆsseg:stackadr+4+no*2Å,mystr);
END; (* getstringpar *)
PROCEDURE putstringpar(no : byte; mystr : stringmax);
VAR
stackadr : integer;
BEGIN
stackadr:=memwÆseg(reserver):ofs(reserver)+6Å;
gemstring(memwÆsseg:stackadr+4Å,memwÆsseg:stackadr+4+no*2Å,mystr);
END; (* putstringpar *)
(* CODE RUTINER *)
PROCEDURE returnfar;
BEGIN CODE
$8B,$2E,reserver3, (* MOV BP,RESERVER3 *)
$83,$ED,$06, (* SUB BP,6 *)
$8B,$E5, (* MOV SP,BP *)
$CB; (* RETF *)
END;
PROCEDURE comalprgfunckey;
BEGIN CODE
$55, (* PUSH BP *)
$BB,$1F,$00, (* MOV BX,31 *)
$8B,$2E,reserver3, (* MOV BP,RESERVER3 *)
$1E, (* PUSH DS *)
$8E,$5E,$04, (* MOV DS,4ÆBPÅ *)
$FF,$5E,$00, (* CALLF DWORD PTR ÆBPÅ *)
$1F, (* POP DS *)
$5D; (* POP BP *)
END;
PROCEDURE returnresult(resseg, resofs, mylen : integer);
BEGIN CODE
$8B,$46,$08, (* MOV AX,8ÆBPÅ ; RESSEG *)
$8B,$4E,$06, (* MOV CX,6ÆBPÅ ; RESOFS *)
$8B,$56,$04, (* MOV DX,4ÆBPÅ ; MYLEN *)
$8B,$2E,reserver3, (* MOV BP,RESERVER3 *)
$83,$ED,$06, (* SUB BP,6 *)
$8B,$E5, (* MOV SP,BP *)
$CB; (* RETF *)
END;
PROCEDURE return_realresult(tal : real);
BEGIN
gemtal(seg(helptal),ofs(helptal),tal);
returnresult(seg(helptal),ofs(helptal),0);
END;
PROCEDURE return_stringresult(mystr : stringmax);
VAR
leng : integer;
BEGIN
leng:=len(mystr);
returnresult(seg(mystr),ofs(mystr)+1,leng);
END;
(* BEHANDLING AF POLYPASCAL-FEJL *)
PROCEDURE error(errno, errofs : integer);
PROCEDURE hexwrite(no, antalfelter : integer);
PROCEDURE hexciffer(cif : integer);
BEGIN
IF cif<=9 THEN write(cif:1)
ELSE
BEGIN
write(chr(ord(cif-10)+ord('A')));
END;
END;
BEGIN
IF antalfelter = 1 THEN
BEGIN
hexciffer(no);
END
ELSE
BEGIN
hexwrite(no div 16, antalfelter-1);
hexciffer(no mod 16);
END;
END;
BEGIN
write('PolyPascal ');
CASE hi(errno) OF
0 : write('programafbrydelse (Ctrl C) ');
1 : BEGIN
write('I/0 fejl ');
hexwrite(lo(errno),2);
END;
2 : BEGIN
write('kørselsfejl ');
hexwrite(lo(errno),2);
END;
END;
write(' ved PC=');
hexwrite(errofs,4);
comalerror(ppaserr);
END;
PROCEDURE init_errorhandler;
BEGIN
ehofs:=ofs(error);
END;
«eof»