File: FOCN.PA of Tape: Sources/Focal/s6
(Source file text) 

/OS8-FOCAL FOR 8EE/12K

XLIST
/&0

IFNDEF FOCLST <FOCLST=1>
IFNDEF FLTLST <FLTLST=1>
IFNDEF LIBLST <LIBLST=1>
IFNDEF TXTLST <TXTLST=1>

IFNZRO FOCLST+FLTLST <FFNASS=0>
IFZERO FOCLST+FLTLST <FFNASS=1>

IFNZRO LIBLST+TXTLST <LTNASS=0>
IFZERO LIBLST+TXTLST <LTNASS=1>

/PSEUDO FLOATING POINT INSTRUCTIONS

FIXMRI FGET=0000
FIXMRI FADD=1000
FIXMRI FSUB=2000
FIXMRI FDIV=3000
FIXMRI FMUL=4000
FIXMRI FPOW=5000
FIXMRI FPUT=6000

FNOR=7000
FINT=JMS I 7
FENT=JMS I 7
FEXT=0
FXIT=0
/&1A

/SYSTEM INSTRUCTIONS (NOT LISTED)

/PERMANENT SYMBOLS FOR PAL8

/PDP8/E-SYMBOLS
BSW=7002
MQL=7421
MQA=7501
SWP=7521
CAM=7621
SKON=6000
SRQ=6003
GTF=6004
RTF=6005
SGT=6006
CAF=6007
CINT=6204
SINT=6254
CUF=6264
SUF=6274

/VARIOUS 8E OR NEW INSTRUCTIONS
KCF=6030
KIE=6035
TFL=6040
TSK=6045
RPE=6010
RIE=6013	/S/CL ERR. INT. (READER)
RCR=6015	/CLEAR READER/PUNCH ERROR
RSE=6017	/SKIP ERROR READER
PCE=6020
PIE=6023	/S/CL ERR. INT. (PUNCH)
PSK=6025	/SKIP ON READER OR PUNCH FLAG
PSE=6027	/SKIP ERROR PUNCH

/KE8-E (EAE)-SYMBOLS
SWAB=7431
SWBA=7447
SKB=7671
SCA=7441
SCL=7403
MUY=7405
DVI=7407
NMI=7411
SHL=7413
ASR=7415
LSR=7417
ASC=7403
SAM=7457
DAD=7443
DLD=7663
DST=7445
DPIC=7573
DCM=7575
DPSZ=7451

FIXTAB
/&1B

/DEFINITIONS FOR LIB AND TXT IF NEEDED

IFNZRO LTNASS <
LOWOUT=0
LOWIN=0
ERROL=0
XCOM=2200
LINE1=224
PC0=200
PDLXR=11
LINE0=210
PSHFRS=14
LIBFIL=107
ZPOPA=21
ZPOPF=115
ZPOPJ=153
ZPUSHA=25
ZPUSHF=72
ZPUSHJ=132
NOCHAR=262
ICHAR=447
FILEST=540
LOWLIB=1400
XABS=751
XSGN=740
>

IFNZRO FOCLST <XLIST>

IFZERO FFNASS <
EJECT OS-8 FOCAL INTERPRETER

/&2

FIELD 1

/MISCELLANEOUS ITEMS
*0
ECHO,	1
TABC,	0		/TABCOUNTER
SPC,	240		/CONSTANT
ATSW,	0
	0
	0		/FOR OD
	0
T=20			/TEXT FIELD NO.
P=10			/PROGRAM FIELD NO.
L=00			/LIBRARY FIELD NO.
V=10			/VARIABLE FIELD NO.
	FPNT		/ADRESS OF FLOATING POINT(LOC*7)

/AUTO INDEX REGISTERS

AXIN,	0		/STORAGE INDEX(LOC*10)
XRT,	0		/EXTRA XR
XRT2,	0		/EXTRA XR
MCOMA,	-254		/LET'S HOPE IT IS NOT INDIRECTLY ADRESSED!
FLTXR,	0		/XR FOR FLOATING POINT
FLTXR2,	0		/EXTRA FOR F.P.
MINUSA,	-"A		/CONSTANT

TEXTP=. /TEXT POINTERS(LOC*17)
AXOUT,	LINE1+13		/OUTPUT INDEX
XCT,	7777		/UNPACK SWITCH;THESE 4 ARE PUSHED
GTEM,	0		/UNPACK STORAGE
PC,	PC0		/PROGRAM COUNTER

THISLN,	0		/LINE POINTER FROM 'FINDLN'
THISOP,	0		/CURRENT 'EVAL' OPERATION
LASTLN,	0		/BACK POINTER FROM 'FINDLN'
DEBGSW,	1		/DEBUG SWITCH;NON ZERO FOR LITERAL
PACKST,	0		/RUBOUT PROTECTION
PT1,	0		/VARIABLE POINTER
LASTV,	STVAR		/ADRESS OF LAST VARIABLE
T1,	0		/TEMP. REGISTER - MAIN
T2,	0		/TEMP FOR NEW INSTR.
T3,	0		/TEMP. REGISTER FOR OUTPUT
INSUB,	0		/0=GETC;#0=READC
C200,	200		/CONSTANT
P177,	177		/STEP MASK;DON'T MOVE;AND P177=37!!
/&3

*40	/FLOATING POINT

EX1,	0		/OPERAND STORAGE
AC1H,	0
AC1L,	0
OVER1,	0

FLAC=.  /FLOATING ACCUMULATOR
EXP,	0
HORD,	0
LORD,	0
OVER2,	0

SIGNF,	0		/FLOATING SIGN

MINSKI,	ACMINS		/NEGATE FLAC SUBROUTINE
FISW,	0000		/OUTPUT FORMAT
INTEGE,	FIX		/FIX FLAC

*54	/VARIABLES - INITIALIZED FOR THE DIALOGUE

CELSO=.			/ECALL PUSHES THESE FOUR
POPFP,	CIF CDF P	/+ECALL=15 BIT POPJ
EFOP,	0		/FUNCTION CODE
LASTOP,	0		/LAST OPERATION FOR EVAL
SORTCN,	0		/NUMBER IN TABLE FROM SORTC

BUFR,	LINE1+11	/NEXT LOC. IN BUFFER=LAST LOC. IN TEXT

ADD,	4300		/CHAR. BUF. IN
XCTIN,	0000		/PACK SWITCH
OUTDEV,	LOWOUT		/POINTER TO OUT. SUB.
INDEV,	LOWIN		/POINTER TO IN. SUB.

NAGSW,	0001		/4000=ONE;1=ALL;0=GROUP;ALSO PUSHED
CHAR,	215		/THE MOST IMPORTANT REGISTER
LINENO,	0000		/LINE NUMBER READ BY GETLN
GINC,	WORDS+2		/=6 FOR 4-WORD-CONSTANT

LIST6=.		/INPUT LIST FOR "SFOUND"
	214		/F.F. (^L)
	207		/BELL
LIST7=.
P337,	337		/LEFT ARROW
CLF,	212		/L.F.
LIST3=.		/EXCRETION LIST
CCR,	215		/LIST BRANCHER
DMPSW,	HLT		/(SEARCH CHAR)-VARIABLE
/=0000 FOR TRACE ON
P7600,	7600		/ENDS LISTS
P77,	77		/DON'T MOVE;AND P77=100!!!
/&4

/CONSTANTS

P13,	13		/USEFUL CONSTANT
PER,	256		/PERIOD
M77,	-77		/EXTEND CODE TEST
P17,	17		/BCD MASK
P277,	277		/"?"
M2,	-2		/CONSTANT
ERROR2=JMS I .		/FIELD 1 ERROR ADRESS
	ERROR		/KEEP IT AT LOC. 107;SAME ADRESS IN USR;VOL!!
C260,	260		/ASCII FOR ZERO
MPER,	-256		/PERIOD TEST
MCR,	-215		/C.R. TEST
M5,	-5		/PAREN TEST
M11,	-11		/PAREN TEST
FSIZE,	12
DECP,	0
DIGITS,	12
MFLT,	-WORDS		/=-4 FOR 4-WORD

/POINTERS ETC.

SUBS,	0		/VARIABLE SUBSCRIPT
CNTR,	-40		/DELETE AND ERROR CNTR;ALSO FP.
PAXPNT,	PDLXR		/POINTER FOR RESET
FLARGP,	FLARG		/DATA ADRESS
CFRSX,	FLTZER		/POINTER TO ZERO DATA &
DOUBLE,	MULT2		/MULTIPLY FLAC BY 2
FOUTPU,	FLOUTP		/FLOATING OUTPUT
FINPUT,	FLINTP		/FLOATING INPUT
CFRS,	LINE0		/ADRESS OF DUMMY LINE
END,	STVAR		/FIRST LOCATION
DECALL,	ECALL		/RECURSIVE EVAL
DPART,	PARTES		/PAREN COMPARE ETC.
ENDT,	LINE1

WORDS=4

/PDL INSTRUCTIONS

POPA=JMS I .		/RESTORE AC
	XPOPA
