home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource3
/
122_01
/
pistol.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1985-08-21
|
42KB
|
1,749 lines
(*
*********************************************************
* *
* PISTOL-Portably Implemented Stack Oriented Language *
* Version 1.3 *
* (C) 1982 by Ernest E. Bergmann *
* Physics, Building #16 *
* Lehigh Univerisity *
* Bethlehem, Pa. 18015 *
* *
* Permission is hereby granted for all reproduction and *
* distribution of this material provided this notice is *
* is included. *
* *
*********************************************************
*)
PROGRAM PISTOL(INPUT:/);
(*DECEMBER 22, 1981 --FOR BEST PERFORMANCE IN PASCAL,
THIS PROGRAM SHOULD BE EDITED TO MAKE FULL USE
OF THE OPTIONS, USER=0,W=1,S=1,CSTEP=1,L=1,R=1
AND STRINGSMIN=-1 *)
LABEL 99;
CONST
VERSION=13;(*10* THE VERSION NUMBER,READABLE BY USER*)
USER=0;(*DISPLACEMENT FOR USER'S RAM AREA; IT SHOULD
BE CHANGED TO SIMPLIFY ADDRESS CALCULATION IN
ASSEMBLY CODE IMPLEMENTATIONS*)
W=1;(*RAM ADDRESS INCREMENT SIZE; TYPICALLY WOULD BE
2 OR 4 FOR 8-BIT MICROS AND OTHER BYTE ADDRESSABLE
MACHINES*)
R=1;(*INCREMENT SIZE FOR RSTACK,HIDDEN FROM USER*)
S=1;(*INCREMENT SIZE FOR (PARAMETER) STACK,HIDDEN*)
STACKMIN=0;(*WHATEVER IS CONVENIENT,HIDDEN FROM USER*)
MSTACKMIN=-3;(*STACKMIN-S*3*)
PSTACKMAX=203;(*STACKMAX+S*3*)
STACKMAX=200;(*STACKMIN+SSIZE*S*)
LSTACKMIN=0;(*WHATEVER IS CONVENIENT,HIDDEN FROM USER*)
L=1;(*LSTACK INCREMENT,HIDDEN FROM USER*)
LSTACKMAX=30;(*LSTACKMIN+LSIZE*L*)
CSTACKMIN=0;(*WHATEVER IS CONVENIENT*)
CSTEP=1;(*CSTACK INCREMENT*)
CSTACKMAX=30;(*CSTACKMIN+CSIZE*CSTEP*)
NUMINSTR=75;
RAMMIN=-57(*USER-W*57,OR LOWER,READABLE*);
MAXORD=127;(*7 BIT FOR DEC-20,READABLE*)
RAMMAX=8000;(*=RAMMIN+W*4000 AT LEAST,READABLE BY USER*)
COMPBUF=7000;(*=RAMMAX-W*200,OR LOWER,READABLE BY USER*)
SSIZE=200;(*READABLE BY USER*)
RSIZE=30;(*READABLE BY USER*)
RSTACKMIN=0;(*ARBITRARY,HIDDEN*)
RSTACKMAX=30;(*RSTACKMIN+R*RSIZE*)
LSIZE=30;(*READABLE BY USER*)
CSIZE=30;(*READABLE BY USER*)
(*VOCABULARY STACK IS LOCATED IN RAM*)
VSIZE=8;(*VOCAB STACK,READABLE BY USER*)
VBASE=1;(*=USER +W,READABLE BY USER*)
STRINGSMIN=7000(*READABLE BY USER*);
SYNTAXBASE=7001(*STRINGSMIN+1*);
STRINGSMAX=12000;(*STRINGSMIN+ 3000..5000 INTENDED FOR EDIT AREA *)
MAXLINNO=300;(*MAX # OF LINES POSSIBLE IN EDIT BUFFER,
READABLE BY USER*)
LINEBUF=9800;(*STRINGSMIN+2800,READABLE BY USER*)
CHKLMT=20(*SIZE OF CHECK STACK,READABLE BY USER*);
FALS=0; TRU=-1;
(* OPCODES WHOSE VALUES ARE NOT CRITICAL; THEY MUST BE
UNIQUE AND RECOGNIZEABLE BY KERNQ, AND SEPERABLE
INTO PINT1 AND PINT2 *)
PSEMICOLON=0;
WSTORE=1;
TIMES=2;
PLUS=3;
SUBTRACT=4;
DIVMOD=5;
PIF=6;
WAT=7;
ABRT=8;
SP=9;
LOAD=10;
PELSE=11;
WRD=12;
RP=13;
DROPOP=14;
PUSER=15;
EXEC=16;
EXITOP=17;
LIT=18;
STRLIT=19;
RPOP=20;
SWP=21;
TYI=22;
TYO=23;
RPSH=24;
SEMICF=25;
RAT=26;
COMPME=27;
COMPHERE=28;
DOLLARC=29;
COLON=30;
SEMICOLON=31;
IFOP=32;
ELSEOP=33;
THENOP=34;
DOOP=35;
LOOPOP=36;
BEGINOP=37;
ENDOP=38;
REPET=39;
PERCENT=40;
PDOLLAR=41;
PCOLON=42;
CASAT=43;
PDOOP=44;
PPLOOP=45;
PLLOOP=46;
CAT=47;
CSTORE=48;
PLOOP=49;
GT=50;
SEMIDOL=51;
KRNQ=52;
(* OPCODES 53,54 NOT USED AT MOMENT *)
SAT=55;
FINDOP=56;
LISTFIL=57;
(* OPCODE 58 MOMENTARILY UNUSED *)
LAT=59;
OFCAS=60;
CCOLON=61;
SEMICC=62;
NDCAS=63;
POFCAS=64;
PCCOL=65;
PSEMICC=66;
GTLIN=67;
WORD=68;
OPENR=69;
OPENW=70;
READL=71;
WRITL=72;
CORDMP=73;
RESTOR=74;
(* END OF OPCODE DECLARATIONS *)
TYPE DALFA = PACKED ARRAY[1..20] OF CHAR;
IMAGE= RECORD
STRINGS:PACKED ARRAY[STRINGSMIN..STRINGSMAX] OF CHAR;
RAM:ARRAY[RAMMIN..RAMMAX] OF INTEGER;
END(*RECORD*);
IMFILE=FILE OF IMAGE;
VAR
IMAGENAME,NAMEIN,NAMOUT,INFIL1,LISTNAME,NULLNAME:DALFA;
IP:INTEGER;(*INSTRUCTION POINTER*)
INSTR:INTEGER;(*INSTRUCTION CURRENTLY EXECUTED BY INTERPRET*)
SAVINSTR:INTEGER(*SAVES INSTR DURING TRACING*);
SAVLEVEL:INTEGER(*SAVES LEVEL DURING TRACING*);
TEMP: INTEGER;
EDIN,EDOUT,LDFIL1,LIST,OUTPUT:TEXT;
SAVEFILE:IMFILE;
NOPEN,FEOF,UNDFLO,OVFLO,SYNT,ID,REDEF,ADDR,VAL,I,DIVBY0:INTEGER;
CONVERTED:BOOLEAN;
C:CHAR;
(* RAM[RAMMIN...]:
RAM[USER-W*57]=MAXLINNO
RAM[USER-W*56]=CHKLMT
RAM[USER-W*55]=RAMMIN
RAM[USER-W*54]=STRINGSMIN
RAM[USER-W*53]=**TO BE RECYCLED**
RAM[USER-W*52]=ABORT PATCH
RAM[USER-W*51]=USER CONVERSION PATCH
RAM[USER-W*50]=PROMPT PATCH
RAM[USER-W*49]=STRINGSMAX
RAM[USER-W*48]=VBASE
RAM[USER-W*47]=VSIZE
RAM[USER-W*46]=CSIZE
RAM[USER-W*45]=LSIZE
RAM[USER-W*44]=RSIZE
RAM[USER-W*43]=SSIZE
RAM[USER-W*42]=LINEBUF
RAM[USER-W*41]=COMPBUF
RAM[USER-W*40]=RAMMAX
RAM[USER-W*39]=MAXORD =127 FOR 7 BIT CHARACTER REP.
RAM[USER-W*38]=MAXINT
RAM[USER-W*37]=**TO BE RECYCLED**
RAM[USER-W*36]=VERSION =11 (1.1)
RAM[USER-W*35]=SESSION DONE BOOLEAN
RAM[USER-W*34]=^PISTOL<
RAM[USER-W*33]=0(FOR PISTOL)
RAM[USER-W*32]=^VSTACK(CONTEXT)
FILE STATUS: NEGATIVE VALUE MEANS EOF FOR INPUT
OR FILE OPENED FOR WRITE;
MAGNETUDE OF VALUE=LINES OF TEXT
TRANSFERED SINCE FILE WAS OPENED.
RAM[USER-W*31]=STATUS FOR EDOUT
RAM[USER-W*30]=STATUS FOR EDIN
RAM[USER-W*29]=STATUS FOR LDFIL1
RAM[USER-W*28]=#GETLINE ADDRESS
RAM[USER-W*27]=TAB SIZE, NORMALLY 8
RAM[USER-W*26]=TRACE PATCH ADDRESS
RAM[USER-W*25]=ENDCASE PATCH ADDRESS
RAM[USER-W*24]=COLUMN
RAM[USER-W*23]=TERMINAL WIDTH
RAM[USER-W*22]=# OF LINES OUTPUT TO CONSOLE
RAM[USER-W*21]=TERMINAL PAGE,MAX # OF LINES
RAM[USER-W*20]=COMPILE-END-PATCH
USED TO SHOW CONTENTS OF COMPILE BUFFER
RAM[USER-W*19]=TRACE BOOLEAN AND LEVEL
RAM[USER-W*18]=HEAD OF TOKEN IN LINE
RAM[USER-W*17]=RAISE LC-->UC BOOLEAN
RAM[USER-W*16]=LINELENGTH
RAM[USER-W*15]=NEXTCH POINTER
RAM[USER-W*14]=CONSOLE OUT BOOLEAN
RAM[USER-W*13]=ECHO BOOLEAN
RAM[USER-W*12]=LIST BOOLEAN
RAM[USER-W*11]=INPUT FILE
RAM[USER-W*10..-7]=SYS TEMPS
RAM[USER-W*6]=CURRENT (POINTER)
RAM[USER-W*5]=OLD END OF STRINGS
RAM[USER-W*4]=CURRENT END OF STRINGS
RAM[USER-W*3]=.D
RAM[USER-W*2]=.C
RAM[USER-W*1]=RADIX
RAM[VBASE..VBASE+VSIZE]=VOCABULARY STACK
RAM[VBASE+VSIZE..NUMINSTR]=NOT USED HERE *)
MEMORY:IMAGE;
STKPTR:INTEGER;
RPTR:INTEGER;
LPTR:INTEGER;
CPTR:INTEGER;
(* STRINGS[STRINGSMIN] RADIX INDICATOR
STRINGS[SYNTAXBASE] DEPTH OF NESTING &
CHECKSTACK POINTER *)
RSTACK:ARRAY[RSTACKMIN..RSTACKMAX] OF INTEGER;
STACK:ARRAY[MSTACKMIN..PSTACKMAX] OF INTEGER;
LSTACK:ARRAY[LSTACKMIN..LSTACKMAX] OF INTEGER;
CSTACK:ARRAY[CSTACKMIN..CSTACKMAX] OF INTEGER;
(* VSTACK LOCATED IN LOW RAM *)
PROCEDURE ABORT;
FORWARD;(*RECURSION NEEDED HERE ONLY FOR CARRET,BELOW:*)
PROCEDURE CARRET(*OUTPUTS A CR-LF SEQUENCE*);
BEGIN
WITH MEMORY DO BEGIN
IF RAM[USER-W*14]<>FALS
THEN BEGIN
RAM[USER-W*22]:=RAM[USER-W*22]+1;
IF RAM[USER-W*22]=RAM[USER-W*21]
THEN BEGIN
READLN(INPUT);
READ(INPUT,C);
RAM[USER-W*22]:=0;
IF (C='Q') OR (C='q') THEN ABORT;
END;
RAM[USER-W*24]:=0;
WRITELN(OUTPUT);
END;
IF RAM[USER-W*12]<>FALS THEN WRITELN(LIST);
END(*WITH MEMORY*);
END(*CARRET*);
PROCEDURE SPACES(NUM:INTEGER);
FORWARD; (* NEEDED BY TAB, BELOW: *)
PROCEDURE TAB;
BEGIN
WITH MEMORY DO BEGIN
IF RAM[USER-W*27]>0
THEN SPACES(RAM[USER-W*27]-(RAM[USER-W*24] MOD RAM[USER-W*27]));
END(*WITH MEMORY*);
END(*TAB*);
PROCEDURE CHOUT(CH:CHAR);
(* OUTPUTS A CHARACTER*)
BEGIN
WITH MEMORY DO BEGIN
IF CH=CHR(13) THEN CARRET
ELSE IF CH=CHR(9) THEN TAB
ELSE BEGIN
IF RAM[USER-W*24]=RAM[USER-W*23] THEN CARRET;
RAM[USER-W*24]:=RAM[USER-W*24]+1;
IF RAM[USER-W*14]<>FALS THEN WRITE(OUTPUT,CH);
IF RAM[USER-W*12]<>FALS THEN WRITE(LIST,CH);
END
END(*WITH MEMORY*);
END(*CHOUT*);
PROCEDURE SPACES;
BEGIN
WHILE NUM>0 DO
BEGIN
CHOUT(' ');
NUM:=NUM-1;
END(*WHILE*)
END(*SPACES*);
PROCEDURE MESSAGE(ST:INTEGER);
BEGIN
WITH MEMORY DO BEGIN
IF ORD(STRINGS[ST])>0 THEN
BEGIN
RAM[USER-W*10]:=ST+ORD(STRINGS[ST]);(*LAST*)
REPEAT
ST:=ST+1;
CHOUT(STRINGS[ST]);
UNTIL ST=RAM[USER-W*10];
END(*IF*)
END(*WITH MEMORY*);
END(*MESSAGE*);
PROCEDURE INTERPRET(I:INTEGER);
FORWARD;(*NEEDED IN ABORT,PROMPT