/*********************************************************/
/*                                                       */
/* 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.                                          */
/*                                                       */
/*********************************************************/

/* main pistol module, February 1982 */

#include "bdscio.h"
#include "pistol.h"

main()
{       for (temp=0; temp<RAMSIZE; temp++)
               {ram[temp].in=10000;};
       ram[-57].in=MAXLINNO;
       ram[-56].in=CHKLMT;
       ram[-55].pw=nram;
       ram[-54].pc=strings;
       ram[-53].in=FALS;       /*bell*/
       ram[-52].in=FALS;       /* abort patch */
       ram[-51].in=FALS;       /* conversion patch */
       ram[-50].in=FALS;       /* standard prompt */
       ram[-49].pc=strings+STRINGSSIZE;
       ram[-48].pw=&ram[VBASE];
       ram[-47].in=VSIZE;
       ram[-46].in=CSIZE;
       ram[-45].in=LSIZE;
       ram[-44].in=RSIZE;
       ram[-43].in=SSIZE;
       ram[-42].pc=strings+2800;
       ram[-41].pw=&ram[RAMSIZE-250];
       ram[-40].pw=&ram[RAMSIZE];
       ram[-39].in=MAXORD;
       ram[-38].in=MAXINT;
       /*ram[-37]=*/
       ram[-36].in=VERSION;
       ram[-34].in=0;
       ram[-33].in=FALS;       /* nil link for PISTOL< */
               /* initializing file status */
       ram[-27].in=8;  /* init tabsize */
       ram[-25].in=ABRT;       /* init endcase to abort */
       ram[-24].in=0;  /*reset column location */
       ram[-23].in=TERMWIDTH;
       ram[-21].in=TERMLENGTH;
       ram[-20].in=FALS;       /* compile-end-patch */
       ram[-19].in=FALS;       /* init TRACE off */
       ram[-17].in=TRU;        /* raise on */
       ram[-13].in=FALS;       /* echo off */
       ram[-6].pw=&ram[-34];
       ram[-5].pc=&strings[CHKLMT+2];
       ram[-4].pc=ram[-5].pc;
       ram[-3].pc=&ram[80];

       divby0=addstring(16,"DIVISION BY ZERO");
       nopen=addstring(20,"*** FILE NOT OPENED*");
       feof=addstring(20,"*** EOF ENCOUNTERED*");
       id=addstring(18,"*** PISTOL 1.3 ***");
       synt=addstring(20,"*** SYNTAX ERROR ***");
       ovflo=addstring(19,"** STACK OVERFLOW *");
       undflo=addstring(19,"* STACK UNDERFLOW *");
       redef=addstring(16,"---redefining---");

       init(); /*contains penter and fills farray */

       ram[-1].in=10;  /* DECIMAL MODE :*/
       strings[0]='X';

       ram[-31].in=1;  /* edout */
       ram[-30].in=-1; /* edin */
       ram[-29].in=-1; /* ldfil1 */
       namein[0]=namout[0]=listnamef[0]=ram[-12].in=FALS;

       abort();        /* initialize return point */
       /*reseting stacks returns i/o to tty: produces signon*/
       ip=&ram;        /*so ram[ip] is in range*/
       ram[-35].in=FALS;
       ram[-32].pw=&ram[VBASE];
       ram[VBASE].pw=&ram[-34];
       ram[-6].pw=&ram[-34];
       stkptr=0;
       rptr=-1;
       cptr=0;
       lptr=0;
       strings[1]='\0';
       ram[-11].in=FALS;
       ram[-14].in=TRU;
       if (listname[0]=='\0') ram[-12].in=FALS;
       /*turns off listing if no listfile is open*/
       message(id);
       /* ifcr */
       if (ram[-24].in) carret();
       ram[-19].in=FALS;       /* turn off trace */
       if (ram[-52].pw) interpret(ram[-52].pw);
       /* user supplied supplement to ABORT */
       goto L99;
       do{     ram[-2].pw=&ram[COMPBUF];
               do compline(); while(strings[1]);
               compile(PSEMICOLON);

               if(ram[-20].pw) interpret(ram[-20].pw);
               if(ram[-14].in&&(!ram[-11].in||ram[-13].in))
                       ram[-24].in=ram[-22].in=FALS;
               interpret(&ram[COMPBUF]);

L99:            ram[-4].pc=ram[-5].pc;
       }
       while( !ram[-35].in );

       printf("\nPISTOL NORMAL EXIT\n");
       if(listname[0]) closout(list);
       if(namout[0]) closout(edout);

       exit(); /*files need to be flushed and closed */
}

closout(iobuf)
char *iobuf;
{       putc(CPMEOF,iobuf);
       fflush(iobuf); fclose(iobuf);
}