PUSHJ=JMS I .		/RECURSIVE SUB. CALL
	XPUSHJ
POPJ=JMP I .		/SUB. RETURN
	XPOPJ
PUSHA=JMS I .		/SAVE AC
	XPUSHA
PUSHF=JMS I .		/SAVE GROUP OF DATA
	XPUSHF
POPF=JMS I .		/RESTORE GROUP
	XPOPF
/&5

/NEW INSTRUCTIONS:

STOCHR=JMS I .
	CHRSTO		/STORE A CHARACTER
TSTCHR=JMS I .
	CHRTST		/SKIPS IF CHAR=ARG
GETC=JMS I .		/UNPACK A CHARACTER
	UTRA
PACKC=JMS I .		/PACK A CHARACTER
	PACBUF
SORTJ=JMS I .		/SORT AND BRANCH ON AC OR CHAR
	SORTB
SORTC=JMS I .		/SORT CHAR
	XSORTC
PRINTC=JMS I .		/PRINT AC OR CHAR
	OUT
READC=JMS I .		/READ DATA INTO CHAR AND PRINT IT
	IN
PRNTLN=JMS I .		/PRINT C(LINENO)
	XPRNT
GETLN=JMS I .		/UNPACK AND FORM A LINENUMBER
	XGETLN
FINDLN=JMS I .		/SEARCH FOR A GIVEN LINE
	XFIND
SPNOR=JMS I .		/IGNORE SPACES AND LEADING ZEROS
	XSPNOR
TESTN=JMS I .		/PERIOD;OTHER;NUMBER
	XTESTN
TSTLPR=JMS I .		/SKIP IF 5.L.SORTCN.L.E.11(I.E. AN L-PAR)
	LPRTST
TSTGRP=JMS I .		/SKIP IF G(AC)=G(LINENO)
	GRPTST
TESTC=JMS I .		/TERM;NUMBER;FUNCTION;LETTER- AND IGNORE SPACES
	XTESTC
DELETE=JMS I .		/REMOVE OLD TEXT LINE
	XDELETE
/VARIOUS NEW POINTERS ETC.

DPC,	PCD		/PC
DTHIS,	THISD		/THISLN
DPT1,	PT1D		/PT1
DXRT,	XRTD		/(TAD I XRT)
DAXIN,	AXIND		/(DCA I AXIN)
SECRTV,	STSECR		/FOR SECRET VARIABLES
/&6

/FOCAL'S COMMAND/INPUT DRIVER

*177
START,	START1		/PROGRAM START FROM SELF (INDIRECT)
START1,	TAD C200
	DCA PC		/FOR COMMAND MODE
	IAC		/USE ONE IN THE AC TO
	DCA DMPSW	/INIT UNPACK AND TRACE SWITCH
	DCA DEBGSW	/ENABLE TRACE FOR INPUT OF (?)
	TAD HPDL	/SET HIGH LIMIT FOR PDL
	CDF T
	DCA I PAXPNT
	CDF P
	DCA ECHO	/PRINT ONLY IF ECHO
	TAD CNUM	/ANNOUNCE PRESENCE WITH #
	PRINTC
	ISZ ECHO
IBAR,	TAD BUFR	/COMMAND INPUT BUFFER
	DCA AXIN 	/FOR UNPACKING
	DCA XCTIN
	TAD BUFR	/RUBOUT PROTECTION
	DCA PACKST
IGNOR,	READC		/READ COMMAND STRING
	SORTJ
		LIST7-1
		INLIST-LIST7
	PACKC		/SAVE STRING CHARACTER
	JMP IGNOR

CNUM,	"#		/ACKNOWLEDGE CHARACTER
HPDL,	7545
LPDL,	7505

INPUTX,	PUSHJ		/PROCESS IMMEDIATE COMMAND
		PROC
	JMS I DPC	/TAD I PC
	SNA		/END OF PROGRM?
	JMP I START	/YES
	DCA PC		/SAVE NEW LINE NO
	TAD PC		/START NEW LINE
	IAC
	JMP GONE	/PROCESS OTHER COMMANDS

/TEXT LINE BUFFER FORMAT
/#1 : POINTER OR ZERO IN LAST
/#2 : LINENO
/#3 - #N+1 : TEXT
/#N : C.R.
/&7

/LINE NUMBER FORMATION;RANGE OF ACCEPTIBLE LINE NUMBERS
			/=1.01 TO 31.99
XGETLN,	0		/COMPUTED LINE #'S
	SPNOR		/IGNORE SPACES
	TSTCHR		/'A' IS SPECIAL
	-"A
	SKP
	JMP TESTA
	PUSHJ		/EVALUATE NUMBER OR EXPRESSION
		EVAL
	JMS I INTEGER	/GET GROUP PART
	TAD P7740	/CHECK IF TOO BIG
	SMA CLA
GZERR,	ERROR2		/BAD GROUP #
		206	/IG
	TAD LORD	/GET GROUP AGAIN
	BSW
	CLL RAL
	DCA LINENO	/SAVE IT
	JMS I MINSKI
	NOP		/CDF V AFTER FENT
	FENT
	FADD I FLARGP	/GET FRACTION
	FMUL FL100
	FADD FLP5	/ROUND UP
	FEXT
	JMS I INTEGER
	TAD LINENO	/ADD GROUP
TESTA,	DCA LINENO
	CLA CLL
	TAD LINENO	/CHECK FOR ERROR
	AND P7600
	SZA CLA
	CML
	TAD LINENO
	AND P177
	SNL SZA
	JMP GZERR	/ILLEGAL GROUP ZERO USAGE
P7740,	SMA SZA CLA	/SMA FOR 7740
	TAD P2000	/SET NAGSW;GROUP=0,LINE=4000,ALL=1
	CML RAL
	DCA NAGSW
	JMP I XGETLN
FL100,	0007
	3100
	0000
FLP5,	0000
P2000,	2000
	0000
	0000
/&8

/COMMAND/INPUT PROCESSOR

IRETN,	PACKC		/START TO PACK C.R.
	PACKC		/FINISH C.R.
	TAD BUFR	/INITIALIZE FOR UNPACKING
GONE,	DCA AXOUT	/SETUP CURRENT LINE
	DCA XCT	
	GETC		/READ FIRST CHARACTER
	TAD LPDL	/SET LOW LIMIT FOR PDL
	CDF T
	DCA I PAXPNT
	CDF P
	SPNOR		/IGNOR LEADING BLANKC
	TESTN		/DOES THE LINE BEGIN WITH 1-9?
	JMP GZERR	/PERIOD =ILLEGAL GROUP ZERO USAGE
	JMP INPUTX	/NO
	ISZ DEBGSW	/YES, DISABLE TRACE FOR REPACKING
	GETLN		/READ THIS LINE NUMBER
	CLA CLL CML RAR	/TEST FOR SINGLE LINE
	TAD NAGSW	
	SZA CLA
	ERROR2		/ILLEGAL LINE NUMBER ON INPUT
		213	/IL
	TAD BUFR	/SET POINTERS
	DCA AXIN	
	DCA XCTIN
	TAD LINENO	/SAVE LINE #
	JMS I DAXIN	/DCA I AXIN
	SPNOR		/IGNORE SPACES AFTER LINE NUMBER
	SKP
	GETC		/READ 1ST AFTER LINENO TERMINATOR
SRETN,	PACKC		/SAVE TEXT AND RESTORE DATA FIELD
	TSTCHR		/TEST FOR END OF INPUT STRING
	-215		/-C.R.
	JMP .-4
	DELETE		/REMOVE OLD LINE, IF ANY
	CDF T		/TERMINATE THE BUFFER LINE:OLD "ENDLN"
	TAD I LASTLN
	DCA I BUFR
	TAD BUFR	/POINT TO NEW NEXT LINE
	DCA I LASTLN
	TAD ADD		/CHECK FOR EXTRA INFO.
	SZA
	DCA I AXIN
	TAD AXIN	/COMPUTE NEW END OF BUFFER
	IAC
	DCA BUFR
GOKILL,	CDF L
	DCA I LIBN	/WE'VE CHANGED SOMETHING
	CDF P
	JMP I START	/POINTERS MUST BE REINITIALIZED
LIBN,	LIBFIL
/&9

/PUSHDOWN LIST SATELLITES

FLD1=CLA CLL IAC

XPOPA,	0
	MQL
	FLD1
	CIF T
	JMS I .+1
		ZPOPA

XPUSHA,	0
	MQL
	FLD1
	CIF T
	JMS I .+1
		ZPUSHA

XPUSHF,	0
	MQL
	FLD1
	CIF T
	JMS I .+1
		ZPUSHF

XPOPF,	0
	MQL
	FLD1
	CIF T
	JMS I .+1
		ZPOPF

XPUSHJ,	0
	MQL
	FLD1
	CIF T
	JMS I .+1
		ZPUSHJ

XPOPJ,	CIF CDF T
	JMP I .+1
		ZPOPJ
/&10

/RECURSIVE OPERATE, EXECUTE, OR CALL

