(* MPL - MICRO PROGRAMMING LANGUAGE / COPYRIGHT (C) 2017-2019 DEREK JOHN EVANS *)
(* NOTE: CP/M END ADDRESS = E000 *)
{$D-}{$I-}{$R-}{$V-}
{$IFDEF FPC}{$MODE TP}{$S-}{$ENDIF}
{$IFDEF HPC}{$M 8,4,4,4}{$F-}{$S-}{$ENDIF}
PROGRAM MPX;
{$IFDEF TPC}TYPE TADR=INTEGER;{$ELSE}USES DOS,CRT; TYPE TADR=LONGINT;
FUNCTION ADDR(VAR V):TADR; BEGIN ADDR:=TADR(@V) END;{$ENDIF}
CONST H80=128; TOM=12287; (* 12287=24K 16382=~32K *)
TYPE
TCHR=PACKED RECORD VAL:CHAR END;
TFLG=BOOLEAN; TINT=INTEGER; TSTR=STRING[80];
PCHR=RECORD CASE TFLG OF 0:(ADR:TADR);1:(PTR:^TCHR) END;
PREA=RECORD CASE TFLG OF 0:(ADR:TADR);1:(PTR:^REAL) END;
PSTR=RECORD CASE TFLG OF 0:(ADR:TADR);1:(PTR:^TSTR) END;
PEXT=RECORD CASE TFLG OF 0:(ADR:TADR);1:(PTR:^TEXT) END;
TINT16=PACKED ARRAY[0..15] OF TINT;
PINT16=RECORD CASE TFLG OF 0:(ADR:TADR);1:(PTR:^TINT16) END;
TFID=(FERR,FMIN,F002,F003,FMAX,FINP,FOUT);
TREG=PACKED RECORD M,R,L,S:TINT END;
TOPR=(
OABRT,OCASE,OENTR,OEXIT,OIDX1,OIDX2,OJPEQ,OJPNE,OJSUB,OJUMP,OLEAD,OLOAD,
OAD1A,OAD2A,OADA1,OADA2,OADD1,OADD2,OADD3,OADD4,OBAN1,OBAN2,OBAN3,OBAN4,
OBOR1,OBOR2,OBOR3,OBOR4,OBOX1,OBOX2,OBOX3,OBOX4,ODIV1,ODIV2,ODIV3,ODIV4,
OEQV1,OEQV2,OEQV3,OEQV4,OLD11,OLD12,OLD21,OLD22,OLIT1,OLIT2,OLIT3,OLIT4,
OMOD1,OMOD2,OMOD3,OMOD4,OMUL1,OMUL2,OMUL3,OMUL4,OSET1,OSET2,OSET3,OSET4,
OSHL1,OSHL2,OSHL3,OSHL4,OSHR1,OSHR2,OSHR3,OSHR4,OSU1A,OSU2A,OSUA1,OSUA2,
OSUB1,OSUB2,OSUB3,OSUB4,OTAN1,OTAN2,OTEQ1,OTEQ2,OTGE1,OTGE2,OTGT1,OTGT2,
OTLE1,OTLE2,OTLT1,OTLT2,OTNE1,OTNE2,OTOR1,OTOR2,OTOX1,OTOX2,OFRE1,OFRE2,
OOO96);
TNAT=(
NHALT,NARGC,NARGV,NCISA,NCISC,NCISD,NCISG,NCISL,NCISP,NCISU,NCLWR,NCUPR,
NFDEL,NFEND,NFEOF,NFNEW,NFOLD,NFRDC,NFRDS,NFWRC,NFWRS,NIABS,NIMAX,NIMIN,
NIOFL,NIOFR,NIOFS,NISGN,NISQR,NLABS,NLADD,NLASL,NLASR,NLCMP,NLCPY,NLDIV,
NLMOD,NLMUL,NLOFI,NLOFR,NLOFS,NLSGN,NLSQR,NLSUB,NMCHR,NMCMP,NMCPY,NMREV,
NMSET,NRABS,NRADD,NRATN,NRCMP,NRCOS,NRCPY,NRDIV,NREXP,NRFRA,NRINT,NRLOG,
NRMAX,NRMIN,NRMOD,NRMUL,NRNEG,NROFI,NROFL,NROFS,NRROU,NRSGN,NRSIN,NRSQR,
NRSRT,NRSUB,NSADD,NSCHR,NSCMP,NSCPY,NSDEL,NSDIF,NSFIX,NSINS,NSLWR,NSMID,
NSOFI,NSOFL,NSOFR,NSREV,NSSTR,NSUPR,NTCLR,NTCLS,NTDEL,NTGXY,NTINS,NTKEY,
NTRDC,NTRDK,NTRDS,NTWRC,NTWRS,NXEXE,NXJSR,NXRD1,NXRD2,NXRDD,NXWR1,NXWR2,
NXWRD);
VAR
GM:PACKED RECORD CASE TFLG OF
0:(V:PACKED ARRAY[(VNIL,VTOM,VAUX,VTMP,VPRG)] OF TINT);
1:(I:PACKED ARRAY[0..TOM] OF PACKED RECORD VAL:TINT END);
2:(C:PACKED ARRAY[0..0] OF TCHR) END;
GC:CHAR; GA:TINT; GR:TREG; MS,MD:PCHR;
GT:PACKED ARRAY[FMIN..FMAX] OF TEXT;
GK:PACKED ARRAY[TOPR] OF (K0,K1,K2,K3,K4);
GAI:PINT16; GAF:PEXT;
GAR:PACKED ARRAY[0..4] OF PREA;
GAS:PACKED ARRAY[0..4] OF PSTR;
{$IFDEF TPC}
FUNCTION READKEY:CHAR; VAR C:CHAR; BEGIN
READ(KBD,C); READKEY:=C;
END;
{$ENDIF}
PROCEDURE ARGV(VAR S:TSTR; I:TINT); BEGIN
S:=PARAMSTR(I); FOR I:=1 TO LENGTH(S) DO S[I]:=UPCASE(S[I]) END;
PROCEDURE MREV(A:TADR; L:TINT); VAR B:TCHR; BEGIN MS.ADR:=A; MD.ADR:=PRED(A+L);
WHILE (MS.ADR-MD.ADR)<0 DO BEGIN B:=MS.PTR^; MS.PTR^:=MD.PTR^; MD.PTR^:=B;
MS.ADR:=SUCC(MS.ADR); MD.ADR:=PRED(MD.ADR) END END;
FUNCTION ISQRT(A:TINT):TINT; VAR N0,N1:TINT; BEGIN
IF A>0 THEN BEGIN N0:=SUCC(A DIV 2); N1:=(N0+(A DIV N0)) DIV 2;
WHILE N1<N0 DO BEGIN N0:=N1; N1:=(N0+(A DIV N0)) DIV 2
END; ISQRT:=N0 END ELSE ISQRT:=0 END;
FUNCTION IPOW(A,B:TINT):TINT; VAR OUT:TINT; BEGIN OUT:=1;
WHILE B>0 DO BEGIN IF (B AND 1)<>0 THEN BEGIN OUT:=OUT*A END;
B:=B SHR 1; A:=A*A END; IPOW:=OUT END;
PROCEDURE SFIX(VAR S:TSTR; L:TINT); BEGIN
IF L<0 THEN L:=0 ELSE IF L>127 THEN L:=127; S[0]:=CHR(L) END;
FUNCTION FRES(VAR F:TEXT):TFLG; BEGIN FRES:=IORESULT=0 END;
FUNCTION FOLD(VAR F:TEXT; VAR S:TSTR):TFLG;
BEGIN ASSIGN(F,S); RESET(F); FOLD:=FRES(F) END;
FUNCTION FNEW(VAR F:TEXT; VAR S:TSTR):TFLG; BEGIN
{$IFDEF HPC}ERASE(S);{$ENDIF} ASSIGN(F,S); REWRITE(F); FNEW:=FRES(F) END;
FUNCTION FEND(VAR F:TEXT):TFLG; BEGIN CLOSE(F); FEND:=FRES(F) END;
FUNCTION FRDC(VAR F:TEXT; VAR C:CHAR):TFLG; BEGIN
IF EOF(F) THEN FRDC:=FALSE ELSE BEGIN IF EOLN(F) THEN BEGIN
READLN(F); C:=CHR(10) END ELSE READ(F,C); FRDC:=FRES(F) END END;
FUNCTION FWRC(VAR F:TEXT; C:CHAR):TFLG; BEGIN
IF C=CHR(10) THEN WRITELN(F) ELSE WRITE(F,C); FWRC:=FRES(F) END;
FUNCTION FRDS(VAR F:TEXT; VAR S:TSTR):TFLG; BEGIN
IF EOF(F) THEN FRDS:=FALSE ELSE BEGIN READLN(F,S); FRDS:=FRES(F) END END;
FUNCTION FWRS(VAR F:TEXT; VAR S:TSTR):TFLG; VAR I:TINT; BEGIN FWRS:=FALSE;
FOR I:=1 TO LENGTH(S) DO IF NOT FWRC(F,S[I]) THEN EXIT; FWRS:=TRUE END;
PROCEDURE RX(I:TINT); BEGIN GA:=GAI.PTR^[I]; GAR[I].ADR:=ADDR(GM.I[GA SHR 1]) END;
PROCEDURE R2; BEGIN RX(1); RX(0) END;
PROCEDURE R3; BEGIN RX(2); RX(1); RX(0) END;
PROCEDURE SX(I:TINT); BEGIN GA:=GAI.PTR^[I]; GAS[I].ADR:=ADDR(GM.C[GA]) END;
FUNCTION F1:TFLG; VAR T:TFID; BEGIN GAF.PTR:=NIL; T:=TFID(GAI.PTR^[0]);
IF T IN [FMIN..FMAX] THEN GAF.ADR:=ADDR(GT[T]) ELSE CASE T OF
FINP:GAF.ADR:=ADDR(INPUT); FOUT:GAF.ADR:=ADDR(OUTPUT) END;
F1:=GAF.PTR<>NIL END;
PROCEDURE CALL(N:TNAT); BEGIN GA:=0; GAI.ADR:=ADDR(GM.I[SUCC(GR.S)]);
CASE N OF
NHALT:WRITELN('!!! HALT !!!');
NARGC:GA:=PARAMCOUNT; NARGV:BEGIN SX(0);ARGV(GAS[0].PTR^,GAI.PTR^[1]) END;
NCLWR:BEGIN GA:=GAI.PTR^[0]; IF(GA>=65)AND(GA<= 90)THEN GA:=GA+32 END;
NCUPR:BEGIN GA:=GAI.PTR^[0]; IF(GA>=97)AND(GA<=122)THEN GA:=GA-32 END;
NFEND:IF F1 THEN BEGIN GA:=ORD(FEND(GAF.PTR^)) END;
NFEOF:IF F1 THEN BEGIN GA:=ORD(EOF(GAF.PTR^)) END;
NFNEW:IF F1 THEN BEGIN SX(1);GA:=ORD(FNEW(GAF.PTR^,GAS[1].PTR^)) END;
NFOLD:IF F1 THEN BEGIN SX(1);GA:=ORD(FOLD(GAF.PTR^,GAS[1].PTR^)) END;
NFRDC:IF F1 THEN BEGIN GA:=ORD(FRDC(GAF.PTR^,GC));GM.C[GAI.PTR^[1]].VAL:=GC END;
NFRDS:IF F1 THEN BEGIN SX(1);GA:=ORD(FRDS(GAF.PTR^,GAS[1].PTR^)) END;
NFWRC:IF F1 THEN BEGIN GA:=ORD(FWRC(GAF.PTR^,CHR(GAI.PTR^[1]))) END;
NFWRS:IF F1 THEN BEGIN SX(1);GA:=ORD(FWRS(GAF.PTR^,GAS[1].PTR^)) END;
NIABS:GA:=ABS(GAI.PTR^[0]);
NIMAX:IF GAI.PTR^[0]>GAI.PTR^[1] THEN GA:=GAI.PTR^[0] ELSE GA:=GAI.PTR^[1];
NIMIN:IF GAI.PTR^[0]<GAI.PTR^[1] THEN GA:=GAI.PTR^[0] ELSE GA:=GAI.PTR^[1];
NIOFR:BEGIN RX(0);GA:=TRUNC(GAR[0].PTR^) END;
NIOFS:BEGIN SX(0);VAL(GAS[0].PTR^,GA,GM.V[VAUX]) END;
NISQR:GA:=GAI.PTR^[0]*GAI.PTR^[0];
NMCPY:BEGIN GA:=GAI.PTR^[0];MOVE(GM.C[GAI.PTR^[1]],GM.C[GA],GAI.PTR^[2]) END;
NMREV:BEGIN GA:=GAI.PTR^[0];MREV(ADDR(GM.C[GA]),GAI.PTR^[1]) END;
NMSET:BEGIN GA:=GAI.PTR^[0];FILLCHAR(GM.C[GA],GAI.PTR^[2],CHR(GAI.PTR^[1])) END;
NRABS:BEGIN R2;GAR[0].PTR^:=ABS(GAR[1].PTR^) END;
NRADD:BEGIN R3;GAR[0].PTR^:=GAR[1].PTR^+GAR[2].PTR^ END;
NRATN:BEGIN R2;GAR[0].PTR^:=ARCTAN(GAR[1].PTR^) END;
NRCMP:BEGIN R2;IF GAR[0].PTR^<GAR[1].PTR^ THEN GA:=-1 ELSE IF GAR[0].PTR^>GAR[1].PTR^ THEN GA:=1 ELSE GA:=0 END;
NRCOS:BEGIN R2;GAR[0].PTR^:=COS(GAR[1].PTR^) END;
NRCPY:BEGIN R2;GAR[0].PTR^:=GAR[1].PTR^ END;
NRDIV:BEGIN R3;GAR[0].PTR^:=GAR[1].PTR^/GAR[2].PTR^ END;
NREXP:BEGIN R2;GAR[0].PTR^:=EXP(GAR[1].PTR^) END;
NRFRA:BEGIN R2;GAR[0].PTR^:=GAR[1].PTR^-INT(GAR[1].PTR^) END;
NRINT:BEGIN R2;GAR[0].PTR^:=INT(GAR[1].PTR^) END;
NRLOG:BEGIN R2;GAR[0].PTR^:=LN(GAR[1].PTR^) END;
NRMAX:BEGIN R3;IF GAR[1].PTR^>GAR[2].PTR^ THEN GAR[0].PTR^:=GAR[1].PTR^ ELSE GAR[0].PTR^:=GAR[2].PTR^ END;
NRMIN:BEGIN R3;IF GAR[1].PTR^<GAR[2].PTR^ THEN GAR[0].PTR^:=GAR[1].PTR^ ELSE GAR[0].PTR^:=GAR[2].PTR^ END;
NRMUL:BEGIN R3;GAR[0].PTR^:=GAR[1].PTR^*GAR[2].PTR^ END;
NRNEG:BEGIN R2;GAR[0].PTR^:=-GAR[1].PTR^ END;
NROFI:BEGIN RX(0);GAR[0].PTR^:=GAI.PTR^[1] END;
NROFS:BEGIN SX(1);RX(0);VAL(GAS[1].PTR^,GAR[0].PTR^,GM.V[VAUX]) END;
NRROU:BEGIN R2;GAR[0].PTR^:=ROUND(GAR[1].PTR^) END;
NRSIN:BEGIN R2;GAR[0].PTR^:=SIN(GAR[1].PTR^) END;
NRSQR:BEGIN R2;GAR[0].PTR^:=SQR(GAR[1].PTR^) END;
NRSRT:BEGIN R2;GAR[0].PTR^:=SQRT(GAR[1].PTR^) END;
NRSUB:BEGIN R3;GAR[0].PTR^:=GAR[1].PTR^-GAR[2].PTR^ END;
NSADD:BEGIN SX(1);SX(0);GAS[0].PTR^:=GAS[0].PTR^+GAS[1].PTR^ END;
NSCHR:BEGIN SX(0);GA:=POS(CHR(GAI.PTR^[1]),GAS[0].PTR^) END;
NSCPY:BEGIN SX(1);SX(0);GAS[0].PTR^:=GAS[1].PTR^ END;
NSDEL:BEGIN SX(0);DELETE(GAS[0].PTR^,GAI.PTR^[1],GAI.PTR^[2]) END;
NSFIX:BEGIN SX(0);SFIX(GAS[0].PTR^,GAI.PTR^[1]) END;
NSINS:BEGIN SX(1);SX(0);INSERT(GAS[1].PTR^,GAS[0].PTR^,GAI.PTR^[2]) END;
NSMID:BEGIN SX(1);SX(0);GAS[0].PTR^:=COPY(GAS[1].PTR^,GAI.PTR^[2],GAI.PTR^[3]) END;
NSOFI:BEGIN SX(0);STR(GAI.PTR^[1]:GAI.PTR^[2],GAS[0].PTR^) END;
NSOFR:BEGIN RX(1);SX(0);STR(GAR[1].PTR^:GAI.PTR^[2]:GAI.PTR^[3],GAS[0].PTR^) END;
NSSTR:BEGIN SX(1);SX(0);GA:=POS(GAS[1].PTR^,GAS[0].PTR^) END;
NTCLR:CLREOL; NTCLS:CLRSCR; NTDEL:DELLINE; NTINS:INSLINE;
NTGXY:GOTOXY(GAI.PTR^[0],GAI.PTR^[1]); NTKEY:GA:=ORD(KEYPRESSED);
NTRDC:BEGIN READ(GC);GA:=ORD(GC) END;
NTRDK:BEGIN GA:=ORD(READKEY); IF GA=0 THEN GA:=GA+(ORD(READKEY)SHL 8) END;
NTRDS:BEGIN SX(0);READLN(GAS[0].PTR^) END;
NTWRC:BEGIN GA:=GAI.PTR^[0]; WRITE(CHR(GA)) END;
NTWRS:BEGIN SX(0);WRITE(GAS[0].PTR^) END
END END;
PROCEDURE EXEC; LABEL 0; BEGIN GA:=IORESULT; 0:GC:=GM.C[GR.M].VAL; GR.M:=SUCC(GR.M);
IF ORD(GC)<ORD(OOO96) THEN CASE GK[TOPR(GC)] OF
K1:BEGIN WITH GM.I[GA SHR 1] DO BEGIN CASE TOPR(GC) OF
OLOAD:GA:=VAL;
OAD1A:BEGIN VAL:=SUCC(VAL); GA:=VAL END; OADA1:BEGIN GA:=VAL; VAL:=SUCC(VAL) END;
OSU1A:BEGIN VAL:=PRED(VAL); GA:=VAL END; OSUA1:BEGIN GA:=VAL; VAL:=PRED(VAL) END;
OAD2A:BEGIN VAL:=VAL+2 ; GA:=VAL END; OADA2:BEGIN GA:=VAL; VAL:=VAL+2 END;
OSU2A:BEGIN VAL:=VAL-2 ; GA:=VAL END; OSUA2:BEGIN GA:=VAL; VAL:=VAL-2 END
END END; GOTO 0 END;
K2:BEGIN GR.S:=PRED(GR.S); WITH GM.I[GR.S] DO BEGIN CASE TOPR(GC) OF
OADD2:GA:=VAL + GA; OSUB2:GA:=VAL - GA; OMUL2:GA:=VAL * GA; ODIV2:GA:=VAL DIV GA;
OBAN2:GA:=VAL AND GA; OBOR2:GA:=VAL OR GA; OBOX2:GA:=VAL XOR GA; OMOD2:GA:=VAL MOD GA;
OSHL2:GA:=VAL SHL GA; OSHR2:GA:=VAL SHR GA;
OTEQ2:GA:=ORD(VAL =GA); OTNE2:GA:=ORD(VAL<>GA); OTGE2:GA:=ORD(VAL>=GA);
OTGT2:GA:=ORD(VAL> GA); OTLE2:GA:=ORD(VAL<=GA); OTLT2:GA:=ORD(VAL< GA);
OTAN2:GA:=ORD((VAL<>0)AND(GA<>0));
OTOR2:GA:=ORD((VAL<>0)OR (GA<>0));
OTOX2:GA:=ORD((VAL<>0)XOR(GA<>0));
OLD21:GA:=ORD(GM.C[VAL+GA].VAL);
OLD22:GA:=GM.I[VAL SHR 1 + GA].VAL;
OSET2:GA:=VAL END END; GOTO 0 END;
K3:BEGIN GR.S:=PRED(GR.S); WITH GM.C[GM.I[GR.S].VAL] DO BEGIN CASE TOPR(GC) OF
OADD3:GA:=ORD(VAL)+ GA; OSUB3:GA:=ORD(VAL)- GA; OMUL3:GA:=ORD(VAL)* GA;
ODIV3:GA:=ORD(VAL)DIV GA; OBAN3:GA:=ORD(VAL)AND GA; OBOR3:GA:=ORD(VAL)OR GA;
OBOX3:GA:=ORD(VAL)XOR GA; OMOD3:GA:=ORD(VAL)MOD GA; OSHL3:GA:=ORD(VAL)SHL GA;
OSHR3:GA:=ORD(VAL)SHR GA END; GA:=GA AND $FF; VAL:=CHR(GA) END; GOTO 0 END;
K4:BEGIN GR.S:=PRED(GR.S); WITH GM.I[GM.I[GR.S].VAL SHR 1] DO BEGIN CASE TOPR(GC) OF
OADD4:GA:=VAL + GA; OSUB4:GA:=VAL - GA; OMUL4:GA:=VAL * GA; ODIV4:GA:=VAL DIV GA;
OBAN4:GA:=VAL AND GA; OBOR4:GA:=VAL OR GA; OBOX4:GA:=VAL XOR GA; OMOD4:GA:=VAL MOD GA;
OSHL4:GA:=VAL SHL GA; OSHR4:GA:=VAL SHR GA END; VAL:=GA END; GOTO 0 END
ELSE CASE TOPR(GC) OF
OADD1:GA:=+GA ; OSUB1:GA:=-GA ; OMUL1:GA:=GA*GA ; ODIV1:GA:=ISQRT(GA);
OBAN1:GA:=GA AND 1; OBOR1:GA:=GA OR 1; OBOX1:GA:=GA XOR 1; OMOD1:GA:=GA AND 1;
OSHL1:GA:=GA SHL 1; OSHR1:GA:=GA SHR 1; OCASE:GA:=ORD(GA=GM.V[VAUX]);
OIDX1:WITH GM.I[PRED(GR.S)] DO VAL:=VAL+GA; OIDX2:WITH GM.I[PRED(GR.S)] DO VAL:=VAL+GA SHL 1;
OLD11:GA:=ORD(GM.C[GA].VAL); OLD12:GA:=GM.I[GA SHR 1].VAL; OLEAD:GA:=(GA+GR.L)SHL 1;
OLIT1:BEGIN {$IFDEF TPC}GA:=ORD(GM.C[GR.PC].VAL);
IF (GA AND H80)=0 THEN GA:=GA AND $00FF ELSE GA:=GA OR $FF00;
{$ELSE}GA:=SHORTINT(ORD(GM.C[GR.M].VAL));{$ENDIF}GR.M:=SUCC(GR.M) END;
OLIT2:BEGIN MOVE(GM.C[GR.M],GA,2); GR.M:=GR.M+2 END;
OLIT3:BEGIN GA:=GR.M; GR.M:=SUCC(GR.M+ORD(GM.C[GR.M].VAL)) END;
OSET1:BEGIN GM.I[GR.S].VAL:=GA; GR.S:=SUCC(GR.S) END;
OTEQ1:GA:=ORD(GA =0); OTNE1:GA:=ORD(GA<>0); OTGE1:GA:=ORD(GA>=0);
OTGT1:GA:=ORD(GA> 0); OTLE1:GA:=ORD(GA<=0); OTLT1:GA:=ORD(GA< 0);
OJPEQ:IF GA= 0 THEN MOVE(GM.C[GR.M],GR.M,2) ELSE GR.M:=GR.M+2;
OJPNE:IF GA<>0 THEN MOVE(GM.C[GR.M],GR.M,2) ELSE GR.M:=GR.M+2;
OJUMP:MOVE(GM.C[GR.M],GR.M,2);
OJSUB:BEGIN GR.S:=GR.S-GA; WITH GM.I[GR.S] DO IF VAL<=0 THEN CALL(TNAT(-VAL))
ELSE BEGIN MOVE(GR,GM.I[GR.S+GA],SIZEOF(TREG));
GR.L:=GR.S; GR.S:=GR.S+GA+4; GR.M:=VAL END END;
OENTR:BEGIN GR.R:=GR.L+GA; MOVE(GM.I[GR.S-4],GM.I[GR.R],SIZEOF(TREG));
GR.S:=GR.R+4 END; OEXIT:MOVE(GM.I[GR.R],GR,SIZEOF(TREG)) ELSE EXIT END END
ELSE GA:=ORD(GC)-H80; GOTO 0 END;
FUNCTION LOAD:TFLG; VAR F:FILE OF TCHR; S:TSTR; BEGIN
LOAD:=FALSE; ARGV(S,1); ASSIGN(F,S); RESET(F); IF IORESULT=0 THEN BEGIN
BLOCKREAD(F,GM.C,FILESIZE(F)); CLOSE(F) END; LOAD:=GM.V[VNIL]=1234 END;
PROCEDURE INIT; VAR O:TOPR; BEGIN
FOR O:=OABRT TO OOO96 DO CASE O OF
OADD4,OBAN4,OBOR4,OBOX4,ODIV4,OMOD4,OMUL4,OSET4,OSHL4,OSHR4,OSUB4:GK[O]:=K4;
OADD3,OBAN3,OBOR3,OBOX3,ODIV3,OMOD3,OMUL3,OSET3,OSHL3,OSHR3,OSUB3:GK[O]:=K3;
OADD2,OBAN2,OBOR2,OBOX2,ODIV2,OMOD2,OMUL2,OSET2,OSHL2,OSHR2,OSUB2,
OLD21,OLD22,OTAN2,OTEQ2,OTGE2,OTGT2,OTLE2,OTLT2,OTNE2,OTOR2,OTOX2:GK[O]:=K2;
OAD1A,OAD2A,OADA1,OADA2,OLOAD,OSU1A,OSU2A,OSUA1,OSUA2:GK[O]:=K1 ELSE GK[O]:=K0
END;
GM.V[VNIL]:=0; GR.S:=SUCC(GM.V[VTOM])SHR 1; GR.M:=GM.V[VAUX];
GM.V[VTOM]:=TOM SHL 1; GM.I[TOM].VAL:=0;
END;
{$IFDEF FPC}{$I MPXFPC.PAS}{$ENDIF}
BEGIN
{$IFDEF FPC}LIBNAT('LIBMPX');{$ENDIF}
IF PARAMCOUNT<1 THEN WRITELN('USAGE: MPX <FILE>')
ELSE IF LOAD THEN BEGIN INIT; EXEC; WRITELN; WRITELN('=',GA) END
ELSE WRITELN('NO INPUT');
{$IFDEF FPC}READLN;{$ENDIF}
END.