(* MPL - MICRO PROGRAMMING LANGUAGE / COPYRIGHT (C) 2017-2018 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; {$IFNDEF TPC}USES DOS,CRT;{$ENDIF}
CONST TOM=12287; (* 12287=24K 16382=~32K *)
TYPE
PTRINT={$IFDEF TPC}INTEGER{$ELSE}LONGINT{$ENDIF};
{$IFDEF TPC}POINTER=PTRINT{$ELSE}PTR=POINTER{$ENDIF};
STR127=STRING[127]; PINTEGER=^INTEGER;
RCHAR=PACKED RECORD AT:CHAR END; RINTEGER=PACKED RECORD AT:INTEGER END;
REF = PACKED RECORD CASE INTEGER OF
0:(I:PTRINT); 1:(P:POINTER); 2:(PS:^STR127); 3:(PC:^RCHAR); 4:(PI:^INTEGER)
END;
FID=(FERR,FMIN,F002,F003,FMAX,FINP,FOUT);
REG=PACKED RECORD PC,RP,LP,SP:INTEGER END;
PAR=PACKED ARRAY[0..15] OF INTEGER;
OPR=(
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,OBXO1,OBXO2,OBXO3,OBXO4,ODIV1,ODIV2,ODIV3,ODIV4,
OEQV1,OEQV2,OEQV3,OEQV4,OLD11,OLD12,OLD21,OLD22,OLIM1,OLIM2,OLIM3,OLIM4,
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,OTXO1,OTXO2,OFRE1,OFRE2,
OOO96);
NAT=(
NHALT,NARGC,NARGV,NCISA,NCISC,NCISD,NCISG,NCISL,NCISP,NCISU,NCTOL,NCTOU,
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,NVCLR,NVCLS,NVDEL,NVGXY,NVINS,NVKEY,
NVRDC,NVRDK,NVRDS,NVWRC,NVWRS,NXEXE,NXJSR,NXRD1,NXRD2,NXRDD,NXWR1,NXWR2,
NXWRD);
VAR
GM:PACKED RECORD CASE INTEGER OF
0:(V:PACKED ARRAY[(VNIL,VTOM,VAUX,VTMP,VPRG)] OF INTEGER);
1:(I:PACKED ARRAY[0..TOM] OF RINTEGER);
2:(C:PACKED ARRAY[0..0] OF RCHAR) END;
GC:CHAR; GA:INTEGER; GR:REG; MSRC,MDST:REF;
GF:PACKED ARRAY[FMIN..FMAX] OF TEXT;
GK:PACKED ARRAY[OPR] OF (K0,K1,K2,K3,K4);
GAI:^PAR; GAF:^TEXT;
GAR:PACKED ARRAY[0..4] OF ^REAL;
GAS:PACKED ARRAY[0..4] OF ^STR127;
{$IFDEF TPC}
FUNCTION READKEY:CHAR; VAR C:CHAR; BEGIN
READ(KBD,C); READKEY:=C;
END;
{$ENDIF}
PROCEDURE ARGV(VAR S:STR127; I:INTEGER); BEGIN
S:=PARAMSTR(I); FOR I:=1 TO LENGTH(S) DO S[I]:=UPCASE(S[I])
END;
PROCEDURE MREV(P:POINTER; L:INTEGER); VAR C:RCHAR; BEGIN
MSRC.P:=P; MDST.P:=P; MDST.I:=PRED(MDST.I+L);
WHILE (MSRC.I-MDST.I)<0 DO BEGIN
C:=MSRC.PC^; MSRC.PC^:=MDST.PC^; MDST.PC^:=C;
MSRC.I:=SUCC(MSRC.I); MDST.I:=PRED(MDST.I);
END
END;
FUNCTION ISQRT(A:INTEGER):INTEGER; VAR N0,N1:INTEGER; 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:INTEGER):INTEGER; VAR OUT:INTEGER; 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:STR127; L:INTEGER); BEGIN
IF L<0 THEN L:=0 ELSE IF L>127 THEN L:=127; S[0]:=CHR(L) END;
FUNCTION FRES(VAR F:TEXT):BOOLEAN; BEGIN FRES:=IORESULT=0 END;
FUNCTION FOLD(VAR F:TEXT; VAR FN:STR127):BOOLEAN;
BEGIN ASSIGN(F,FN); RESET(F); FOLD:=FRES(F) END;
FUNCTION FNEW(VAR F:TEXT; VAR FN:STR127):BOOLEAN; BEGIN
{$IFDEF HPC}ERASE(FN);{$ENDIF}
ASSIGN(F,FN); REWRITE(F); FNEW:=FRES(F) END;
FUNCTION FEND(VAR F:TEXT):BOOLEAN; BEGIN CLOSE(F); FEND:=FRES(F) END;
FUNCTION FRDC(VAR F:TEXT; VAR C:CHAR):BOOLEAN; 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):BOOLEAN; BEGIN
IF C=CHR(10) THEN WRITELN(F) ELSE WRITE(F,C); FWRC:=FRES(F) END;
FUNCTION FRDS(VAR F:TEXT; VAR S:STR127):BOOLEAN; BEGIN
IF EOF(F) THEN FRDS:=FALSE ELSE BEGIN READLN(F,S); FRDS:=FRES(F) END END;
FUNCTION FWRS(VAR F:TEXT; VAR S:STR127):BOOLEAN; VAR I:INTEGER; BEGIN FWRS:=FALSE;
FOR I:=1 TO LENGTH(S) DO IF NOT FWRC(F,S[I]) THEN EXIT; FWRS:=TRUE END;
PROCEDURE RX(I:INTEGER); BEGIN GA:=GAI^[I]; GAR[I]:=PTR(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:INTEGER); BEGIN GA:=GAI^[I]; GAS[I]:=PTR(ADDR(GM.C[GA])) END;
FUNCTION F1:BOOLEAN; VAR F:FID; BEGIN GAF:=NIL; F:=FID(GAI^[0]);
IF F IN [FMIN..FMAX] THEN GAF:=PTR(ADDR(GF[F]))
ELSE CASE F OF FINP:GAF:=PTR(ADDR(INPUT)); FOUT:GAF:=PTR(ADDR(OUTPUT)) END;
F1:=GAF<>NIL END;
PROCEDURE CALL(N:NAT); BEGIN GA:=0; GAI:=PTR(ADDR(GM.I[SUCC(GR.SP)]));
CASE N OF
NHALT:WRITELN('!!! HALT !!!');
NARGC:GA:=PARAMCOUNT; NARGV:BEGIN SX(0);ARGV(GAS[0]^,GAI^[1]) END;
NCTOL:BEGIN GA:=GAI^[0]; IF(GA>=65)AND(GA<= 90)THEN GA:=GA+32 END;
NCTOU:BEGIN GA:=GAI^[0]; IF(GA>=97)AND(GA<=122)THEN GA:=GA-32 END;
NFEND:IF F1 THEN BEGIN GA:=ORD(FEND(GAF^)) END;
NFEOF:IF F1 THEN BEGIN GA:=ORD(EOF(GAF^)) END;
NFNEW:IF F1 THEN BEGIN SX(1);GA:=ORD(FNEW(GAF^,GAS[1]^)) END;
NFOLD:IF F1 THEN BEGIN SX(1);GA:=ORD(FOLD(GAF^,GAS[1]^)) END;
NFRDC:IF F1 THEN BEGIN GA:=ORD(FRDC(GAF^,GC));GM.C[GAI^[1]].AT:=GC END;
NFRDS:IF F1 THEN BEGIN SX(1);GA:=ORD(FRDS(GAF^,GAS[1]^)) END;
NFWRC:IF F1 THEN BEGIN GA:=ORD(FWRC(GAF^,CHR(GAI^[1]))) END;
NFWRS:IF F1 THEN BEGIN SX(1);GA:=ORD(FWRS(GAF^,GAS[1]^)) END;
NIABS:GA:=ABS(GAI^[0]);
NIMAX:IF GAI^[0]>GAI^[1] THEN GA:=GAI^[0] ELSE GA:=GAI^[1];
NIMIN:IF GAI^[0]<GAI^[1] THEN GA:=GAI^[0] ELSE GA:=GAI^[1];
NIOFR:BEGIN RX(0);GA:=TRUNC(GAR[0]^) END;
NIOFS:BEGIN SX(0);VAL(GAS[0]^,GA,GM.V[VAUX]) END;
NISQR:GA:=GAI^[0]*GAI^[0];
NMCPY:BEGIN GA:=GAI^[0];MOVE(GM.C[GAI^[1]],GM.C[GA],GAI^[2]) END;
NMREV:BEGIN GA:=GAI^[0];MREV(ADDR(GM.C[GA]),GAI^[1]) END;
NMSET:BEGIN GA:=GAI^[0];FILLCHAR(GM.C[GA],GAI^[2],CHR(GAI^[1])) END;
NRABS:BEGIN R2;GAR[0]^:=ABS(GAR[1]^) END;
NRADD:BEGIN R3;GAR[0]^:=GAR[1]^+GAR[2]^ END;
NRATN:BEGIN R2;GAR[0]^:=ARCTAN(GAR[1]^) END;
NRCMP:BEGIN R2;IF GAR[0]^<GAR[1]^ THEN GA:=-1 ELSE IF GAR[0]^>GAR[1]^ THEN GA:=1 ELSE GA:=0 END;
NRCOS:BEGIN R2;GAR[0]^:=COS(GAR[1]^) END;
NRCPY:BEGIN R2;GAR[0]^:=GAR[1]^ END;
NRDIV:BEGIN R3;GAR[0]^:=GAR[1]^/GAR[2]^ END;
NREXP:BEGIN R2;GAR[0]^:=EXP(GAR[1]^) END;
NRFRA:BEGIN R2;GAR[0]^:=GAR[1]^-INT(GAR[1]^) END;
NRINT:BEGIN R2;GAR[0]^:=INT(GAR[1]^) END;
NRLOG:BEGIN R2;GAR[0]^:=LN(GAR[1]^) END;
NRMAX:BEGIN R3;IF GAR[1]^>GAR[2]^ THEN GAR[0]^:=GAR[1]^ ELSE GAR[0]^:=GAR[2]^ END;
NRMIN:BEGIN R3;IF GAR[1]^<GAR[2]^ THEN GAR[0]^:=GAR[1]^ ELSE GAR[0]^:=GAR[2]^ END;
NRMUL:BEGIN R3;GAR[0]^:=GAR[1]^*GAR[2]^ END;
NRNEG:BEGIN R2;GAR[0]^:=-GAR[1]^ END;
NROFI:BEGIN RX(0);GAR[0]^:=GAI^[1] END;
NROFS:BEGIN SX(1);RX(0);VAL(GAS[1]^,GAR[0]^,GM.V[VAUX]) END;
NRROU:BEGIN R2;GAR[0]^:=ROUND(GAR[1]^) END;
NRSIN:BEGIN R2;GAR[0]^:=SIN(GAR[1]^) END;
NRSQR:BEGIN R2;GAR[0]^:=SQR(GAR[1]^) END;
NRSRT:BEGIN R2;GAR[0]^:=SQRT(GAR[1]^) END;
NRSUB:BEGIN R3;GAR[0]^:=GAR[1]^-GAR[2]^ END;
NSADD:BEGIN SX(1);SX(0);GAS[0]^:=GAS[0]^+GAS[1]^ END;
NSCHR:BEGIN SX(0);GA:=POS(CHR(GAI^[1]),GAS[0]^) END;
NSCPY:BEGIN SX(1);SX(0);GAS[0]^:=GAS[1]^ END;
NSDEL:BEGIN SX(0);DELETE(GAS[0]^,GAI^[1],GAI^[2]) END;
NSFIX:BEGIN SX(0);SFIX(GAS[0]^,GAI^[1]) END;
NSINS:BEGIN SX(1);SX(0);INSERT(GAS[1]^,GAS[0]^,GAI^[2]) END;
NSMID:BEGIN SX(1);SX(0);GAS[0]^:=COPY(GAS[1]^,GAI^[2],GAI^[3]) END;
NSOFI:BEGIN SX(0);STR(GAI^[1]:GAI^[2],GAS[0]^) END;
NSOFR:BEGIN RX(1);SX(0);STR(GAR[1]^:GAI^[2]:GAI^[3],GAS[0]^) END;
NSSTR:BEGIN SX(1);SX(0);GA:=POS(GAS[1]^,GAS[0]^) END;
NVCLR:CLREOL; NVCLS:CLRSCR; NVDEL:DELLINE; NVINS:INSLINE;
NVGXY:GOTOXY(GAI^[0],GAI^[1]); NVKEY:GA:=ORD(KEYPRESSED);
NVRDC:BEGIN READ(GC);GA:=ORD(GC) END;
NVRDK:BEGIN GA:=ORD(READKEY); IF GA=0 THEN GA:=GA+(ORD(READKEY)SHL 8) END;
NVRDS:BEGIN SX(0);READLN(GAS[0]^) END;
NVWRC:BEGIN GA:=GAI^[0]; WRITE(CHR(GA)) END;
NVWRS:BEGIN SX(0);WRITE(GAS[0]^) END
END END;
PROCEDURE EXEC; LABEL 0; BEGIN GA:=IORESULT; 0:GC:=GM.C[GR.PC].AT; GR.PC:=SUCC(GR.PC);
IF ORD(GC)<ORD(OOO96) THEN CASE GK[OPR(GC)] OF
K1:BEGIN WITH GM.I[GA SHR 1] DO BEGIN CASE OPR(GC) OF
OLOAD:GA:=AT;
OAD1A:BEGIN AT:=SUCC(AT); GA:=AT END; OADA1:BEGIN GA:=AT; AT:=SUCC(AT) END;
OSU1A:BEGIN AT:=PRED(AT); GA:=AT END; OSUA1:BEGIN GA:=AT; AT:=PRED(AT) END;
OAD2A:BEGIN AT:=AT+2 ; GA:=AT END; OADA2:BEGIN GA:=AT; AT:=AT+2 END;
OSU2A:BEGIN AT:=AT-2 ; GA:=AT END; OSUA2:BEGIN GA:=AT; AT:=AT-2 END
END END; GOTO 0 END;
K2:BEGIN GR.SP:=PRED(GR.SP); WITH GM.I[GR.SP] DO BEGIN CASE OPR(GC) OF
OADD2:GA:=AT + GA; OSUB2:GA:=AT - GA; OMUL2:GA:=AT * GA; ODIV2:GA:=AT DIV GA;
OBAN2:GA:=AT AND GA; OBOR2:GA:=AT OR GA; OBXO2:GA:=AT XOR GA; OMOD2:GA:=AT MOD GA;
OSHL2:GA:=AT SHL GA; OSHR2:GA:=AT SHR GA;
OTEQ2:GA:=ORD(AT =GA); OTNE2:GA:=ORD(AT<>GA); OTGE2:GA:=ORD(AT>=GA);
OTGT2:GA:=ORD(AT> GA); OTLE2:GA:=ORD(AT<=GA); OTLT2:GA:=ORD(AT< GA);
OTAN2:GA:=ORD((AT<>0)AND(GA<>0));
OTOR2:GA:=ORD((AT<>0)OR (GA<>0));
OTXO2:GA:=ORD((AT<>0)XOR(GA<>0));
OLD21:GA:=ORD(GM.C[AT+GA].AT);
OLD22:GA:=GM.I[AT SHR 1 + GA].AT;
OSET2:GA:=AT END END; GOTO 0 END;
K3:BEGIN GR.SP:=PRED(GR.SP); WITH GM.C[GM.I[GR.SP].AT] DO BEGIN CASE OPR(GC) OF
OADD3:GA:=ORD(AT)+ GA; OSUB3:GA:=ORD(AT)- GA; OMUL3:GA:=ORD(AT)* GA; ODIV3:GA:=ORD(AT)DIV GA;
OBAN3:GA:=ORD(AT)AND GA; OBOR3:GA:=ORD(AT)OR GA; OBXO3:GA:=ORD(AT)XOR GA; OMOD3:GA:=ORD(AT)MOD GA;
OSHL3:GA:=ORD(AT)SHL GA; OSHR3:GA:=ORD(AT)SHR GA END; GA:=GA AND $FF; AT:=CHR(GA) END; GOTO 0 END;
K4:BEGIN GR.SP:=PRED(GR.SP); WITH GM.I[GM.I[GR.SP].AT SHR 1] DO BEGIN CASE OPR(GC) OF
OADD4:GA:=AT + GA; OSUB4:GA:=AT - GA; OMUL4:GA:=AT * GA; ODIV4:GA:=AT DIV GA;
OBAN4:GA:=AT AND GA; OBOR4:GA:=AT OR GA; OBXO4:GA:=AT XOR GA; OMOD4:GA:=AT MOD GA;
OSHL4:GA:=AT SHL GA; OSHR4:GA:=AT SHR GA END; AT:=GA END; GOTO 0 END
ELSE CASE OPR(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; OBXO1: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.SP)]DO AT:=AT+GA; OIDX2:WITH GM.I[PRED(GR.SP)]DO AT:=AT+GA SHL 1;
OLD11:GA:=ORD(GM.C[GA].AT); OLD12:GA:=GM.I[GA SHR 1].AT; OLEAD:GA:=(GA+GR.LP)SHL 1;
OLIM1:BEGIN {$IFDEF TPC}GA:=ORD(GM.C[GR.PC].AT);
IF (GA AND $80)=0 THEN GA:=GA AND $00FF ELSE GA:=GA OR $FF00;
{$ELSE}GA:=SHORTINT(ORD(GM.C[GR.PC].AT));{$ENDIF}
GR.PC:=SUCC(GR.PC) END;
OLIM2:BEGIN MOVE(GM.C[GR.PC],GA,2); GR.PC:=GR.PC+2 END;
OLIM3:BEGIN GA:=GR.PC; GR.PC:=SUCC(GR.PC+ORD(GM.C[GR.PC].AT)) END;
OSET1:BEGIN GM.I[GR.SP].AT:=GA; GR.SP:=SUCC(GR.SP) 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.PC],GR.PC,2) ELSE GR.PC:=GR.PC+2;
OJPNE:IF GA<>0 THEN MOVE(GM.C[GR.PC],GR.PC,2) ELSE GR.PC:=GR.PC+2;
OJUMP:MOVE(GM.C[GR.PC],GR.PC,2);
OJSUB:BEGIN GR.SP:=GR.SP-GA; WITH GM.I[GR.SP] DO IF AT<=0 THEN CALL(NAT(-AT))
ELSE BEGIN MOVE(GR,GM.I[GR.SP+GA],SIZEOF(REG));
GR.LP:=GR.SP; GR.SP:=GR.SP+GA+4; GR.PC:=AT END END;
OENTR:BEGIN GR.RP:=GR.LP+GA; MOVE(GM.I[GR.SP-4],GM.I[GR.RP],SIZEOF(REG));
GR.SP:=GR.RP+4 END;
OEXIT:MOVE(GM.I[GR.RP],GR,SIZEOF(REG)) ELSE EXIT END END
ELSE GA:=ORD(GC)-128; GOTO 0 END;
FUNCTION LOAD:BOOLEAN; VAR F:FILE OF RCHAR; FN:STR127; BEGIN
LOAD:=FALSE; ARGV(FN,1); ASSIGN(F,FN); 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:OPR; BEGIN
FOR O:=OABRT TO OOO96 DO CASE O OF
OLOAD,OSU1A,OSUA1,OAD1A,OADA1,OSU2A,OSUA2,OAD2A,OADA2:GK[O]:=K1;
OBAN3,OSET3,OSUB3,ODIV3,OADD3,OBOR3,OMOD3,OMUL3,OSHL3,OSHR3,OBXO3:GK[O]:=K3;
OBAN4,OSET4,OSUB4,ODIV4,OADD4,OBOR4,OMOD4,OMUL4,OSHL4,OSHR4,OBXO4:GK[O]:=K4;
OSET2,OBAN2,OBOR2,OBXO2,OTGE2,OTGT2,OTLE2,OTLT2,ODIV2,OMOD2,OMUL2,
OTNE2,OTEQ2,OTAN2,OTOR2,OTXO2,OSHL2,OSHR2,OADD2,OSUB2,OLD21,
OLD22:GK[O]:=K2 ELSE GK[O]:=K0
END;
GM.V[VNIL]:=0; GR.SP:=SUCC(GM.V[VTOM])SHR 1; GR.PC:=GM.V[VAUX];
GM.V[VTOM]:=TOM SHL 1; GM.I[TOM].AT:=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.