DO,	GETLN		/EXECUTE ONE LUNE, A GROUP, OR ALL
	PUSHF		/SAVE REST OF THIS LINE
		TEXTP	/ADDRESS OF TEXT POINTERS
DGRP,	PUSHF		/SAVE NAGSW; CHAR; AND LINENO
		NAGSW
	TAD NAGSW	/CHECK DATA FROM GETLN
	SPA CLA		/SKIP IF GROUP OR ALL
	JMP DOONE	/DO ONE LINE
	FINDLN		/INIT FOR GROUP AND SET THISLN
	NOP
	TAD THISLN	/TEST FOR GOOD GROUP NUMBER
	DCA XRT
	JMS I DXRT	/TAD I XRT
	TSTGRP
	ERROR2		/NO SUCH GROUP NUMBER
		66	/DG
DGRP1,	PUSHJ		/EXECUTE OBJECT LINE AND SET PC
		PROCESS-2
	POPF		/RESTORE THE DATA
		NAGSW
	JMS I DPC	/CHECK FOR END OF TEXT
	SNA
	JMP DCONT	/ALL DONE
	IAC
	DCA PT1		/SAVE POINTER TO LINENO
	TAD NAGSW	/CHECK FOR GROUP
	SMA SZA CLA	
	JMP .+4		/DO ALL
	JMS I DPT1	/TEST GROUP
	TSTGRP
	JMP DCONT	/NOT IN GROUP
	JMS I DPT1	/READ NEXT LINE NO
	DCA LINENO
	JMP DGRP	/CONTINUE THE SUBROUTINE

DOONE,	FINDLN		/FIND THE LINE
	ERROR2		/NO SUCH LINE NUMBER
		73	/DL
	PUSHJ		/EXECUTE IT
		PROCESS
	POPF		/RESTORE CHAR
		NAGSW
DCONT, 	POPF		/RESTORE TEXT POINTERS
		TEXTP
	JMP I .+1	/CONTINUE PROCESSING THIS LINE
		PROC
/&11

IN,	0	/READ IN A CHARACTER SUBROUTINE."READC"
	DCA INCOMP	/IF AC # 0 THEN KEEP CHAR TO COMPARE
	CIF CDF L
	JMS I INDEV
	STOCHR
	TAD CHAR
	CIA		/NOW COMPARE
	TAD INCOMP
	SNA CLA
	POPJ		/FOUND IT;EXIT FROM 'FIND'
	SORTC
		ECHOLST-1	/LF. OR RUB.?
	JMP I IN	/YES;IGNORE
	DCA ECHO	/ECHO IF ECHO
	PRINTC
	ISZ ECHO
	JMP I IN

FIND,	JMS I INTEGE	/GET VALUE OF SEARCH CHAR.
	READC		/PASS IT ON TO 'IN'
	JMP .-1		/LOOP;'IN' WILL GIVE 'POPJ'
INCOMP,	0

CHRTST,	0	/TEST CHAR SUB; "TSTCHR"
	TAD I CHRTST	/GET ARG
	ISZ CHRTST	/BUMP PAST ARG
	TAD CHAR
	SNA CLA
	ISZ CHRTST	/SKIP IF EQUAL
	JMP I CHRTST

PCD,	0
	CDF T
	TAD I PC
	CDF P
	JMP I PCD

TERMER,	SORTC
		GLIST-1
	IAC
	POPJ

MMINSK,	JMS I MINSKI
	POPJ
/&12

INLIST=.	/INPUT CONTROL CHARACTERS
	IBAR		/B.A. = RESTART
	IGNOR		/L.F. = IGNORE
	IRETN		/C.R. = TERMINATE STRING

FLIST2,	FLIMIT		/,=STANDARD
	FINFIN		/;=SHORT
	FLIMIT-1		/CR=DUMB

FLIST1,	FINCR		/,=STANDARD FORMAT
	PROCESS		/;=SET;PLUS,..
	PC1		/C.R.=SET COMMAND

/PRIMARY CONTROL AND TRANSFER

GOTO,	GETLN		/READ THE LINE NUMBER REQUESTE
	FINDLN		/LOCATE IT AND RESET TEXTP
	ERROR2		/NOT THERE
		156	/GO
	TAD THISLN	/SET PC;DON'T MOVE ;REF. "DO"
	DCA PC
PROCESS,GETC		/TEST FOR END OF LINE
PROC,	TSTCHR		/FIRST CHARACTER READY = USE PROC
	-215		/C.R.
	SKP
PC1,	POPJ		/EXIT "PROCESS"
	SORTC		/IGNORE "SPACE",",", AND ";"
		GLIST-1
	JMP PROCESS
	TAD CHAR	/SAVE COMMAND CHARACTER
	AND P337	/EXECUTE LOWER CASE ALSO
	PUSHA
	GETC		/GO TO TERMINATOR
	SORTC
		GLIST-1
	SKP
	JMP .-4
	POPA
	SORTJ		/GO DO COMMAND
		COMLST-1
		COMGO-COMLST
	ERROR2		/ILLEGAL COMMAND
		202	/IC

COMMENTS=PC1	/ALSO IS CONTINUE
/&13

/OUTPUT COMMAND TEXT

WRITE,	GETLN		/SET LINENO
	ISZ DEBGSW	/DISABLE TRACE
	FINDLN		/SEARCG FOR LINE NUMBER
	JMP WTESTG	/NOT THERE OR GROUP
	TAD LINENO
	SZA CLA
	PRNTLN		/PRINT LINE NUMBER AND A SPACE
	GETC
	PRINTC		/PRINT TEXT OF A LINE
	TSTCHR
	-215		/C.R.
	JMP .-4
	JMS I DTHIS	/TEST FOR END OF TEXT
WTEST2,	SNA
	JMP WX-2	/EXIT;DO NEXT INDIRECT LINE
	IAC
	DCA PT1		/SAVE POINTER TO LINENO OF NEXT
	TAD NAGSW
	SMA CLA
	JMS I DPT1	
	TSTGRP		/TRY NEXT LINENO FOR GROUP
	JMP WX
WALL,	JMS I DPT1	/SET LINENO
	DCA LINENO
	JMP WRITE+2

WTESTG,	TAD THISLN	/INIT GROUP PRINTOUT
	JMP WTEST2

	DCA DEBGSW
	POPJ
WX,	TAD NAGSW
	SPA SNA CLA	/SKIP IF ALL
	JMP WX-2
	PRINTC		/PRINT C.R. AGAIN
	JMP WALL
/&14

XTESTC,	0	/TEST THE NATURE OF THE NEXT ALPHANUMERIC - "TESTC"
	SPNOR		/IGNORE SPACES
	SORTC		/TEST THE VARIABLE TERMINATORS
		TERMS-1
	JMP I XTESTC	/YES - SORTCN IS SET
	ISZ XTESTC	/NO
	TESTN
	JMP I XTESTC	/.
	SKP		/OTHER
	JMP I XTESTC	/NUMBER
	TSTCHR
	-"F		/SKIP IF 'F'
	ISZ XTESTC
	ISZ XTESTC	/RETURNS:T;N;F;A
	JMP I XTESTC

XSORTC,	0	/SORT CHAR OR AC AGAINST TABLE - "SORIC"
	SNA		/AC?
	TAD CHAR	/NO.TAKE CHAR
	DCA T2		/STORE IN TEMP
	TAD I XSORTC
	DCA XRT2	/1ST ARG IS LIST-1
	TAD I XRT2
	SPA		/LIST IS ENDED BY A NEGATIVE NUMBER
	JMP SEXC	/2AND EXIT = NOT IN LIST
	CIA
	TAD T2
	SZA CLA		/COMPARE
	JMP .-6
	TAD I XSORTC	/COMPUTE INCREMENT : 0 - N
	CMA
	TAD XRT2
	DCA SORTCN
	SKP		/1ST EXIT = YES
SEXC,	ISZ XSORTC
	ISZ XSORTC
	CLA
	JMP I XSORTC
/&15

GRPTST,	0	/AC VS LINENO - "TSTGRP"
	AND P7600
	CIA
	DCA T2
	TAD LINENO
	AND P7600
	TAD T2
	SNA CLA
	ISZ GRPTST
	JMP I GRPTST
/INPUT FROM TEXT OR KEYBOARD;
/IF BACK-ARROW, RESTART INPUT

INPUT,	0		/INPUT A CHARACTER
	TAD INSUB	/NON/ZERO FOR KEYBOARD
	SZA CLA
	JMP .+3
	GETC
	JMP I INPUT
	READC
	SORTJ
		SPECIAL-1
		INFIX-SPECIAL
	JMP I INPUT

ILIST,	IF1		/,
	PROCESS		/;
	PC1		/CR

COMLST=.		/COMMAND DECODING LIST
	"S	/SET
	"F	/FOR
	"I	/IF
	"D	/DO
	"G	/GOTO
	"C	/COMMENT
	"A	/ASK
	"T	/TYPE
	"L	/LIBRARY
	"E	/ERASE
	"W	/WRITE
	"M	/MODIFY
	"Q	/QUIT
	"R	/RETURN
	"O	/OPEN
	"X	/EXTRA
	"Y	/YELLOW

