Menu

[r376]: / mpx.pas  Maximize  Restore  History

Download this file

264 lines (232 with data), 13.6 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
(* 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.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.