Subject: v07i078: A BASIC Interpreter, Part06/06 Newsgroups: mod.sources Approved: mirror!rs Submitted by: phil@Cs.Ucl.AC.UK Mod.sources: Volume 7, Issue 78 Archive-name: basic/Part06 # Shar file shar06 (of 6) # # This is a shell archive containing the following files :- # pyramid/conf.h # pyramid/term.c # vax/Makefile # vax/as.s # vax/asm.sed # vax/conf.h # vax/term.c # ------------------------------ # This is a shell archive, shar, format file. # To unarchive, feed this text into /bin/sh in the directory # you wish the files to be in. echo x - pyramid/conf.h 1>&2 sed 's/^X//' > pyramid/conf.h << 'End of pyramid/conf.h' X/* X * BASIC by Phil Cockcroft X */ X/* X * configuration file for pyramid systems (BSD unix only) X */ X X/* X * memory sizes. X */ X X#define MAXMEM (memp)1000000 /* max amount of memory */ X#define MEMINC 8191 /* sizeof memory increments -1 */ X X/* X * various options X */ X X#define V7 /* must be defined */ X#define BERK /* must be defined */ X#define UCB_NTTY /* must be defined */ X#define LKEYWORDS X#define LNAMES X#define RENUMB X#define SCOMMS X#define VFORK X#define BLOCKSIZ 1024 X#define BSD42 X#define ALIGN4 X#define MPORTABLE X#define PORTABLE X X/* X * terminal dependent stuff X */ X X#define CTRLINT 03 /* sig int control c */ X#define CTRLQUIT 034 /* sig quit FS */ X#define DEFPAGE 80 /* default terminal width */ X#define DEFLENGTH 24 /* default number of lines on screen */ X X/* #define VAX_ASSEM */ /* if you want to use assembler in various routines*/ X /* this only works for the vax */ X X/* #define NOEDIT /* define if don't want editing ever ! */ X /* NB basic -e will still turn on editing */ X /* basic -x will still turn off editing */ X X/* #define LKEYWORDS /* define this if you want to have variable names which*/ X /* contain commands this is like the later versions of */ X /* microsoft but not like the orignal version */ X /* it wastes more space since you have to have some */ X /* spaces in to distinguish keywords */ X X/* #define RENUMB /* define if you want to put the code for renumbering */ X /* in. It works but is very wasteful of space. If you */ X /* are short of space then don't use it. */ X X/* #define LNAMES /* define if you want long variables names. This only */ X /* slows it down by a small fraction */ X X/* #define _BLOCKED /* This is a switch to allow block mode files */ X /* don't define it here look below for where it is done*/ X /* in the file handling bits */ X X/* #define BSD42 /* if useing a 4.2 system */ X X/* #define SCOMMS /* to allow shortened command names e.g. l. -> list */ X /* this might cause some problems with overwriting of */ X /* core but I think they have all been solved */ X/* #define VFORK /* if your system supports vfork() */ End of pyramid/conf.h chmod u=rw-,g=r,o=r pyramid/conf.h echo x - pyramid/term.c 1>&2 sed 's/^X//' > pyramid/term.c << 'End of pyramid/term.c' X/* X * BASIC by Phil Cockcroft X */ X/* X * machine dependent terminal info X */ X X#include "pyramid/conf.h" X#include X X#ifndef SCOPE X#define SCOPE 0 X#endif X Xstruct sgttyb nsttyb, osttyb; Xstruct tchars ntchr,otchr; X#ifdef UCB_NTTY Xstruct ltchars nltchr,oltchr; X#endif X Xextern int ter_width; Xextern char noedit; X Xstatic int got_mode; X Xsetu_term() X{ X register i; X char *p, *getenv(); X X ioctl(0,TIOCGETP,&osttyb); X ioctl(0,TIOCGETC,&otchr); X nsttyb = osttyb; X ntchr = otchr; X#ifdef TIOCSLPN X osttyb.sg_length = DEFLENGTH; X nsttyb.sg_length = 0; X if(ter_width <= 0) X ter_width = osttyb.sg_width & 0377; X osttyb.sg_width = DEFPAGE; X nsttyb.sg_width = 0; X#endif X ntchr.t_brkc = -1; X ntchr.t_eofc = -1; X ntchr.t_intrc = CTRLINT; X ntchr.t_quitc = CTRLQUIT; X if( (p = getenv("TERM")) && strcmp(p, "ucl7009") == 0){ X ntchr.t_startc = -1; X ntchr.t_stopc = -1; X } X i = osttyb.sg_flags & ( LCASE | XTABS); X nsttyb.sg_flags = CBREAK | ANYP | i; X osttyb.sg_flags = ECHO | ANYP | CRMOD | SCOPE | i; X#ifdef UCB_NTTY X ioctl(0,TIOCGLTC,&oltchr); X nltchr = oltchr; /* is this needed ?? */ X nltchr.t_suspc = -1; X nltchr.t_dsuspc = -1; X nltchr.t_rprntc = -1; X nltchr.t_flushc = -1; X nltchr.t_werasc = -1; X nltchr.t_lnextc = -1; X#endif X if(ter_width <= 0) X ter_width=DEFPAGE; X got_mode = 1; X} X Xset_term() X{ X if(noedit || !got_mode) X return; X ioctl(0,TIOCSETN,&nsttyb); X ioctl(0,TIOCSETC,&ntchr); X#ifdef UCB_NTTY X ioctl(0,TIOCSLTC,&nltchr); X#endif X} X Xrset_term(type) X{ X X if(noedit || !got_mode) X return; X#ifdef TIOCSLPN X if(type) X osttyb.sg_width = ter_width; X#endif X ioctl(0,TIOCSETN,&osttyb); X ioctl(0,TIOCSETC,&otchr); X#ifdef UCB_NTTY X ioctl(0,TIOCSLTC,&oltchr); X#endif X} End of pyramid/term.c chmod u=rw-,g=r,o=r pyramid/term.c echo x - vax/Makefile 1>&2 sed 's/^X//' > vax/Makefile << 'End of vax/Makefile' X# Makefile for a vax X X# which cursor file we want. X# can be ucl or ukc XCURSOR = ucl X Xbasic: as.o bas1.o bas2.o bas3.o bas4.o bas5.o bas6.o bas7.o bas8.o \ X bas9.o cursor.o termcap.o assist.o term.o X cc -O as.o bas1.o bas2.o bas3.o bas4.o bas5.o bas6.o bas7.o \ X bas8.o bas9.o cursor.o termcap.o assist.o term.o -lm -ltermcap -o basic X Xclean: X rm -f *.o *.s cursor.c term.c X Xassist.o: bas.h assist.c X cc -O -c assist.c X Xtermcap.o: bas.h termcap.c cursor.c X cc -O -c termcap.c X Xcursor.c: cursor/cursor.c.${CURSOR} X cp cursor/cursor.c.${CURSOR} cursor.c X Xcursor.o: cursor.c X cc -O -c cursor.c X Xterm.o: term.c X cc -O -c term.c X Xterm.c: vax/term.c vax/conf.h X cp vax/term.c term.c X Xas.o: vax/as.s X cp vax/as.s as.s X cc -O -c as.s X rm as.s X X.c.o: X cc -O -S -DBSD42 $*.c X sed -f vax/asm.sed <$*.s | as -o $*.o X rm -f $*.s X Xbas.h: vax/conf.h X Xbas1.o: bas1.c bas.h Xbas2.o: bas2.c bas.h Xbas3.o: bas3.c bas.h Xbas4.o: bas4.c bas.h Xbas5.o: bas5.c bas.h Xbas6.o: bas6.c bas.h Xbas7.o: bas7.c bas.h Xbas7.c: cursor.c Xbas8.o: bas8.c bas.h Xbas9.o: bas9.c bas.h End of vax/Makefile chmod u=rw-,g=r,o=r vax/Makefile echo x - vax/as.s 1>&2 sed 's/^X//' > vax/as.s << 'End of vax/as.s' X .text X .align 1 X .globl _Getch X_Getch: X movl _point,r0 XL190: X cmpb (r0)+,$32 X beql L190 X movl r0,_point X movzbl -(r0),r0 X rsb X X .globl _Check X_Check: X movl _point,r1 XL197: X cmpb (r1)+,$32 X beql L197 X movzbl -(r1),r0 X beql L198 X cmpb r0,$58 X beql L198 X cmpl r0,$233 # ELSE = 0351 X bneq L199 X tstb _elsecount X beql L199 XL198: X movl r1,_point X rsb XL199: X pushl $1 X calls $1,_error X # no return since _error does not return X X .globl __cleanup X .globl __exit X__cleanup: X pushl $0 X calls $1,__exit X ret End of vax/as.s chmod u=rw-,g=r,o=r vax/as.s echo x - vax/asm.sed 1>&2 sed 's/^X//' > vax/asm.sed << 'End of vax/asm.sed' Xs/calls $0,_getch$/jsb _Getch/ Xs/calls $0,_check$/jsb _Check/ Xs/calls r[0-9]*,_getch$/jsb _Getch/ Xs/calls r[0-9]*,_check$/jsb _Check/ End of vax/asm.sed chmod u=rw-,g=r,o=r vax/asm.sed echo x - vax/conf.h 1>&2 sed 's/^X//' > vax/conf.h << 'End of vax/conf.h' X/* X * BASIC by Phil Cockcroft X */ X/* X * configuration file for vax systems (BSD unix only) X */ X X/* X * memory sizes. X */ X X#define MAXMEM (memp)1000000 /* max amount of memory */ X#define MEMINC 8191 /* sizeof memory increments -1 */ X X/* X * various options X */ X X#define V7 /* must be defined */ X#define BERK /* must be defined */ X#define UCB_NTTY /* must be defined */ X#define LKEYWORDS X#define LNAMES X#define RENUMB X#define SCOMMS X#define VFORK X#define VAX_ASSEM X#define BLOCKSIZ 1024 X X/* X * terminal dependent stuff X */ X X#define CTRLINT 03 /* sig int control c */ X#define CTRLQUIT 034 /* sig quit FS */ X#define DEFPAGE 80 /* default terminal width */ X#define DEFLENGTH 24 /* default number of lines on screen */ X X/* #define VAX_ASSEM */ /* if you want to use assembler in various routines*/ X /* this only works for the vax */ X X/* #define NOEDIT /* define if don't want editing ever ! */ X /* NB basic -e will still turn on editing */ X /* basic -x will still turn off editing */ X X/* #define LKEYWORDS /* define this if you want to have variable names which*/ X /* contain commands this is like the later versions of */ X /* microsoft but not like the orignal version */ X /* it wastes more space since you have to have some */ X /* spaces in to distinguish keywords */ X X/* #define RENUMB /* define if you want to put the code for renumbering */ X /* in. It works but is very wasteful of space. If you */ X /* are short of space then don't use it. */ X X/* #define LNAMES /* define if you want long variables names. This only */ X /* slows it down by a small fraction */ X X/* #define _BLOCKED /* This is a switch to allow block mode files */ X /* don't define it here look below for where it is done*/ X /* in the file handling bits */ X X/* #define BSD42 /* if useing a 4.2 system */ X X/* #define SCOMMS /* to allow shortened command names e.g. l. -> list */ X /* this might cause some problems with overwriting of */ X /* core but I think they have all been solved */ X/* #define VFORK /* if your system supports vfork() */ End of vax/conf.h chmod u=rw-,g=r,o=r vax/conf.h echo x - vax/term.c 1>&2 sed 's/^X//' > vax/term.c << 'End of vax/term.c' X/* X * BASIC by Phil Cockcroft X */ X/* X * machine dependent terminal info X */ X X#include "vax/conf.h" X#include X X#ifndef SCOPE X#define SCOPE 0 X#endif X Xstruct sgttyb nsttyb, osttyb; Xstruct tchars ntchr,otchr; X#ifdef UCB_NTTY Xstruct ltchars nltchr,oltchr; X#endif X Xextern int ter_width; Xextern char noedit; X Xstatic int got_mode; X Xsetu_term() X{ X register i; X char *p, *getenv(); X X ioctl(0,TIOCGETP,&osttyb); X ioctl(0,TIOCGETC,&otchr); X nsttyb = osttyb; X ntchr = otchr; X#ifdef TIOCSLPN X osttyb.sg_length = DEFLENGTH; X nsttyb.sg_length = 0; X if(ter_width <= 0) X ter_width = osttyb.sg_width & 0377; X osttyb.sg_width = DEFPAGE; X nsttyb.sg_width = 0; X#endif X ntchr.t_brkc = -1; X ntchr.t_eofc = -1; X ntchr.t_intrc = CTRLINT; X ntchr.t_quitc = CTRLQUIT; X if( (p = getenv("TERM")) && strcmp(p, "ucl7009") == 0){ X ntchr.t_startc = -1; X ntchr.t_stopc = -1; X } X i = osttyb.sg_flags & ( LCASE | XTABS); X nsttyb.sg_flags = CBREAK | ANYP | i; X osttyb.sg_flags = ECHO | ANYP | CRMOD | SCOPE | i; X#ifdef UCB_NTTY X ioctl(0,TIOCGLTC,&oltchr); X nltchr = oltchr; /* is this needed ?? */ X nltchr.t_suspc = -1; X nltchr.t_dsuspc = -1; X nltchr.t_rprntc = -1; X nltchr.t_flushc = -1; X nltchr.t_werasc = -1; X nltchr.t_lnextc = -1; X#endif X if(ter_width <= 0) X ter_width=DEFPAGE; X got_mode = 1; X} X Xset_term() X{ X if(noedit || !got_mode) X return; X ioctl(0,TIOCSETN,&nsttyb); X ioctl(0,TIOCSETC,&ntchr); X#ifdef UCB_NTTY X ioctl(0,TIOCSLTC,&nltchr); X#endif X} X Xrset_term(type) X{ X X if(noedit || !got_mode) X return; X#ifdef TIOCSLPN X if(type) X osttyb.sg_width = ter_width; X#endif X ioctl(0,TIOCSETN,&osttyb); X ioctl(0,TIOCSETC,&otchr); X#ifdef UCB_NTTY X ioctl(0,TIOCSLTC,&oltchr); X#endif X} End of vax/term.c chmod u=rw-,g=r,o=r vax/term.c