/THIS COMMAND LIST IS SPEED OPTIMIZED;"TESTC" ENDS IT
/&16

/LOOP CONTROL STATEMENT

SET=.		/SUBSET OF "FOR"
FOR,	PUSHJ		/LOOPS, ETC.
		GETARG	/LOOK FOR "=" NEXT
	SPNOR
	TSTCHR
	-"=
	ERROR2		/LEFT OF "=" IN ERROR:'FOR' OR 'SET'
		324	/LE
	JMS SAVNAM	/SAVE NAME OF VARIABLE
	PUSHJ
		EVAL-1	/GET INITIAL VALUE EXPRESSION
	JMS GETNAM	/ALL THIS FOR ZEROED VARS
	NOP		/EVENTUALLY FCDF V
	FINT		/INITIALIZE NOW
	FGET I FLARGP	/FLAC GETS KILLED BY GETNAM
	FPUT I PT1
	FXIT
	SORTJ		/TEST LAST CHAR FROM "EVAL"
		TLIST-1
		FLIST1-TLIST
	ERROR2		/EXCESS R-PAR
		117	/EP
FINCR,	JMS SAVNAM	/SAVE VARIABLE NAME
	PUSHJ		/EVALUATE THE INCREMENT,IF ANY
		EVAL-1
	SORTJ		/TEST TERMINATORS
		TLIST-1
		FLIST2-TLIST
	ERROR2		/ILLEGAL TERMINATOR IN 'FOR'
		122	/FC=FOR COMMAND
FLIMIT,	CDF V
	PUSHF		/SAVE THE INCREMENT
		FLARG
	PUSHJ		/GET THE LIMIT(NO ERROR DETECTION AFTER LIMIT)
		EVAL-1
FCONT,	CDF V
	PUSHF		/SAVE THE LIMIT
		FLARG
	PUSHF		/SAVE TEXT OF OBJECT STATEMENTS
		TEXTP
	PUSHJ		/DO THE OBJECT STATEMENTS
		PROCESS
	POPF		/RESTORE REMAINING TEXT
		TEXTP
	CDF V
	POPF		/GET LIMIT
		FLARG
	POPF		/GET INCREMENT
		ITER1
	JMS GETNAM	/GET VARIABLE NAME
/&18

	NOP		/FSPA
	NOP		/FSW1
	NOP		/FCDF V;IN AFTER FGET
	FINT		/INCREMENT AND TEST
	FGET I FINKP	/LOAD INCREMENT
	FADD I PT1	/ADD VARIABLE
	FPUT I PT1	/CHANGE IT
	FSUB I FLARGP	/TEST IT
	FXIT
	TAD HORD
	SMA SZA CLA
	POPJ		/END OF LOOP
	JMS SAVNAM	/SAVE NAME
	PUSHF		/SAVE INCREMENT AGAIN
FINKP,		ITER1
	JMP FCONT

FINFIN,	PUSHF		/SET INCREMENT TO ONE
		FLTONE
	JMP FCONT

SAVNAM,	0	/LOCAL SUB TO SAVE NAME AND SUBSCRIPT IN PDL
	TAD SUBS
	PUSHA
	TAD EFOP
	PUSHA
	JMP I SAVNAM

GETNAM,	0	/IDEM FOR GETTING
	POPA
	DCA EFOP
	POPA
	PUSHJ		/PASSES AC
		GS1	/SETS PT1
	JMP I GETNAM

SORTB,	0	/SORT AND BRANCH ROUTINE. - "SORTJ"
	SNA
	TAD CHAR	/ASSUME CHAR IF AC=0
	CIA
	DCA T2		/SAVE SORT ITEM
	TAD I SORTB	/FIRST ARG IS LIST LESS ONE
	ISZ SORTB	/2AND IS INTRA-LIST LENGTH
	DCA XRT2
	TAD I XRT2
	SPA		/**LISTS ENDED BY NEGATIVE NUMBER**
	JMP SEX		/READ EXIT
	TAD T2		/FIND ADRESS
	SZA CLA
	JMP .-5
	TAD XRT2	/MATCH FOUND
	TAD I SORTB
	DCA T2
	TAD I T2
	DCA T2		/DEBUG: AC=ADRESS
	JMP I T2

SEX,	ISZ SORTB	/MATCH NOT FOUND
	CLA CLL
	JMP I SORTB	/RETURN TO CALLING SEQUENCE
/&19

COMGO=.		/COMMAND ROUTINE ADRESSES
	SET
	FOR
	IF
	DO
	GOTO
	COMMENT
	ASK
	TYPE
	LIB
	ERASE
	WRITE
	MODIFY
	START1	/RETURN TO COMMAND MODE VIA 'QUIT'
	RETRN
	FILER	/OPEN
	ERCALL
	ERCALL


/INPUT OUTPUT STATEMENTS

ASK,	CLA CMA		/REMEMBER WHICH CALL
TYPE,	DCA ATSW
TASK,	DCA DEBGSW	/RE-ENABLE THE TRACE
	SORTJ		/SPECIAL CHARACTER?
		ALIST-1
		ATLIST-ALIST
	ISZ ATSW	/TEST QUOTE SWITCH
	JMP TYPE2
	PUSHJ		/DO ASK; SETUP PT1
		GETARG
	TAD CHAR	/SAVE IN LINE CHARACTER
	PUSHA
	DCA ECHO	/ONLY IF ECHO
	TAD DIDO	/RING-A-DING-DONG
	PRINTC
	ISZ ECHO
	ISZ INSUB	/INDICATE 'READC'
	IAC		/POINT PAST CHAR
	JMS I FINPUT	/READ DATA AND SAVE
ENDASK,	POPA		/RETEST LAST TERMINATOR
	STOCHR
	JMP ASK		/CONTINUE PROCESSING

TYPE2,	PUSHJ		/DO TYPE
		EVAL
	JMS I FOUTPUT	/PRINT
	JMP TYPE

ALT,	CLA CMA		/RESET TABC;CODE 376 IS PSEUDO-PRINTING
	TAD TABC
	DCA TABC

ESC,	DCA ECHO	/ONLY IF ECHO
	FINT
	FGET I PT1
	FEXT
	JMS I FOUTPUT	/ECHO CURRENT VALUE OF LITERAL
	ISZ ECHO
	JMP ENDASK

DIDO,	"?
/&20

TQUOT,	ISZ DEBGSW	/DISABLE TRACE
	GETC		/TYPE LITERALS
	SORTJ
		TLIST2-1
		TLIST3-TLIST2
	PRINTC
	JMP TQUOT+1

TINTR,	GETC		/PASS PERCENT SIGN
	TESTC
	JMP FILL	/SHOULD BE '*'
	JMP FORMAT	/NUMBER;NORMAL FORMAT
	TAD SPCMF	/F;RESET ALL
	TAD CHAR	/OTHER;SET LEADING CHAR
	DCA I DPEQ
	SKP
FILL,	TAD STRMSP	/SET "*"
	TAD SPCMZE	/SET SPACE
	DCA I DFILL
	JMP TINTR	/GET NEXT CHAR
SPCMF,	240-"F
STRMSP,	"*-240
SPCMZE,	240-"0
DPEQ,	PEQ
DFILL,	FILLER

FORMAT,	GETLN
	TAD LINENO
	DCA FISW	/SET FLOAT SW.
	TAD LINENO
	AND P7600
	BSW
	CLL RAR
	SNA
	TAD DIGITS	/FLOATING
	DCA FSIZE
	TAD LINENO
	AND P17
	DCA DECP
	TAD FSIZE
	CIA
	TAD DECP
	SMA CLA
	ERROR2		/FORMAT ERROR
		136	/FO
	JMP TASK


TCRLF2,	CLA CLL IAC	/PRINT CR ONLY;I.E.216
TCRLF,	TAD CCR		/EXCLAMATION POINT=CR,LF
	PRINTC
TASK4,	GETC		/MOVE TO NEXT CHAR
	JMP TASK

/IF DEBGSW=0 : ENABLE FLIP-FLOP "DMPSW"
/	#0:DISABLE AND RETURN ALL"?" 'S
/IF DMPSW = 0: TRACE ON, IF ENABLED
/	#0: TRACE OFF
/IF BOTH = 0 : PRINT TRACE
/&23

XTAB,	PUSHJ
		EVAL-1
	FENT
	FADD I TRND	/LET'S ROUND OFF
	FEXT
	JMS I INTEGE
	CIA
	TAD TABC
	IAC
	SMA
	JMP BACK
	DCA CNTR
	TAD SPC
	PRINTC
	ISZ CNTR
	JMP .-3
BACK,	CLA CLL
	JMP TASK
TRND,	FLP5

SRNLST=.	/'MODIFY' CONTROL CHARACTER TABLE
	SCHAR	/F.F. = CONTINUE
	SCONT	/BELL = CHANGE SEARCH CHAR
	SBAR	/B.A. =  RESTART
	SCONT+1	/L.F. = FINISH THE LINE AS BEFORE
LISTGO=.
	IRETN	/C.R. = END THE LINE HERE AS IT IS
	SGOT	/CHAR = SEARCH CHAR


ALIST=.		/ASK/TYPE LIST OF CONTROLS
	"'		/EXTRA
	"&		/EXTRA
	":
	"%
	242	/"
	"!
	"#
	244	//$//
GLIST=.
	240	/SPACE
TLIST=.
	",
	";
	215	/C.R.

MGETC,	GETC
	POPJ
/&24

/FIND OR ENTER A VARIABLE IN THE LIST

GETARG,	TESTC		/FIRST LETTER OF ARG
TLIST2,	0242		/"
	0215		/C.R. - FUNCTION OR NUMBER IS NOT AN ARG.
	ERROR2		/BAD ARGUMENT IN 'FOR','SET',OR 'ASK'
		20	/BA
GETVAR,	DCA XCTIN	/PACK INTO ADD.
	PACKC		/PACK FIRST CHAR
	TAD ADD		/SAVE NAME
	DCA EFOP	/WHERE WE CAN PUSH IT
GETLP,	GETC		/GET NEXT CHAR
	SORTC		/END OF NAME?
		TERMS-1
	JMP GSERCH	/YES
	ISZ XCTIN	/IS THIS THE SECOND CHAR?
	JMP GETLP	/MORE THAN 2 CHARS;IGNORE
	TAD CHAR	/PACK SECOND CHAR
	AND P77		/MASK IT
	JMP GETLP-2	/ADD TO NAME

GSERCH,	TSTLPR		/CHECK FOR SUBSCRIPT
	JMP GS1		/NONE
	JMS I DECALL	/PICK IT UP
	POPA		/RESTORE NAME
	DCA EFOP
	JMS I DPART	/CHECK PAREN MATCH,ETC.
	JMS I INTEGE	/CONVERT TO 12 BIT
GS1,	DCA SUBS	/SAVE SUBSCRIPT
	MQL		/CLEAR LAST ZERO HOLD
	TAD SECRTV	/START SEARCH WITH SECRET
	JMP GSTRT	/GO IN LOOP
GS2,	ISZ XRT		/NAME DID NOT MATCH
GS3,	ISZ XRT		/SUBSCRIPT DID NOT MATCH
	TAD I XRT	/GETS HORD OF VAR.
	SZA CLA		/IS VAR. ZERO?
	JMP .+3		/NO.MUST BE REAL
	TAD PT1		/YES!LET'S STORE ADRESSES
	MQL		/AS WE GO ALONG
	TAD PT1
	TAD GINC	/NEXT

/VARIABLES GET ADDED IN THE FOLLOWING WAY:
/IF ANY ZERO'S AVAILABLE:FROM LASTV DOWNWARDS;BUT NOT SECRET
/IF NO ZERO'S FROM LASTV UPWARDS;THEN BLOW-UP
/&25

GSTRT,	DCA PT1		/FIRST OR NEXT POINTER
	TAD LASTV	/CHECK FOR END OF
	CIA CLL		/EXISTING VARS.
	TAD PT1
	SZL CLA
	JMP MAKVAR	/VAR. NOT IN LIST;CREATE NEW ONE
	TAD PT1		/REPLICATE SO PT1 STAYS
	DCA XRT		/AT START OF VAR.
	CDF V		/VARIABLE FIELD
	TAD I PT1	/NAME
	CIA
	TAD EFOP	/ASKED NAME
	SZA CLA		/CHECK?
	JMP GS2		/NO
	TAD I XRT	/OK.WHAT ABOUT SUBS.?
	CIA
	TAD SUBS
	SZA CLA
	JMP GS3		/ALMOST!
	ISZ PT1		/FOUND IT!!
	ISZ PT1		/POINT TO DATA
	POPJ

MAKVAR,	MQA		/GET OUT LAST ZERO ADRESS
	SNA		/ANY ZERO'S?
	JMP TOPVAR	/NO.PUT IT ON TOP
	CIA		/CHECK FOR SECRET VARS.
	TAD END		/STVAR
	SNL SZA CLA
	JMP TOPVAR	/IT WAS SECRET;ON TOP
	MQA		/OK.USE ZERO VAR.
	DCA PT1		/RESET PT1
	JMP VAREX
/&26

TOPVAR,	TAD VARTOP	/CHECK FOR TOP
	CIA CLL
	TAD LASTV
	SZL CLA
	ERROR2		/REALLY NO MORE SPACE!
		265	/LF=LITERALS FULL
	TAD LASTV	/OK;UPDATE LASTV
	TAD GINC
	DCA LASTV
VAREX,	TAD EFOP	/NOW STORE IN RIGHT PLACE
	DCA I PT1
	ISZ PT1
	TAD SUBS
	DCA I PT1
	ISZ PT1		/POINTING AT DATA
	CDF P		/CAREFUL FPNT!
	NOP		/FOR FCDF V
	FINT
	FGET I CFRSX	/ZERO THE DATA
	FPUT I PT1
	FXIT
	POPJ		/EXIT
VARTOP,	FEXP-10

CHRSTO,	0	/STORE A CHAR IN FLD 0 AND 1 - "STOCHR"
	DCA CHAR
	TAD CHAR
	CDF L
	DCA I XCHAR
	CDF P
	JMP I CHRSTO
XCHAR,	CHAR

THISD,	0
	CDF T
	TAD I THISLN
	CDF P
	JMP I THISD

PT1D,	0
	CDF T
	TAD I PT1
	CDF P
	JMP I PT1D

ATLIST=.
	ERCALL	/NOT YET DEFINED
	ERCALL	/NOT YET DEFINED
	XTAB	/: - TABULATOR
	TINTR	/% - FORMAT DELIMITER
	TQUOT	/" - LITERAL DELIMITER
	TCRLF	/! - CARRIAGE RETURN AND LINE FEED
	TCRLF2	/# - CARRIAGE RETURN ONLY
	TDUMP	/DOLLAR/- DUMP THE SYMBOL TABLE CONTENTS
	TASK4	/SP- TERMINATOR FOR NAMES
	TASK4	/, - TERMINATOR FOR EXPRESSIONS
	PROCESS	/; - TERMINATOR FOR COMMANDS
	PC1	/C.R.TERMINATOR FOR STRINGS
/DOLLAR/ - FOR TDUMP TERMINATES THE COMMAND
/&27

/EVALUATE AN EXPRESSION WHICH
/TERMINATES WITH AN R-PAR, ; OR C.R. AND
/LEAVE THE RESULT IN FLAC AND IN FLARG

ECALL,	0	/RECURSIVE CALL TO "EVAL"
	PUSHF		/SAVE SORTCN,LASTOP,EFOP
		CELSO	/INCLUDES 'CIF CDF P' FOR POPJ
	TAD ECALL	/RETURN TO CALLING
	PUSHA		/ADRESS AFTER NEXT POPJ
	GETC		/MOVE PAST EXTRA CHAR
EVAL,	DCA LASTOP	/EVALUATION CONTROLLER(CHECKPOINT?)
	NOP		/REFRESH?
	TESTC		/TEST CHAR AND IGNORE SPACES
	JMP ETERM1	/TERMINATOR
	JMP ENUM	/NUMBER
	JMP EFUN	/FUNCTION
	PUSHJ		/LETTER OF VARIABLE
		GETVAR	/FIND OR CREATE VARIABLE;ALSO SET PT1
OPNEXT,	TESTC		/PT1 TO ARG
	JMP ETERMN	/T
ECHOLS,	0212		/N-ERROR IN FORMAT
	0377		/F
	JMP ETERM+1	/'EVAL'FOUND A TERMINATOR WHICH WAS NOT AN OP.
ETERM1,	TAD CFRSX	/SET PT1
	DCA PT1		/TO POINT TO ZERO
	TAD M2		/TEST FOR UNARY OPERATIONS
	TAD SORTCN
	SNA
	JMP ETERM	/CREATE DUMMY FOR UNARY MINUS
	IAC
	SNA CLA
	JMP ARGNXT	/IGNORE UNARY PLUS
	TAD SORTCN	/TEST FOR NULL PARENS
	TAD M11
	SPA CLA
	JMP ELPAR	/MIGHT BE AN L-PAR
ETERMN,	TSTLPR
	SKP
	ERROR2		/OPERATOR MISSING BEFORE PAREN
		336	/NO=NO OPERATOR
ETERM,	TAD SORTCN	/SET FROM "TESTC"-"SORTC"
	DCA THISOP
	TAD THISOP
	TAD M11
	SMA CLA		/END?
	DCA THISOP
/&28

ETERM2,	TAD THISOP	/COMPARE PRIORITIES
	CIA
	TAD LASTOP
	SPA CLA
	JMP EPAR	/CONTINUE
	TAD LASTOP	/FIND OPERATION
	CLL RTR
	RTR
	TAD OPTABL
	DCA FLOP
	TAD LASTOP
	SZA CLA		/TEST FOR END OF DATA INTO FLOATING AC
	POPF		/GET LAST DATA
		FLAC
	NOP		/LATER FCDF V
	FINT
FLOP,	00		/(FLOPR I PT1)+-*/
	FPUT I FLARGP	/SAVE RESULT
	FXIT
	TAD FLARGP
	DCA PT1
	TAD THISOP
	TAD LASTOP	/=0?
	SNA CLA
	JMP EVLEX	/EXIT EVAL
	POPA		/GET PRIOR OP
	DCA LASTOP
	JMP ETERM2	/COMPARE THIS OP
EVLEX,	TAD SORTCN
	DCA I ULTSOR	/SAVE LAST "SORTCN"
	POPJ

EPAR,	TSTLPR		/TEST FOR SUB-EXPRESSION
	SKP
	JMP EPAR2	/GO EVALUATE EXPRESSION
	TAD LASTOP	/CONTINUE READING THE EXPRESSION
	PUSHA		/SAVE "LASTOP"
	TAD PT1
	DCA .+3
	CDF V
	PUSHF		/SAVE LAST ARGUMENT
		00
	TAD THISOP	/MORE TO COME
	DCA LASTOP
ARGNXT,	GETC		/READ FIRST CHAR OF AN ARG.
	TESTC		/DO SPECIAL CHECK
	JMP ELPAR
	JMP ENUM	/N
	JMP EFUN	/F
	JMP OPNEXT-2	/L
OPTABL,	FGET I PT1	/BASE FOR OPERATION COMPUTATION
/&29

ENUM,	PUSHF		/TO PROCESS ANUMBER,SAVE AC
		FLAC
	TAD FLARGP	/SET POINTER AS FOR A VARIABLE
	DCA PT1
	DCA INSUB	/POINT TO 'GETC' AND USE CHAR
	JMS I FINPUT	/READ TEXT NUMBER INTO FLARG
	POPF		/RESTORE THE AC
		FLAC
	JMP OPNEXT	/CONTINUE

EFUN,	DCA EFOP	/SET CODE
	GETC		/READ FUNCTION NAME(1,2,3 LETTERS)
	SORTC		/LOOK FOR TERMINATION CHAR
		TERMS-1
	JMP EFUN2	/YES
	TAD EFOP	/NO
	CLL RAL		/MISH-MASH HASH CODE
	TAD CHAR
	JMP EFUN

EFUN2,	TSTLPR
	ERROR2		/MUST BE FOLLOWED BY PARENS TO SET ARGUMENT
		25	/BF=BAD FUNCTION
	JMS ECALL	/CALL "EVAL" TO COMPUTE ARGUMENT
	POPA		/GET OUT EFOP
	SORTC
		FNTABL-1
	JMP I STFUNC	/FOUND IT
ELPAR,	TSTLPR		/LEFT PAREN OR FELL THROUGH FUNCTION TABLE
	ERROR2		/DOUBLE OPERATORS OR ILLEGAL FUNCTION NAME
		124	/FE=FUNCTION ERROR
EPAR2,	JMS ECALL	/EVALUATE NESTED EXPRESSION
	POPA		/DUMP EXTRA ARG
	JMP I EFUN3I
STFUNC,	FUNCST
EFUN3I,	EFUN3
ULTSOR,	SORTUL
/&30

TERMS=.		/TERMINATOR TABLE FOR 'EVAL' AND 'GETARG'
	240	/0 SPACE
	"+	/1
	"-	/2
	"/	/3
	"*	/4
	"^	/5
	"(	/6
	"[	/7
	274	/10 (LEFT ANGLE BRACKET)
	")	/11
	"]	/12
	276	/13(RIGHT ANGLE BRACKET)
	",	/14
	";	/15
	215	/16 C.R.
	"=	/17 TO END GETARG FROM 'SET'

FNTAPT,	FNTABF-1	/POINTER TO 2-WORD FNTABF

FUNCST,	TAD SORTCN	/SET BY SORTC
	CLL RAL		/*2
	TAD FNTAPT
	DCA XRT2
	TAD I XRT2	/GET FIELD OF FUNCTION
	DCA .+3
	TAD I XRT2	/GET ADRESS
	DCA .+3
	HLT
	PUSHJ
		HLT
/&31

EFUN3,	NOP		/FOR FCDF
	FINT
	FNOR		/NORMALIZE FUNCTION RETURN
	FPUT I FLARGP	/SAVE FUNCTION VALUE
	FXIT
	TAD FLARGP	/SET POINTER
	DCA PT1
	JMS PARTEST
	JMP I .+1
		OPNEXT

SORTUL,	0
P3,	3
LPRTST,	0	/SKIP IF LEFT PAREN. - 'TSTLPR'
	TAD SORTCN
	TAD M11
	SMA CLA
	JMP I LPRTST
	TAD SORTCN
	TAD M5
	SMA SZA CLA
	ISZ LPRTST
	JMP I LPRTST

PARTES,	0		/TEST THE PAREN MATCHINGS
	POPA		/RESTORE THE LAST OPERATION
	DCA LASTOP
	POPA
	TAD P3		/+3 TO COMPARE CODES
	CIA		/CHECK FOR PAREN MATCH
	TAD SORTUL	/(STILL SET FROM THE LAST 'EVAL')
	SZA CLA		/SKIP IF MATCH
	ERROR2		/PAREN ERROR
		317	/MP=MISSING PARENTHESIS
	GETC		/MOVE PAST R-PAR
	JMP I PARTEST
/&32

/THE DELETE ALINE ROUTINE

XDELET,	0		/UNCHAIN A LINE AND RECOVER THE SPACE
	IOF		/PROTECT POINTER CHANGES FROM INTERRUPTIONS
	FINDLN		/SETS "THISLN" AND "LASTLN"
	JMP I XDELETE	/ALREADY GONE
	ISZ DEBGSW	/DISABLE TRACE
	GETC		/MEASURE LENGTH
	TSTCHR
	-215		/C.R.
	JMP .-3
	TAD AXOUT	/SAVE LAST ADRESS
	CMA
	TAD THISLN
	DCA CNTR	/LENGTH .L. 0
	TAD CFRS	/IT IS ILLEGAL TO DELETE THE FIRST LINE
	CIA
	TAD THISLN
	SNA CLA
	JMP I START	/JUST IGNORE SUCH COMMANDS
	CDF T		/CHANGE DATA FIELD TO TEXT
	TAD I THISLN	/DISCONNECT
	DCA I LASTLN
	TAD CFRS	/START LIST AT TOP
DOK,	DCA T2		/EXAMINATION ADRESS
	TAD I T2
	SNA		/TEST FOR END
	JMP DONE	/YES-WRAP UP ALL
	DCA T1		/SAVE NEXT ADRESS
	TAD THISLN	/COMPARE LINE POSITIONS
	CIA CLL
	TAD T1
	SZL CLA		/SKIP IF THISLN .G. X
	TAD CNTR	/CHANGE (X) TO ACCOUNT FOR
	TAD T1		/GARBAGE COLLECTION
	DCA I T2
	TAD T1		/GET NEXT
	JMP DOK
/&33

/GARBAGE COLLECTION

DONE,	CMA		/BACKUP L FOR XR
	TAD THISLN
	DCA XRT
	TAD CNTR	/CORRECT END OF BUFFER POINTER
	TAD BUFR
	DCA BUFR
	TAD AXIN	/COMPUTE COUNT
	CMA
	TAD AXOUT
	DCA T1
	TAD AXIN
	TAD CNTR
	DCA AXIN
	TAD I AXOUT
	DCA I XRT
	ISZ T1
	JMP .-3
	JMP XDELETE+1	/RESET 'LASTLN','THISLN', AND DATA FIELD

FNTABL=.
	2533	/ABS
	2650	/SGN
	2636	/ITR
	2630	/RAN
	2572	/ATN
	2624	/EXP
	2625	/LOG
	2654	/SIN	/LIST OF CODED FUNCTION NAMES
	2575	/COS
	2702	/SQT
	1140	/IN
	2672	/OUT
	2604	/(F)IND
	0324	/T
	0325	/U
	0326	/V
	0327	/W
	0330	/X
	0331	/Y
	0332	/Z
/&34

/ERASE SINGLE LINES, GROUPS, OR VARIABLES

ERASE,	TESTC		/TEST THE SECOND WORD IF ANY
	JMP ERVX	/ERASE THE VARIABLES
	JMP ERL		/LINES OR GROUPS
	JMP .+3		/ERROR
	TSTCHR		/ALL TEXT
	-"A
	ERROR2		/BAD ARG FOR ERASE
		24	/BE=BAD ERASE
ERT,	TAD ENDT	/ERASE ALL TEXT
	DCA BUFR
	CDF T
	DCA I CFRS
	JMP I GOK	/RESTART

ERL,	GETLN		/ERASE LINES
	TAD BUFR	/PROTECT REST OF TEXT
	DCA AXIN
ERG,	DELETE		/EXTRACT ONE LINE
	ISZ THISLN
	TAD NAGSW
	SMA CLA
	JMS I DTHIS	/(TAD I THISLN)
	TSTGRP		/DONE ERASING GROUP?(SKIP)
	JMP I GOK	/YES,ERASE 'CURRENT PROGRAM SAVED' FLAG
	JMS I DTHIS	/(TAD I THISLN)
	DCA LINENO
	JMP ERG

ERVX,	TAD END		/ZERO VARIABLES(BUT NOT SECRET VARIABLES)
	DCA LASTV	/MAY BE INDIRECT COMMAND
	POPJ

GOK,	GOKILL
/&35

/ROUTINE CALLED VIA "FINDLN":

/SEARCH FOR A GIVEN LINE I.D. =[ "LINENO"]
/1ST RETURN IF NOT FOUND,
/2AND IF FOUND.
/"THISLN" = FOUND LINE OR NEXT LARGER
/"LASTLN" = LESSER AND/OR LAST
/"TEXTP" IS SET

XFIND,	0
	TAD CFRS	/INITIALIZE POINTERS TO FIRST LINE
	DCA LASTLN
	TAD CFRS
FINDN,	DCA THISLN	/SAVE THIS ONE

	TAD THISLN
	DCA XRT
	TAD LINENO
	CLL CMA IAC	/CLEAR LINK AND NEGATE LINENO
	JMS I DXRT	/LINENO=0 WILL BE FOUND (X-MEM)
	SNA
	JMP FEND3-1	/FOUND IT
	SZL CLA
	JMP FEND3	/PASSED IT
	TAD THISLN	/MOVE POINTERS
	DCA LASTLN
	JMS I DTHIS	/END OF TEXT ? (X-MEM)
	SZA
	JMP FINDN	/NOT YET
	SKP
	ISZ XFIND	/2ND EXIT = FOUND
FEND3,	TAD THISLN	/1ST RETURN = NOT FOUND
	IAC
	DCA AXOUT	/SET "TEXTP"
	DCA XCT
	JMP I XFIND
/&36

UTRA,	0		/UNPACK CHARACTER. - "GETC"
	JMS GET1
UTE,	SPA CLA		/NORM & EXTEND
	TAD GEND	/300-337 & 340-376
	TAD M137	/240-276 & 200-236
	TAD CHAR
	SNA
	JMP UTX		/"?" FOUND
	TAD P337
UTQ,	STOCHR
	TAD DEBGSW
	TAD DMPSW
	SNA CLA		/PRINT ONLY IF BOTH ARE ZERO
	PRINTC
	JMP I UTRA

EXTR,	JMS GET1
	CMA
	JMP UTE
UTX,	TAD DEBGSW	/TEST FOR TRACE-ENABLED
M40,	SMA SZA CLA	/DEBGSW NEVER NEGATIVE
	JMP .+6
	TAD DMPSW	/FLIP THE TRACE FLOP
	SNA CLA
	IAC
	DCA DMPSW
	JMP UTRA+1	/GET NEXT CHARACTER INSTEAD
	TAD P277	/TRACE DISABLED = RETURN "?"
	JMP UTQ

GET1,	0		/UNPACK 6 BITS
	ISZ XCT		/STARTS=0
	JMP GET3
	TAD GTEM
GEND,	AND P77
	DCA CHAR	/SAVE
	TAD CHAR
	TAD M77
	SNA CLA
	JMP EXTR	/EXTENDED
	TAD CHAR
	TAD M40
	JMP I GET1

GET3,	CDF T
	TAD I AXOUT
	CDF P
	DCA GTEM
	CMA
	DCA XCT
	TAD GTEM
	BSW
	JMP GEND
M137,	-137
/&37

RETRN,	TAD C200
	DCA PC
	POPJ

PGETLN,	GETLN
	POPJ

TLIST3=.
	TASK4		/"   (LITERAL TERMINATORS)
	PC1		/C.R.=AUTOMATIC QUOTE MATCH

INFIX=.		/DATA CONTROL CHARACTERS
	FLINTP+2	/LEFT ARROW=KILL
	INPUT+1		/RUBOUT=IGNORE
	INPUT+1		/L.F.=IGNORE
	ALT		/ALT MODE=EXIT
	ESC		/ESC=ALT

FLTONE,	0001		/(NO RELATIVE REFERENCES)
	2000
	0000
	0000
M12,	-12

XSPNOR,	0	/IGNORE LEADING SPACES - "SPNOR"
	TSTCHR
	-240		/SPACE
	JMP I XSPNOR
	GETC
	JMP XSPNOR+1

XTESTN,	0	/RETURNS: .; OTHER; NUMBER - "TESTN"
	TAD CHAR
	TAD MPER
	SZA
	ISZ XTESTN
	TAD M2
	DCA SORTCN	/SAVE VALUE OF NUMBER
	TAD SORTCN	/TEST IF REALLY A DIGIT
	SPA CLA
	JMP I XTESTN
	TAD SORTCN
	TAD M11
	SPA SNA CLA
	ISZ XTESTN	/IF A NUMBER
	JMP I XTESTN
/&38

XPRNT,	0		/PRINT A LINENUMBER -"PRNTLN"
	DCA COMBO+3	/IF AC='SKP' :PACK ALSO
	TAD LINENO
	AND P7600
	BSW
	RAR
	JMS PRNT	/TWO DIGIT PART NUMBER
	TAD PER
	PRINTC
	TAD LINENO
	JMS PRNT	/TWO DIGIT STEP NUMBER
	TAD SPC
	JMS COMBO	/PRINT AND SOMETIMES PACK
	DCA COMBO+3	/RESET TO PRINT ONLY
	JMP I XPRNT

PRNT, 	0		/PRINT TWO DEZIMAL DIGITS
	AND P177
	DCA T1
	TAD C260
	DCA T3
	JMP .+3
	ISZ T3
XYZ,	DCA T1
	TAD T1
	TAD M12
	SMA
	JMP XYZ-1
	CLA
	TAD T3
	JMS COMBO
	TAD T1
	TAD C260
	JMS COMBO
	JMP I PRNT

COMBO,	0	/COMBINED PRINT PACK
	STOCHR
	PRINTC
	0
	JMP I COMBO
	PACKC
	JMP I COMBO
/&39

/SYMBOL TABLE TYPEOUT ROUTINE

TDUMP,	TAD END		/INIT POINTER FOR DUMP (DON'T DUMP SECRET VARIABLES)
	DCA PT1
	TAD LASTV	/TEST FOR END OF LIST
	CIA
	TAD PT1
	SNA CLA
	POPJ
	CDF V
	TAD I PT1	/GET VARIABLE
	CDF T
	DCA I OP+1
	CDF P
	TAD OP		/SETUP UNPACK POINTERS
	DCA AXOUT
	DCA XCT
	GETC		/READ AND PRINT "XX("
	PRINTC
	GETC
	PRINTC
	GETC
	PRINTC
	ISZ PT1
	CDF V
	TAD I PT1	/PRINT SUBSCRIPT TO 99
	CDF P
	JMS PRNT
	GETC		/PRINT ")"
	PRINTC
	ISZ PT1
	NOP		/FCDF V
	FINT		/PICK UP VALUE
	FGET I PT1
	FXIT
	JMS I FOUTPUT	/PRINT VALUE
	TAD CCR
	PRINTC
	TAD GINC
	TAD M2
	TAD PT1
	JMP TDUMP+1

OP,	PC0+3
	PC0+4
/&40

LGOSUB,	PUSHJ		/EXECUTE THE SUBROUTINE
		DO+1
	TAD SPC
	STOCHR
	SKP
LIB,	SPNOR		/IGNORE SPACES
	DCA GOSWIT	/I.E. TO "PROC" FOR REST OF LINE
	CIF CDF L
	JMP I LIBLOW

	TAD  JMPGOS	/RETURN TO APPROPRIATE ROUTINE
	TAD GOSWIT
	DCA GOSWIT
GOSWIT,	JMP I .+1
	PROC
	START1
	LGOSUB
	GOTO+1
LIBLOW,	LOWLIB
JMPGOS,	JMP I GOSWIT+1

SPECIAL=.	/INPUT CHARS
	337	/LEFT ARROW
	377	/RUBOUT
	212	/LINE FEED
	375	/ALT MODE
	233	/ESCAPE

/&41

/SEARCH ROUTINES

MODIFY,	GETLN		/READ LINE NO.
	FINDLN		/LOOK IT UP NOW
	ERROR2		/NOT THERE = BAD COMMAND UNLESS ZERO
		34	/BM=BAD MODIFY
	TAD BUFR	/SET POINTERS
	DCA AXIN	/FOR INPUT
	DCA XCTIN
	TAD BUFR
	DCA PACKST
	TAD MODSKP	/SET PRNTLN FOR PACKING
	PRNTLN
SCONT,	CIF CDF L
	JMS I INDEV	/READ THE TELETYPE SILENTLY
	DCA LIST3+1	/SAVE SEARCH CHAR.
	ISZ DEBGSW	/NO BREAKS
SCHAR,	GETC		/TYPE+TEST-F.F.
	PRINTC		/PLAYBACK THE TEXT
	SORTJ		/LOOK FOR MATCH
		LIST3-1
		LISTGO-LIST3
	PACKC		/SAVE NEW LINE
	JMP SCHAR

SBAR,	CLL CML CLA IAC RAL	/RESTART-B.A.
	TAD BUFR
	DCA AXIN	/SET POINTERS
	DCA XCTIN
SFOUND,	READC		/READ FROM KEYBOARD
	SORTJ		/TEST
		LIST6-1
		SRNLST-LIST6
SGOT,	PACKC		/PACK CHAR.
	JMP SFOUND	/MORE

MODSKP,	SKP
/&42

OUT,	0		/OUTPUT A CHARACTER-"PRINTC"
	SNA		/USE AC OR CHAR
	TAD CHAR
	TAD M216	/CNTRL N MEANS RETURN ONLY
	SNA
	DCA TABC	/XOUTL WILL HANDLE CR ONLY
	IAC		/CHECK FOR CR
	SNA
	JMP NEWLIN	/TYPE CR,LF
	TAD CRMSPC
	SMA
	ISZ TABC	/IT PRINTS, INCREMENT COUNT
IFNOP,	NOP
	TAD SPC
OUTCLF,	CIF L
	JMS I OUTDEV
	JMP I OUT

NEWLIN,	DCA TABC
	TAD CCR		/CR
	CIF L
	JMS I OUTDEV
	TAD CLF		/LF
	JMP OUTCLF
M216,	-216
CRMSPC,	215-240

/&43

	*2676	/SO 'IF3' IS JUST PAST PAGE BOUNDARY

/CONDITIONAL TRANSFER PROCESS

IFLIST,	300
	276	/.GT.
	275	/.EQ.
	300
	274	/.LT.

SPNA,	SPA SNA CLA
P76MSP,	7600-7750	/7750=SPA SNA CLA
P2004,	2004
IFSPA,	SPA

IF,	TESTC		/FIRST CHAR. MUST BE TERMINATOR
	JMP IFOK	/OK!
FRSTIF,	0
SCNDIF,	0
	JMP IFER
IFOK,	TAD IFSPA
	DCA IF2		/RESET IF2
	JMS I DECALL	/EVALUATE FIRST EXPRESSION
	TSTCHR
	-",		/TEST IF TERMINATED BY ','
	JMP COMPIF	/NO COMPUTED IF
	GETC		/GOBBLE COMMA
	SORTC
		IFLIST-1	/GET FIRST REL. OP.
	SKP
IFER,	ERROR2		/NO SUCH!
		204	/IE=IF ERROR
	TAD SORTCN
	DCA FRSTIF	/KEEP FIRST REL. OP.
	DCA SORTCN
	GETC		/NEXT REL. OP. IF ANY
	SORTC
		IFLIST-1
	GETC	/FOUND ONE;MOVE TO NEXT CHAR
	TAD SORTCN
	DCA SCNDIF	/KEEP;IF NONE = 0
	CLA CLL IAC RAL	/2=OP. '-'
	DCA THISOP
	PUSHJ
		EPAR	/EVALUATE SECOND ARGUMENT
/&44

	TAD FRSTIF
	CIA
	TAD SCNDIF
	SNA CLA
	JMP IFER	/SOME COMBINATION LIKE:'=='
	TAD IFNOP
	DCA IF2		/SET FOR TWO EXITS
	TAD FRSTIF	/NOW COMPUTE INSTRUCTION
	TAD SCNDIF
	CLL RAR		/.GT. IN LINK
	SZL
	CMA		/COMPL. IF .GT.
	SZL
	TAD P2004	/SET REVERSE SENSE
	BSW
	CLL RAR
	TAD P76MSP
COMPIF,	TAD SPNA
	DCA IF3-1
	POPA		/DUMP EFOP
	JMS I DPART	/CHECK PARENS.
	TAD M2
	DCA T1
	TAD HORD	/TEST COMP.IF. -,0,+
IF2,	SPA
	ISZ T1
	SPA SNA CLA	/OR SOME OTHER INSTR.
IF3,	ISZ T1		/COUNT COMMAS
	SKP
	JMP I IFGO	/TRANSFER TO GO
	SORTJ		/SEARCH TEXT UNTIL ,;C.R.
		TLIST-1
		ILIST-TLIST
	GETC
	JMP .-4
IF1,	GETC		/MOVE PAST COMMA
	JMP IF3

IFGO,	GOTO

FILER,	CIF CDF L
	JMP I .+1
		FILEST
ERCALL,	ERROR2		/NON EXISTENT ITEM IN LIST
		320	/NA=NOT AVAILABLE
/&45

/CHARACTER REMOVAL ROUTINE

	*3022

RUB1,	TAD AXIN	/RUBOUT ONE LETTER
	CIA
	TAD PACKST	/PROTECTION
	SPA CLA
	TAD AXIN	/IF TOO LOW PUT 0 IN T2
	DCA T2
	CDF T
	ISZ XCTIN	/TEST HALF
	JMP RUB2
	TAD I T2	/ADD IS FULL
	AND P77		/IF PROTECTION
	TAD M77		/THIS NEVER GIVES ZERO
M140,	SZA CLA		/BECAUSE LOC.0 FLD T IS ZERO
	JMP RUB4
RUB3,	CMA		/IT IS EXTEND CODE
	DCA XCTIN	/SET SWITCH
	CMA
	TAD AXIN
	DCA AXIN
	TAD I T2	/RESET ADD
	AND P7700
RUB4,	DCA ADD
	CDF P
	DCA ECHO	/ONLY IF ECHO
	TAD SPLAT	/FOR RUBOUT ACKNOWLEDGEMENT
	PRINTC
	ISZ ECHO
	JMP I PACBUF

RUB2,	TAD T2
	SNA CLA
	JMP PACX	/PROTECTED!
	TAD I T2	/CHECK FOR EXTEND
	AND P7700
	TAD M140-2
	SZA CLA
	JMP RUB3
	DCA I T2	/SAVE CORRECTION
	JMP RUB3+1

SPLAT,	334
/&46

PACBUF,	0		/PACK A CHAR. -"PACKC"
	TAD P277
	CIA
	TAD CHAR
	SNA		/CHANGE 277 TO 377
	TAD P40
	TAD P7700
	SNA		/TEST FOR RUBOUT
	JMP RUB1
	TAD P377
	DCA T2		/SAVE INPUT ITEM
	TAD T2		/SO THAT QUESTION DOESN'T MAKE
P377,	AND C140	/CHAR LOOK LIKE A LEFT ARROW
	TAD M140
	SZA		/DATA WORD
	TAD C140
	SNA CLA
	JMP ESCA	/200-237 & 340-377
PA1,	TAD T2		/240-337
	AND P77
	SZA 		/IGNORE 300
	JMS PCK1
PACX,	CDF P
	JMP I PACBUF
ESCA,	TAD P77
	JMS PCK1
	JMP PA1

ROT,	BSW
	DCA ADD
	CMA
	DCA XCTIN
	JMP I PCK1
P40,	40
P7700,	7700

PCK1,	0
	ISZ XCTIN	/=0 TO START
	JMP ROT
	TAD ADD
	JMS I DAXIN
	DCA ADD		/CLEAR PACKING WORD
	JMP I PCK1
/&47

AXIND,	0	/AXIN SUB. NOW CHECKS FOR OVERFLOW
	CDF T
	DCA I AXIN
	TAD I PAXPNT	/PDLXR
	CLL CIA
	TAD AXIN
	TAD AXILIM	/ONE BLOCK DISTANCE FOR PDL
	CDF P
	SNL CLA
	JMP I AXIND
	ERROR2		/TEXT OVERFLOW
		365	/PF=PROGRAM FULL

AXILIM,	400

FIN,	READC		/SINGLE CHAR. INPUT FUNCTION
	TAD CHAR	/FLOAT CHAR.
	DCA HORD
	DCA LORD
	DCA OVER2
	TAD P13
	DCA EXP
	POPJ

FOUT,	JMS I INTEGE	/SINGLE CHAR OUTPUT FUNCTION
	SNA
	CLA CLL CML RTR	/IN CASE IT'S ZERO
	PRINTC
	POPJ

XINT,	JMS I INTEGE
	CLA CLL
	POPJ

C140,	140		/DON'T MOVE!!
/&48

	*3200

/SECRET VARIABLES


STSECR=.

	4400
DOLL=.+2
	ZBLOCK 5
	4300
NMBSGN=.+2
	ZBLOCK 5
	4100
EXCLA=.+2
	ZBLOCK 5	/INTRPT VARIABLES
	4200
QUOTS=.+2
	ZBLOCK 5

	2011		/SECRET PI
	0000
	0002
	3110
	3755
	2421
STVAR=.

	PAGE

>

IFNZRO FOCLST <XLIST>