File: EFOS8L.PA of Tape: Sources/Focal/s4
(Source file text) 

EJECT  FOS8 I-O,FILES,CD-ETOS
	FIELD 0

	*1		/INTERRUPT SERVICE ROUTINE

	JMP I .+1
		INTRPT
DRONE=JMS I .
	XIDLE
	0
	0		/FOR OD
	0
	*7
TSORTJ=JMS I .
	SORTB
/AUTO-INDEX REGISTERS
AUTO1,	0		/GENERAL		
AUTO2,	0		/COMPARE
AUTO3,	0		/COMPARE
INFLG,	0		/FILE INPUT:1,TTY:0,EOF:-1
INECH,	0		/INPUT ECHO:0,NO ECHO:-1
OUTFLG,	0		/FILE OUTPUT:1,TTY:0
OUTECH,	0		/OUTPUT ECHO:0,NO ECHO:-1
ERRCOD,	0
XCNTR,	0		/GENERAL COUNTER-
USR,	7700		/POINTER TO MONITOR (200 IF USR IN)
NAMLOC,	ZBLOCK 3	/USED BY NAME
EXTENS,	0		/"FC", "FD", OR "FN"
NEWDEV,	ZBLOCK 2	/USED BY NAME
TEM7,	0
ATEM,	0		/KEEP HERE : TPOPF NEWDEV

/DEFINE LOWER FIELD INSTRUCTIONS . . .
TINTEG=JMS I .
	MINTEG
ERROR1=JMS I .
	ERROL
TPOPA=JMS I .
	MPOPA
TPUSHA=JMS I .
	MPUSHA
TPUSHF=JMS I .
	MPUSHF
TPOPF=JMS I .
	MPOPF
TPUSHJ=JMS I .
	MPUSHJ
TPOPJ=JMP I .
	MPOPJ
ECHFLG,	0		/-1:NO ECHO
OPNFLG,	0		/OOPEN:-1;OCLOSE:0
IPNFLG,	0		/IOPEN:-1;EOF:0
OUTINH,	0		/NOT LAST BLK:0,LAST BLK:1
DEVHLD,	0		/OOPEN:DEV. NO. FOR CLOSE
FILEN,	0		/SPECIFIED FILE LENGTH []
FLNGTH,	0		/SET BY OPEN
STBLK,	0		/SET BY OPEN
DEVNO,	0		/SET BY HANDAD
LIBFIL,	0		/START BLK OF SAVED PROG;UNSAVED:0
LIBBLK,	0		/FOR DEVICE NAME
	0
	7200		/LOAD POINT
	0		/FOR DEVICE #
LIBHND,	0		/HANDLER ENTRY
INBLK,	0
	0
	6600
	0
INHND,	0
OUTBLK,	0
	0
	6200
	0
OUTHND,	0

DERR,	ERROR1		/DEVICE ERROR
		64	/DE=DEV.ERR.
CHARL,	0
DCHAR,	CHAR
CLNGTH,	0		/SET BY COMMON
COMFLG,	0		/1:WRITE;0:READ
SETBLK,	0		/THE RELATIVE BLOCK IN USE
THSBLK,	0		/ASKED FOR BLOCK
COWRIT,	1		/WRITE:1 READ:0
CHRCNT,	-110
TELSW,	0
GOSWIT,	0
CTCINH,	0
INBUF,	0

	PAGE
/OS/8 FILE ROUTINES

/CHAIN WITH AC=0 FOR PROCEED,1:START,2:GOSUB,3:GOTO,4:WRITE

MAINTR,	CLA IAC		/MAIN ENTRY-POINT
CHENTR,	JMP I STRTSW	/CHAIN ENTRY-POINT - -
	TPUSHF		/OR 'DCA STRTSW' AFTER INIT
		MONHUK	/INSTALL CTRL.C HOOK
	TPOPF
		7600
	DCA TELSW	/ALLOW TTY: TO START
	CLA CMA
	TAD STRTSW
	SNA CLA
	JMP I AAMESG	/GO START DIRECT MODE
	TAD STRTSW
CONTIN,	DCA GOSWIT	/GO BACK TO 'PROC':MAIN FLOW
	JMP I [EXITOS
AAMESG,	RESTRT
STRTSW,	SETUP

OCLOSE,	0		/CLOSE THE OPEN OUTPUT FILE
	TAD OPNFLG
	SNA CLA		/DON'T BOTHER IF IT ISN'T OPEN
	JMP I OCLOSE
	DCA OPNFLG	/MUST BE HERE!
	DCA OUTINH	/WE CAN CLOSE THE LAST BLK
	TAD [232	/WRITE '^Z'
	JMS I [NOCHAR
	TAD OPTR1	/PAD BUFFER WITH ZEROS
	TAD (-OUTBUF	/(AND WRITE IT OUT)
	SZA CLA
	JMP .-4
	JMS I [GTMON	/TURNS ON 'CTCINH'
	TAD DEVHLD	/SAVED DEVICE #
	CIF 10
	JMS I USR
	4		/CLOSE
	ONMTMP		/POINTER TO SAVED NAME
BLKCNT,	0		/FILE LENGTH; ZEROED BY OOPEN
	JMP DERR	/HUH?
	DCA OUTFLG	/RESTORE TELETYPE OUTPUT ROUTINE
	JMP I OCLOSE	/DO WHATEVER ELSE NEEDS TO BE DONE
/OS/8 3/2 BUFFERED CHARACTER OUTPUT

NOCHAR,	0
	AND (377	/MASK OUT GARBAGE
	ISZ O3		/WHICH CHAR OF THREE?;-3 INITIALLY
	JMP O2		/STRAIGHT PACKING
	JMS RT		/HALF WORD PACKING - PACK FIRST HALF
	TAD ATEM	/GET SAVED ARG
	JMS RT		/PACK SECOND HALF
	CLA CLL CMA RTL	/RESET 3-WAY SWITCH
	DCA O3
	ISZ OCHCT	/BUFFER CAN ONLY BE FILLED
	JMP I NOCHAR	/ WITH 3RD CHAR OF 3
	JMS I [PUTDEV	/TELL USR THIS HANDLER'S IN
		OUTHND-1/POINTER TO DEVICE # AND ENTRY
	TAD OUTINH	/LAST BLOCK?
	SZA CLA
	JMP OOVER	/YES, CLOSE IN EXTREMIS
	ISZ CTCINH
	JMS I OUTHND	/WRITE ONE BLOCK BUFFER
	4200
	OUTBUF
OBLK,	0		/SET BY OOPEN
	JMP DERR	/DEVICE ERROR
	JMS I [DISMIS	/ONLY FOR TURNING OFF 'CTCINH'
	ISZ OBLK	/BUMP OUTPUT BLOCK
	ISZ BLKCNT	/AND COUNT OF BLOCKS SO FAR
	CLA CLL
	TAD OLNGTH	/-MAXIMUM ALLOWABLE LENGTH+1
	TAD BLKCNT	/LENGTH SO FAR
	SZL CLA		/HAS HE GONE TOO FAR?
	ISZ OUTINH	/YES;MUST CLOSE BEFORE NEXT END
	TAD OUTINH	/ONE WORD LESS IN NEXT BLOCK
	JMS OSETUP	/RESET POINTERS FOR NEXT BUFFER
	JMP I NOCHAR
O2,	DCA I OPTR1	/NORMAL PACKING IS EASY!
	ISZ OPTR1	/BUMP POINTER
	JMP I NOCHAR

	O3=.		/WHY NOT?
RT,	0		/HALF-WORD PACK ROUTINE
	CLL RTL
	RTL
	DCA ATEM	/SAVE FOR SECOND HALF
	TAD ATEM
	AND [7400
	TAD I OPTR2	/ADD IN CHARACTER IN RIGHT HALF
	DCA I OPTR2	/PACK IT
	ISZ OPTR2	/BUMP POINTER AGAIN
	JMP I RT
OOVER,	CLA CMA		/THERE IS JUST ROOM FOR CTRL.Z
	DCA OCHCT	/LET CLOSE WRITE IT FROM ERROR
	ERROR1
		345	/OF=OUTPUT FULL

OSETUP,	0		/RESET ALL THE POINTERS
	TAD [7600	/THIS IS CHANGED TO -177
	DCA OCHCT	/ FOR LAST BLOCK
	TAD OBLK-1
	DCA OPTR1
	TAD OBLK-1
	DCA OPTR2
	CLA CLL CMA RTL
	DCA O3
	JMP I OSETUP
OPTR1,	0
OPTR2,	0
OLNGTH,	0		/SET BY OOPEN
OCHCT,	0

COMPO,	SAVER
	FETCHER
	CHAINER
	BUMP
	GOSUB
	RETOUR
	LEXIT
	LOADER

FOCTXT,	FILENAME FOCAL.TM	/USED BY GOSUB
TTYTXT,	DEVICE TTY

NAMGO,	NAMEVL
	PERD
	ECHCHK
	CHANEL
	RESTOR
	NAMLEN
	NAMEC

MONHUK,	CIF CDF L
	5602		/'JMP I .+1'
	MEXIT-1

	PAGE
OOPEN,	TAD (ORST	/RESTORE ADRESS
	JMS I [OPEN	/CALL USR, HANDLER; ENTER FILE
YINT,		OUTBLK-1/OUTPUT HANDLER BLOCK
		3	/MONITOR 'ENTER' CODE
	JMP TTYOUT	/'OPEN OUTPUT TTY:'
	JMP I (OCLCHK	/SEE IF FILE OPEN
	TPUSHF		/SAVE NAME AND EXTENSION
		NAMLOC
	TPOPF
		ONMTMP
	TAD STBLK	/STARTING BLOCK
	DCA I (OBLK	/IN NOCHAR
	TAD FLNGTH	/-MAXIMUM ALLOWABLE LENGTH
	CLL IAC		/CHECK IF ONE BL0CK LONG
	DCA I (OLNGTH	/IN NOCHAR (+1)
	RAL		/IF ONE LONG, LINK SET
	DCA OUTINH	/SEND OUT ^Z AT END OF FIRST BUFF
	TAD OUTINH	/ADJUST CHAR.CNT.
	JMS I (OSETUP	/SET UP PACKING POINTERS
	CLA CLL CMA	/THERE'S A FILE OPEN!
	DCA OPNFLG
	TAD DEVNO	/SAVE FOR CLOSE
	DCA DEVHLD
	DCA I (BLKCNT	/DITTO
ORST,	TAD OPNFLG	/ENTRY FOR 'OPEN RESTORE OUTPUT'
	SNA CLA		/IF 'OPEN OUTPUT', FLAG IS SET
	ERROR1		/NO OUTPUT FILE TO RESTORE
		325	/NF=NO FILE
	CLA IAC		/SET OUTPUT TO NOCHAR
TTYOUT,	DCA OUTFLG	/SET OUTPUT TO TTY (INTERRUPT)
	TAD ECHFLG
	DCA OUTECH	/SET OUTPUT ECHO
	JMP I [CONTIN	/FINISH THE LINE

MINTEG,	0		/INTEGER FAKE
	CIF CDF P
	JMS I [XINTEG
	JMP I MINTEG
ICHAR,	0		/GET A CHARACTER FROM A FILE
	CLA CLL CML	/MAKE SURE-SET LINK FOR KEY BIT
	ISZ INCHT	/NEED ANOTHER BUFFER?;-1 INITIALLY
	JMP I RDPTR	/NO, UNPACK THE CHARACTER
	ISZ CTCINH
	JMS I INHND	/YES, GO GET IT
	0200
	INBUFF
IBLK,	0		/SET BY IOPEN
	SMA CLA		/ONLY BOTHER WITH FATAL ERRORS
	SKP CLA		/REFERENCED!
	JMP DERR	/WE'VE GOT ONE
	JMS I [DISMIS
	ISZ IBLK	/BUMP TO NEXT BLOCK
	TAD IBLK-1	/AND RESTORE POINTERS
	DCA IPNTR
	CLA CMA		/-1 FOR FIRST TIME ROUND
	TAD [7200
	DCA INCHT
ICHARL,	JMS RDPTR	/FIRST TIME AND KEY IN POS. 0
	RTL
	RTL
	SPA		/KEY IN POS. 0?
	JMP ICHARL	/YES;READ IN COMBINED WORD
	DCA ITEMP	/SAVE HALF-WORD AND KEY:POS.8-4-0
	TAD I IPNTR	/GET FULL WORD
	JMS RDPTR
	TAD I IPNTR	/GET HALF WORD
	ISZ IPNTR
	AND [7400	/ISOLATE
	CLL RAL		/MAGIC STEP
	TAD ITEMP	/ADD IN OTHER HALF? AND KEY
	JMP ICHARL+1	/GO SHIFT MORE AND TEST IF FULL

RDPTR,	0		/THIS IS A COROUTINE
	AND [177	/ISN'T THAT AMAZING?
	SNA		/IGNORE NULLS AND PARITY
	JMP ICHAR+1
	TAD [-32	/END OF FILE? (^Z)
	SZA
	JMP .+4		/NO
	DCA IPNFLG	/YES, CLEAR OPEN FILE FLAG
	CLA CMA		/PREVENT AN
	DCA INFLG	/'ATTEMPT-TO-READ-PAST-EOF'!
	TAD [232	/PASS ^Z TO PROGRAM FOR TESTING
	JMP I ICHAR
ITEMP,	0
IPNTR,	0
INCHT,	0		/SET TO -1 BY IOPEN
ONMTMP,	ZBLOCK 4

FILEST,	TAD (604	/HERE'S WHERE FILES START!
	DCA EXTENSION	/SET '.FD' ASSUMED EXTENSION
	CDF P
	TPUSHJ
		TERMER
	MQA
	CIF P
	TSORTJ		/GO DO COMMAND
		FILIST-1
		FILGO-FILIST
	ERROR1		/OOPS - BAD 'O' COMMAND
		36	/BO=BAD OPEN COMMAND

FILGO,	IOPEN
	OOPEN
	OCLOSR
	ARRAY
	CCLOSR

FILIST,	"I		/INPUT
	"O		/OUTPUT
	"C		/CLOSE
	"A		/ARRAY=COMMON
	"T		/TERMINATE(COMMON)
SAVER,	JMS I [NAME	/GET NAME FOR SAVE
	JMS I (SAVPR	/DO IT
EXITOS,	JMS I [DISMIS	/NORMAL RETURN FOR OS/8 COMMANDS
	TAD GOSWIT
	CDF CIF 10
	JMP I .+1
		LIBRET

	PAGE
IOPEN,	TAD (IRST	/RESTORE ADRESS
	JMS I [OPEN	/CALL GENERAL-PURPOSE SUBROUTINE
		INBLK-1
		2	/MONITOR 'LOOKUP'
	JMP TTYIN	/'OPEN INPUT TTY:'
	JMP IRST+2	/WHOOPS - FILE NOT FOUND
	TAD STBLK	/SET POINTERS AND OTHER CRAP
	DCA I (IBLK	/IN ICHAR
	CLA CLL CMA
	DCA IPNFLG
	CLA CLL CMA
	DCA I (INCHT	/IN ICHAR
IRST,	TAD IPNFLG	/'OPEN RESTORE INPUT' COMES HERE
	SNA CLA		/FLAG IS SET ALREADY IF 'OPEN INPUT'
	ERROR1		/NO INPUT FILE TO RESTORE
		330	/NI=NO INPUT FILE
	CLA IAC		/SET I/O POINTERS
TTYIN,	DCA INFLG
	TAD ECHFLG	/AND ECHO MODE
	DCA INECH
	JMP I [CONTIN

FLD0=CLA CLL		/PDL SATELLITES;FIELD 0

MPOPA,	0
	MQL
	FLD0
	CIF T
	JMS I .+1
		ZPOPA
MPUSHA,	0
	MQL
	FLD0
	CIF T
	JMS I .+1
		ZPUSHA
MPUSHF,	0
	MQL
	FLD0
	CIF T
	JMS I .+1
		ZPUSHF
MPOPF,	0
	MQL
	FLD0
	CIF T
	JMS I .+1
		ZPOPF
MPUSHJ,	0
	MQL
	FLD0
	CIF T
	JMS I .+1
		ZPUSHJ
MPOPJ,	CIF CDF T
	JMP I .+1
		ZPOPJ

/THE FOLLOWING CODE WILL RECOGNIZE FOR EX.L C DATA(X)
/AND LOOK FOR DATA99 IF X=99

NAMEVL,	TAD I (NAMECT	/CHECK NUMBER OF CHARS
	TAD (-4		/AT MOST 4
	SMA SZA CLA
EVLERR,	ERROR1
		135	/FN=FILE NAME ERROR
	DCA ATEM	/CLEAR TEN COUNTER
	CDF P		/GO TO EVAL
	TPUSHJ		/'('READY,DUMP ')'
		EVAL-1
	TINTEG
	TAD (-144	/.LT. 100 (DEC)
	SZL		/NOW WE HAVE X-100
	JMP EVLERR
	TAD [12		/X-100+ATEM*10
	ISZ ATEM
	SPA
	JMP .-3
	MQL		/OVERFLOW IS LOW ORDER
	TAD ATEM	/ATEM IS 10 - HIGH ORDER
	CIA		/HIGH ORDER - 10
	TAD [12		/HIGH ORDER
	TAD [60		/6-BIT ASCII
	JMS I (NAMSTO
	MQA		/LOW ORDER AGAIN
	TAD [60
	JMS I (NAMSTO
	JMP I (NAMEC
XSGN,	CDF P		/REAL SIGNUM FUNCTION
	TAD I (HORD
	SNA CLA
	TPOPJ		/FSGN(0)=0
	TPUSHF		/DF P!
		FLTONE
	CDF P
	TPOPF
		FLAC
XABS,	CDF V		/TAKE ABS OF FLAC
	TAD I FLARGH
	SMA CLA
	TPOPJ
	CDF P
	TPUSHJ
		MMINSK
	TPOPJ
FLARGH,	FLARG+1

DCWBM,	7757
GETDEV,	0		/GET DEVICE TYPE FROM MONITOR TABLE
	TAD DCWBM	/DCB-1
	TAD DEVNO
	DCA IOWAIT
	CDF P
	TAD I IOWAIT
	CDF L
	JMP I GETDEV

IOWAIT,	0
	CDF L
	DRONE
	TAD TELSW
	SZA CLA
	JMP .-3
	JMP I IOWAIT

CNMTMP,	ZBLOCK 4

	PAGE
/LIBRARY COMMAND PROCESSOR

	/****** STORAGE ALLOCATION MAP ******
	/*****				*****
	/*	200	START,OCLOSE,NOCHAR,OSETUP
	/*	400	OOPEN,ICHAR,FILEST,EXITOS
	/*	600	IOPEN,POP,NAMEVL,XABS,XSGN,IOWAIT
	/*	1000	NAME,GTMON,DISMISS
	/*	1200	HANDAD,COMPARE,LOADER
	/*	1400	SAVPR,ENDLOD
	/*	1600	LOWLIB,LOADS,GOSUB,RETOUR
	/*	2000	OPEN,BUMP,XIN,XIDLE,INTERRUPT
	/*	2200	XCOM,CORITE,CCLOSE
	/*	2400	COHNDL,ARRAY,LOWOUT,LEXIT
	/*	2600	INTRPT,XOUT,ERROL
	/*	3000	ERROL,LOWIN,TERMNL
	 COMBUF=3200
	 OUTBUF=5200	/ALSO INIT
	 INBUFF=5600
	/*	6200	OUTPUT HANDLER
	/*	6600	INPUT HANDLER
	/*	7200	LIBRARY AND COMMON HANDLER
	/*****				*****
	/************************************

/READ A DEV:FILENAME.EX STRING INTO 'NAMLOC' & 'NEWDEV'
NAME,	0		
	DCA NAMRET	/SETUP RESTORE RETURN
	CLA CLL CMA
	DCA ECHFLG	/INIT. ECHO FLAG
	DCA FILEN	/SET TO LARGEST EMPTY
	JMS I [DISMIS	/'GETC' WON'T WITH THE USR IN CORE
	TAD [5723	/CODE FOR 'DSK:'
	DCA NEWDEV	/(DEFAULT DEVICE)
	DCA NEWDEV+1
	DCA NAMLOC	/CLEAR NAME AREA
	DCA NAMLOC+1	/(DON'T CLEAR ASSUMED EXTENSION)
	DCA NAMLOC+2
	TAD [NAMLOC	/INITIALIZE POINTERS
	DCA NMBASE
	CLA CMA
	DCA PERDSW
	DCA NAMECT
NAMEC,	CDF P
	TPUSHJ
		MGETC
	CIF P
	TSORTJ
		NAMLST-1
		NAMGO-NAMLST
	JMS DECODE	/MUST BE A-Z, 0-9
	JMP NAMOUT	/NO!, NOR IN NAMLST:END OF NAME
	SZL		/RESTORE CHARACTER
	TAD [57
	IAC		/6-BIT ASCII
	JMS NAMSTO
	JMP NAMEC	/CONTINUE LOOP

NAMSTO,	0
	DCA DECODE	/TEMPORARY STORAGE
	TAD NAMECT	/NO MORE THAN 6 CHARACTERS/NAME
	TAD [-6
US7700,	SMA CLA
	JMP NAMEC
	TAD NAMECT	/BUILD POINTER TO CHARACTER POS
	CLL RAR
	TAD NMBASE
	DCA TT
	TAD DECODE	/LEFT OR RIGHT HALF?
	SNL
	BSW		/LEFT, SHIFT OVER
	TAD I TT	/ADD IN OTHER HALF
	DCA I TT
	ISZ NAMECT	/BUMP COUNT
	JMP I NAMSTO

PERD,	TAD NAMLOC	/FOUND A PERIOD IN STRING
	SZA CLA
	ISZ PERDSW
	ERROR1		/DOUBLE PERIODS OR NO FILE NAME
		35	/BN=BAD NAME IN FILES
	DCA EXTENSION	/CLEAR EXTENSION
	ISZ NMBASE	/FAKE OUT POINTERS
	TAD [4
	JMP NAMEC-1

CHANEL,	TAD NAMLOC	/MOVE TO DEVICE AREA
	DCA NEWDEV
	TAD NAMLOC+1
	JMP NAME+10	/GET FILENAME

RESTOR,	TAD NAMRET	/COMES HERE ON '"'
	SZA
	DCA NAME	/CHANGE RETURN IF NON. 0
	JMP NAMEC
ECHCHK,	CDF P		/MOVE PAST COMMA
	TPUSHJ
		MGETC
	CDF P
	TPUSHJ		/MOVE TO END KEEP FIRST
		TERMER
	MQA
	TAD [-"E	/MUST BE 'E'
NAMOUT,	SNA CLA		/DECODE 'NO' EXIT IS NON-ZERO
	DCA ECHFLG	/SET ECHO FLAG
	JMP I NAME

DECODE,	0		/CHECK FOR A-Z, 0-9
	TAD CHARL	/IF YES ISZ RETURN
	TAD [-"9-1
	CLL
	TAD ["9+1-"0
	SZL
	JMP DCDYES	/NUMBER;CHAR-260;L=1
	TAD ["0-"Z-1
	CLL CML
	TAD ["Z-"A+1
	SNL
DCDYES,	ISZ DECODE	/ALPHA;CHAR-301;L=0
	JMP I DECODE

NMBASE,	0
PERDSW,	0
NAMECT,	0
TT,	0
NAMRET,	0
NAMLEN,	CDF P		/INDICATE OPT. FILE LENGHT
	TPUSHJ
		EVAL-1	/GETS NUMBER IN []
	TINTEG
	CLL RTL
	RTL
	AND [7760
	DCA FILEN
	JMP NAMEC

GTMON,	0		/LOCK THE USR IN CORE
			/(NOP IF ALREADY IN CORE)
	ISZ CTCINH	/WE MAY CALL OS/8
	CDF L
	CIF P
	JMS I USR
	10
	TAD [200	/SET POINTER FOR LATER CALLS
	DCA USR
	JMP I GTMON

DISMIS,	0		/IF THE USR IS IN, KICK IT OUT
	CLA CLL
	CDF L		/MAKE SURE
	TAD USR		/CHECK POINTER TO FIND OUT
	SPA CLA
	JMP DISMEX
	CIF P
	JMS I USR
	11
	TAD US7700	/RESET POINTER
	DCA USR
DISMEX,	TAD CTCINH	/CHECK IF 'ION' ALLOWED
	SZA CLA
	NOP/ION
	DCA CTCINH	/BACK IN FOCAL
	JMP I DISMIS

	PAGE
/HANDAD CALL:	HANDAD
		/SLOT
/SETS DEVNO; DEVICE NO. IN SLOT; ENTRYPOINT IN SLOT

HANDAD,	0		/LOADS HANDLER INTO PROPER SLOT
	TAD I HANDAD	/WHICH SLOT?
	ISZ HANDAD
	DCA SLOT
	JMS COMPARE	/IF THE HANDLER HAS THE SAME NAME,
		-2	/DON'T LOAD IT AGAIN
SLOT,		0
		NEWDEV-1
	JMP NOTEQ	/DIFFERENT NAMES, LOAD NEW HANDLER
	ISZ AUTO2
	TAD I AUTO2	/(SET BY 'COMPARE')
	DCA DEVNO	/MOVE DEVICE# (FOR SAVE AND CLOSE)
	TAD AUTO2	/POINTS TO DEVICE #
	DCA .+2
	JMS I [PUTDEV	/SO USR KNOWS IT'S IN CORE
		0
	JMP I HANDAD

NOTEQ,	ISZ SLOT	/BUMP POINTER TO SAVE NAME
	TAD NEWDEV	/MOVE NEW DEVICE NAME TO TABLE
	DCA I SLOT
	ISZ SLOT
	TAD NEWDEV+1
	DCA I SLOT
	ISZ SLOT
	JMS I [GTMON
RETRY,	TAD NEWDEV	/MOVE DEVICE NAME FOR MONITOR CALL
	DCA DEVC
	TAD NEWDEV+1
	DCA DEVC+1
	TAD I SLOT	/MOVE LOAD POINT
	IAC		/TWO PAGE HANDLER!
	DCA DLOAD
	CIF P
	JMS I USR	/CALL MONITOR (ALREADY IN CORE)
	1		/FETCH BY NAME
DEVC,	0		/NAME
	0		/RETURNS DEVICE NO.
DLOAD,	0		/RETURNS ENTRY POINT
	ERROR1		/DEVICE NOT AVAILABLE
		323	/ND=NO DEVICE
	CLL
	TAD DLOAD	/ENTRY POINT FOR HANDLER
	TAD [200	/IF THIS HANDLER IS IN PAGE 7600,
	SZL CLA		/DON'T CHECK FOR LEGALITY
	JMP HANDOK	/SYSTEM HANDLER
	TAD DLOAD	/IF THE HANDLER WAS NOT LOADED
	AND [7600	/INTO THE PROPER PAGE, RELOAD IT
	CLL CIA
	TAD I SLOT	/PROPER LOADING ADDRESS
	SNA CLA
	JMP HANDOK	/EVERYTHING'S ALL RIGHT
	DCA DLOAD	/CLEAR ENTRY POINT
	JMS I [PUTDEV	/TELL USR THE HANDLER IS NOT
		DEVC+1	/IN CORE ANYMORE
	JMP RETRY	/LOAD IT THIS TIME

HANDOK,	ISZ SLOT	/BUMP POINTER TO DEVICE #
	TAD DEVC+1	/SAVE IT
	DCA I SLOT
	ISZ SLOT	/MOVE TO ENTRY POINT
	TAD DLOAD	/SAVE ENTRY
	DCA I SLOT
	TAD DEVC+1	/GET DEVICE #
	DCA DEVNO	/SAVE IT AND EXIT
	JMP I HANDAD

COMPARE,0		/COMPARE TWO BLOCKS
	TAD I COMPARE	/CALLING SEQUENCE:
	ISZ COMPARE	/JMS COMPARE
	DCA XCNTR	/	-# OF WORDS TO CHECK
	TAD I COMPARE	/	FIRST-1
	ISZ COMPARE	/	SECOND-1
	DCA AUTO2	/RETURN IF NO MATCH
	TAD I COMPARE	/RETURN IF MATCH
	ISZ COMPARE
	DCA AUTO3
AGAIN,	TAD I AUTO2	/COMPARE TWO WORDS
	CIA
	TAD I AUTO3
	SZA CLA
	JMP I COMPARE	/NO MATCH
	ISZ XCNTR	/FINISHED?
	JMP AGAIN	/NO, CHECK NEXT TWO
	ISZ COMPARE	/YES, BUMP RETURN POINTER
	JMP I COMPARE
NAMLST,	"(	/SUBSCRIPTED FILE NAMES
	".	/EXTENSION
	",	/ECHO
	":	/DEVICE
	""	/RESTORE OLD IN/OUT
	"[	/FILE LENGHT SPEC.
	" 	/SPACE: IGNORE

	/THIS IS FOR CHAINING TO ANOTHER PROGRAM
LOADER,	JMS I [OCHK	/DON'T FORGET TO CLOSE THE FILES
	JMS I [NAME	/OR FOR OVERLAYING FOCAL ITSELF
	TAD [2326	/EXTENSION "SV" IS FORCED ON
	DCA EXTENSION	/IT HAS TO BE A SAVE FILE:CHAIN
	JMS I [IOWAIT
	ISZ CTCINH	/TURN ON INT. IF COMING BACK
	TAD [NAMLOC	/POINTER TO NAME
	DCA LOADUS+2
	TAD [2
	DCA LOADUS+1
	IAC		/CHAIN EXPECTS IT TO BE ON SYS:
	CIF P
LOADUS,	JMS I USR
		2	/LOOKUP RETURNS FILE START IN ARG2
		NAMLOC
		0
	ERROR1		/USR DID NOT FIND IT
		47	/CH=CHAINING ERROR
	DCA LIBBLK	/KILL LIB HANDLER;CHAIN DOES RESET
	TAD (6		/OK! CHANGE USR FUNCTION TO CHAIN
	DCA LOADUS+1
	JMP LOADUS-1	/BY-BY!! MIGHT SEE YOU AGAIN

COMLIST,"S		/SAVE
	"C		/CALL
	"R		/RUN
	"D		/DELETE
	"G		/GOSUB
	233		/'LIBRARY R(ESCAPE)'
	"E		/EXIT
	"L		/LOAD; CHAIN A PROGRAM
OCLOSR,	JMS I [OCLOSE	/CLOSE OUTPUT FILE
	JMP I [CONTIN

	PAGE
SAVPR,	0		/CALLED BY 'SAVER' AND 'GOSUB'
	TAD [NAMLOC	/POINTER TO NAME
	DCA SAVEPT
	CDF P
	TAD I (BUFR
	DCA BLOCK	/SAVE TEMP. PROGRAM LENGTH
	TAD I (7666	/GET SYSTEM DATE
	SNA		/IF BOOTED THEN 1977
	CMA
	AND [7
	TAD (6760	/'70'
	DCA SAVBLK
	TAD I (7666	/AGAIN FOR MONTHS
	AND [7400
	BSW
	CLL RAR
	TAD (MONAME	/ADRESS OF NULL MONTH NAME
	DCA RECORD
	CDF T
	TAD [LINE0+2
	DCA AUTO1	/SET AUTO-INDEX FOR TRNSFR.
	TAD NAMLOC
	DCA I AUTO1
	TAD NAMLOC+1
	DCA I AUTO1	/TRANSFER NAME
	TAD NAMLOC+2
	DCA I AUTO1
	TAD EXTENS
	BSW
	AND [77
	TAD (5600
	DCA I AUTO1	/TRANSFER .F
	TAD EXTENS
	AND [77
	BSW
	DCA I AUTO1	/REST OF EXTENSION: C@
	TAD I RECORD	/GET MONTH NAME
	DCA I AUTO1	/SAVE
	ISZ RECORD
	TAD I RECORD	/SECOND HALF+ "-"
	DCA I AUTO1
	TAD SAVBLK
	DCA I AUTO1	/SAVE YEAR
	TAD BLOCK
	IFNDEF KEY<
	DCA I (LINE0-1	/SAVE PROGRAM LENGTH
	>
	IFDEF KEY<
	CLA CLL
	>
	JMS I [GTMON	/GET USR;RESETS DF
	JMS I [OCHK	/CLOSE OUTPUT FILE, AVOID TROUBLE
	JMS I [HANDAD	/AND GET HANDLER
		LIBBLK-1
	TAD BLOCK
	AND [7600	/MASK OFF
	CLL RAR		/CONVERT TO PAGES
	DCA BLOCK	/FOR HANDLER
	TAD BLOCK	/ROUND UP TO BLOCKS
	TAD [100
	AND [7600
	CLL RTR
	RAR
	DCA RECORD	/FOR MONITOR 'ENTER':BITS 0-7
	TAD RECORD	/GET DESIRED LENGTH
	TAD DEVNO	/(SET BY 'HANDAD')
	CIF P
	JMS I USR	/ENTER OUTPUT FILE
	3
SAVEPT,	NAMLOC
	0
	ERROR1		/NO ROOM ON DEVICE
		65	/DF=DEVICE FULL
	TAD RECORD	/SHIFT FOR CLOSING LENGTH
	CLL RTR
	RTR
	DCA SAVBLK
	TAD DEVNO	/CLOSE THE FILE BEFORE WE WRITE IT!
	CIF 10		/(SURE, IT'S CHEATING, BUT
	JMS I USR	/IT SAVES TIME!)
	4		/CLOSE
	NAMLOC
SAVBLK,	0		/NO. OF BLOCKS
	JMP DERR	/IMPOSSIBLE ERROR!
	TAD SAVBLK	/SAVE THIS CRAP TO REMEMBER
	CIA		/WHERE THIS PROGRAM IS
	DCA LIBLEN	/IN CASE WE WANT TO GOSUB
	TAD SAVEPT
	DCA LIBFIL
	TAD NEWDEV
	DCA LIBDEV
	TAD NEWDEV+1
	DCA LIBDEV+1
	TAD SAVEPT	/MOVE STARTING BLOCK FOR WRITE
	DCA POINT4
	TAD (4021	/GET FUNCTION WORD
	TAD BLOCK	/HOW MUCH TO WRITE
	DCA BLLL
	JMS I LIBHND
BLLL,	0		/WRITE (BLOCK) BLOCKS FROM FIELD 2
	200		/FROM 200 UP
POINT4,	0
	JMP DERR	/GO COMPLAIN ABOUT DEVICE
	JMP I SAVPR
LIBLEN,	0		/SAVED LENGTH
LIBDEV,	ZBLOCK 2
RECORD,	0
BLOCK,	0

ENDLOD,	TAD NEWDEV	/SAVE THIS STUFF SO WE
	DCA LIBDEV	/KNOW WHERE WE ARE
	TAD NEWDEV+1
	DCA LIBDEV+1
	TAD STBLK
	DCA LIBFIL
	TAD FLNGTH
	DCA LIBLEN
	JMP I	(FILSEC

RESMON,	4207		/'JMS SHNDLR'
	5000		/WRITE 10 PAGES FIELD 0
	0000		/FROM ADRESS 0
	0033		/IN BLOCK 33

	PAGE
	/ACTUAL LIBRARY PROCESSOR
	/STARTING WITH COMMAND DECODE:

LOWLIB,	DCA GOSWIT
	TAD [603
	DCA EXTENSION
	CDF P
	TPUSHJ
		TERMER
	MQA
	CIF P
	TSORTJ		/AND BRANCH TO APPROPRIATE ROUTINE
		COMLIST-1
		COMPO-COMLIST
	ERROR1		/SORRY, CHARLIE!
		270	/LI=LIBRARY COMMAND ERROR

	/LOOKUP AND LOAD ROUTINES

CHAINER,ISZ GOSWIT	/THESE ALL DO THE SAME THING
GOSUB1,	ISZ GOSWIT	/AND THEN GO TO DIFFERENT PLACES
FETCHER,ISZ GOSWIT
	JMS I [OPEN	/CALL THE HANDLER AND LOOKUP FILE
		LIBBLK-1
		2
	JMP .+6		/TTY: NOT A DIRECTORY DEVICE
	ERROR1
		337	/NP=NO PROGRAM FOUND
	JMS I [DISMISS
	JMS I (GETDEV	/GET DEVICE TYPE
	SMA CLA
	ERROR1		/NOT A DIRECTORY DEVICE
		63	/DD=NOT A DIR. DEV.
	CDF P
	TPUSHJ
		PGETLN	/SOME COMMANDS HAVE LINE NUMBERS
LOADGO,	JMS I [DISMISS	/ONLY USED BY 'RETOUR'
	TAD STBLK	/BLOCK TO READ FROM
	DCA POINT6
	CDF T
	TAD I (PDLXR	/BOTTOM OF PDL
	CDF L
	TAD [-20
	AND [7600	/PAGES
	BSW
	CLL RTR		/BLOCKS
	TAD FLNGTH	/NOW COMPARE WITH LENGTH OF FILE
	SPA CLA
	ERROR1		/PROGRAM TOO LONG
		373	/PL=PROGRAM LENGTH ERROR
	CLA CLL CMA RAL	/(=-2)
	TAD GOSWIT	/IS THIS A GOSUB?
	SZA CLA
	JMP NOGOSB	/NO, SKIP THIS GARBAGE
	TAD CHARL	/YES, SAVE PROGRAM NAME, ETC.
	TPUSHA		/PDL NOW CONTAINS:
	TAD [215	/CHAR,DEV,FILE LENGTH,START BLOCK
	CDF P
	DCA I DCHAR
	CDF L
NOGOSB,	TAD FLNGTH	/COMPUTE FUNCTION WORD
	CIA
	BSW
	CLL CML RAL	/SET TO SEARCH FORWARD
	TAD (20		/FIELD 2
	DCA LENF1
	ISZ CTCINH
	JMS I LIBHND	/GET THE PROGRAM
LENF1,	1221
	200
POINT6,	0
	JMP DERR
	JMP I (ENDLOD
GOSUB,	TAD LIBFIL	/CHECK FOR CURRENT PROGRAM
	SZA
	JMP NOSAVE	/NO NEED TO SAVE CORE
	TPUSHF		/MOVE 'FOCAL.TM' TO NAME AREA
		FOCTXT
	TPOPF
		NAMLOC
	TAD [5723	/DEVICE 'DSK' FOR SAVE
	DCA NEWDEV
	DCA NEWDEV+1
	JMS I (SAVPR	/SAVE FILE (LEAVE USR IN CORE)
	TAD [603	/RESET EXTENSION TO 'FC'
	DCA EXTENSION
	TAD LIBFIL	/STARTING BLOCK
NOSAVE,	TPUSHA		/'LIBFIL' STILL IN AC
	TAD I (LIBLEN
	TPUSHA
	TPUSHF
		LIBDEV
	JMP GOSUB1

RETOUR,	TPOPA		/GET BACK ALL THE JUNK WE SAVED
	CDF 10		/FOR THE LAST GOSUB
	DCA I DCHAR	/IN-LINE CHARACTER
	CDF
	TPOPF		/DEVICE NAME
		NEWDEV
	TPOPA		/FILE LENGTH
	DCA FLNGTH
	TPOPA		/STARTING BLOCK
	DCA STBLK
	JMS I [HANDAD	/GET THE HANDLER BACK
		LIBBLK-1
	JMP LOADGO	/LOAD THE PROGRAM

FILSEC,	CIF CDF T
	TAD	CODENU
	TAD I	(PC0+2
	DCA	POINT6
	TAD I	(PC0+2
	SZA
	JMP I	POINT6
	TAD I (LINE0-1
	CDF P
	DCA I (BUFR
	CIF CDF L
	IFNDEF KEY<
	JMP I [EXITOS
CODENU,	TEXT  "WVDM"
	>
	IFDEF KEY<
	SKP
CODENU,	KEY
	JMP I	.+1
	KEYER
	>
	PAGE
	/MISCELLANEOUS GENERAL-PURPOSE ROUTINES

	/THIS IS THE GENERAL OPEN SUBROUTINE
	/CALLNG SEQUENCE:
	/JMS I [OPEN
	/HANDLER BLOCK
	/MONITOR CALL CODE
	/RETURN IF TTY: IS DEVICE
	/ERROR RETURN
	/NORMAL RETURN
	/SETS STBLK, FLNGTH ON PAGE ZERO

OPEN,	0
	JMS I [NAME	/GET DEVICE AND FILENAME
	JMS I [COMPARE	/DEVICE 'TTY:' IS SPECIAL
		-2
		NEWDEV-1
		TTYTXT-1
	JMP OTHER	/DEVICE OTHER THAN TTY
	ISZ OPEN	/INCREMENT TO PROPER RETURN
	ISZ OPEN
	JMP I OPEN
OTHER,	TAD I OPEN	/GET HANDLER BLOCK TO USE
	DCA HND
	ISZ OPEN
	TAD [NAMLOC	/POINTER TO NAME
	DCA NAMPT
	JMS I [GTMON
	JMS I [HANDAD	/GET THE HANDLER
HND,		0	/SET TO HANDLER BLOCK
	TAD I OPEN	/GET MONITOR CALL CODE (2 OR 3)
	ISZ OPEN
	DCA CALL
	DCA LNGTH	/FOR MONITOR KLUDGE
	TAD DEVNO	/DO THE CALL
	TAD FILEN	/ADD IN OPT. FILE LENGHT
	CIF 10		/DEV # IN AC
	JMS I USR	/2: LOOKUP
CALL,	0		/3: ENTER
NAMPT,	NAMLOC		/NAME POINTER;RETURNS START BLOCK
LNGTH,	0		/RETURNS -FILE LENGTH IN BLOCKS
			/TENTATIVE FOR ENTER
	JMP OTHER-2	/CALLING ROUTINE HANDLES ERROR
	TAD LNGTH	/MOVE PARAMETERS TO PAGE ZERO
	DCA FLNGTH
	TAD NAMPT
	DCA STBLK
	JMP OTHER-3	/AND TAKE NORMAL RETURN
BUMP,	JMS I [NAME	/DELETE IS AN EASY ONE (THANK GOD!)
	JMS I [GTMON
	JMS I [HANDAD
		LIBBLK-1
	JMS I [OCHK	/CLOSE ANY OPEN OUTPUT FILE
	CIF 10		/DELETE THE FILE
	TAD DEVNO
	JMS I USR
	4
	NAMLOC
	0
	ERROR1
		123	/FD=FILE DELETION ERROR
	DCA LIBFIL	/IF CURRENT PROGRAM DELETED
	JMP I [EXITOS

OCLCHK,	TAD OPNFLG
	SNA CLA
	ERROR1
		344	/OE=OPEN OUTPUT ERROR
	JMS I [OCLOSE
	TAD (YINT
	DCA OPEN
	JMP OTHER

PUTDEV,	0		/TELL USR A HANDLER IS IN OR OUT
	TAD I PUTDEV	/GET POINTER TO DEV# AND ENTRY
	DCA XIN
	TAD I XIN	/DEVICE#
	ISZ XIN		/BUMP POINTER TO ENTRY
	TAD (7646	/MONITOR TABLE
	DCA PUTTEM	/POINTER TO 'HANDLER IN CORE' FLAG
	TAD I XIN	/FLAG IS HANDLER ENTRY
	CDF P		/TABLE IS IN FIELD ONE
	DCA I PUTTEM
	CDF L
	ISZ PUTDEV
	JMP I PUTDEV

XIN,	0		/VIA (INDEV)
	DRONE
	TAD INBUF
	SPA SNA
	JMP .-3
	DCA PUTDEV
	DCA INBUF
	KCC		/SET READER RUN
	TAD PUTDEV
	JMP I XIN
OCHK,	0		/IF ANY FILE EXISTS CLOSE IT
	JMS I [CCLOSE
	JMS I [OCLOSE
	JMP I OCHK

	KCC
MEXIT,	JMS I [IOWAIT	/BE SURE ^C CAN BE SENT
	TAD (203
	JMS I [TERMNL	/TYPE ^C
LEXIT,	TPUSHF		/LIBRARY EXIT ROUTINE
		RESMON	/ALSO USED BY CTRL.C
	TPOPF
		7600	/RESTORE MONITOR CALL
	JMS I [OCHK	/CLOSE FILES
	JMS I [DISMISS	/BOOT USR OUT
	JMS I [IOWAIT	/WAIT FOR TTY;IOF
	JMP I [7600	/LEAVE FOCAL

MORE,	0
	CDF V
	NOP		/SKIP1
	JMP MORE2	/VAR. FLD STILL ON
	DCA I XNMBSG	/CLEARS HORD VAR "#"
	NOP		/CLEAR1
MORE2,	NOP		/SKIP2
	JMP MORE3
	DCA I XEXCLA	/VARIABLE "!"
	NOP		/CLEAR2
MORE3,	NOP		/SKIP3
	JMP NOMORE
	DCA I XQUOTS	/VARIABLE """
	NOP		/CLEAR3
NOMORE,	NOP		/CLEAR ODD FLAGS
	NOP
	NOP
	NOP
	CDF L
	JMP I MORE
XNMBSG,	NMBSGN
XEXCLA,	EXCLA
XQUOTS,	QUOTS
PUTTEM,	0

	PAGE
XCOM,	TINTEG		/COMMON FOR 4096 4-W. VARIABLES
	DCA BLKTMP
	TAD BLKTMP
	AND [377	/ADRESS IN BUFFER
	CLL RTL		/*4 : 4-WORD
	TAD I (COSTA	/START OF BUFFER
	TPUSHA
	TAD BLKTMP
	AND [7400	/:8 BUFFERS
	BSW		/OF 4 BLOCKS EACH
	TPUSHA		/STORE RECURSIVELY
	TPUSHJ		/PUT OR GET?
		ARG
	CLA CMA		/GET
	DCA GEPUSW	/PUT
	TPOPA		/GET BLOCK #
	TPUSHJ
		COMEXT	/GET BLOCK
	ISZ GEPUSW
	JMP COMPUT
	TPOPA		/NOW GET ADRESS
	DCA GEPUSW
	TPUSHF
GEPUSW,		COMBUF
	CDF P
	TPOPF
		FLAC
	TPOPJ
COMPUT,	TPOPA
	DCA BLKTMP
	CDF P
	TPUSHF
		FLAC
	TPOPF
BLKTMP,		COMBUF
	IAC
	DCA COWRIT
	TPOPJ

ARG,	TAD CHARL
	TAD [-",
	SZA CLA
	TPOPJ
	CDF P
	TPUSHJ
		EVAL-1
	IAC
	TPOPJ
COMEXT,	DCA THSBLK	/ASKED FOR BLOCK
	TAD THSBLK
	CIA
	TAD SETBLK	/IS IT ALLREADY HERE?
	SNA CLA
	TPOPJ		/YES.EXIT
	CLL CML IAC RAL	/+3 SO THAT WE DON'T
	TAD THSBLK	/ WRITE ON ANOTHER FILE
	TAD CLNGTH	/SET TO 0 BY CCLOSE
	SMA CLA
	ERROR1		/WE ARE ASKING FOR TO MUCH!
		4	/AE=ARRAY EXCEEDING CORE LIMITS
	JMS CORITE	/WRITE OUT IF ANY MODIFICATIONS
	TAD COMFLG	/ OR ZEROING
	SNA CLA		/IN OR OUT?
	JMP COINPT
	TAD COCNT	/LARGEST SO FAR
	CIA
	TAD THSBLK
	SPA CLA
	JMP COINPT	/THSBLK .LT. COCNT;ALREADY OUT
	TAD COCNT
	DCA SETBLK	/SET TO WRITE AND CLEAR NEXT BUFF
	JMP COMEXT+1

COINPT,	CLA CLL		/LNK=0 FOR READ
	TAD THSBLK	/READ ASKED FOR BLOCK
	MQL
	JMS I (COHNDL
	TAD THSBLK
	DCA SETBLK	/NOW RESET
	DCA COWRIT	/CLEAR WRITE FLAG
	TPOPJ
CORITE,	0		/ALSO CALLED BY CCLOSE
	TAD COWRIT
	SNA CLA		/ONLY WRITE IF NEW DATA
	JMP I CORITE
	CLA CLL CML	/LNK=1 FOR WRITE
	TAD SETBLK	/WRITE BLOCK IN CORE
	MQL
	JMS I (COHNDL
	CLA CMA		/NOW CLEAR BUFFER
	TAD I (COSTA
	DCA AUTO1
	TAD [-2000
	DCA XCNTR
	DCA I AUTO1
	ISZ XCNTR
	JMP .-2
	TAD SETBLK
	CIA
	TAD COCNT	/CHECK IF LAST BUFFER
	SZA CLA
	JMP I CORITE
	CLA CLL IAC RTL	/4
	TAD COCNT
	DCA COCNT	/UPDATE COCNT
	JMP I CORITE

/SUBROUTINE CALLED BY 'OPEN TERMINATE' AND 'OCHK'
CCLOSE,	0
	TAD CLNGTH
	SNA CLA
	JMP I CCLOSE
	ISZ COWRIT	/FORCE A LAST WRITE
	JMS CORITE
	TAD COMFLG
	SNA CLA
	JMP CLOOUT	/ONLY CLOSE INTERNALLY
	JMS I [GTMON
	TAD DEVNO
	CIF P
	JMS I USR
		4	/CLOSE
	CNMTMP
COCNT,	0
	ERROR1
		2	/AC=ARRAY CLOSE ERROR
CLOOUT,	DCA CLNGTH
	DCA SETBLK
	DCA COMFLG
	JMP I CCLOSE

	PAGE
COHNDL,	0	/SUB FOR READING OR WRITING ARRAY BUFFER
	SZL
	JMP .+6		/WRITE
	TAD SETBLK	/READ
	TAD [12		/IF LAST WRITTEN BLOCK+4+7
	CMA
	TAD THSBLK	/IS SMALLER THAN ASKED FOR BLOCK
	CLA RTL		/ROTATE LINK FOR SEARCH FORWARD
	TAD [2000	/HERE LNK=0:READ;1:WRITE
	RAR		/5000:WRITE;1000:READ;8 PAGES
	DCA COARG	/1001:READ FORWARD
	MQA		/BLOCK
	TAD CBLOCK	/FIRST OF FILE
	DCA COSTA+1
	TPUSHF
		COMDEV
	TPOPF
		NEWDEV	/GET HANDLER BACK
	JMS I [HANDAD
		LIBBLK-1
	ISZ CTCINH
	JMS I LIBHND
COARG,	0
COSTA,	COMBUF
	0
	JMP DERR
	JMS I [DISMIS
	JMP I COHNDL

CBLOCK,	0
COMDEV,	ZBLOCK 2
/"OPEN ARRAY"

ARRAY,	JMS I [CCLOSE	//FILE STILL OPEN?
	TAD (0601	/ASSUMED EXTENSION .FA
	DCA EXTENS
	JMS I [OPEN
		LIBBLK-1
		2	/FIRST DO A LOOKUP
	JMP NODIR	/TTY NOT A DIRECTORY DEVICE
	SKP		/THERE WAS NO FILE OF THAT NAME
	JMP COMON	/FOUND IT!
	TAD ARPNT	/FAKE 'OPEN' FOR ENTER
	DCA I [OPEN
	JMP I (OTHER
		LIBBLK-1
		3	/ENTER
ARPNT,	.-2		/IT CAN'T COME HERE;ALREADY TESTED
	ERROR1		/DEFINITELY AN ERROR
		5	/AF=ARRAY FULL
	CLA CLL CML IAC RAL	/3
COMON,	DCA REDFLG	/SET TEMP FLAG
	JMS I [GETDEV	/I.E. A DISPLAY IS NO GOOD
	SMA CLA
NODIR,	ERROR1
		3	/AD=ARRAY DEVICE ERROR
	TPUSHF		/EVERYTHING IS OK
		NAMLOC
	TPOPF
		CNMTMP	/SAVE NAME FOR CLOSE
	TAD NEWDEV
	DCA COMDEV
	TAD NEWDEV+1
	DCA COMDEV+1
	TAD STBLK
	DCA CBLOCK	/SAVE FIRST BLOCK
	CLL
	TAD FLNGTH
	TAD [100	/IS LENGTH GREATER THAN 100BLOCKS?
	SNL
	CLA CLL		/YES;IGNORE
	TAD NODIR-1	/-100
	DCA CLNGTH	/STORE LENGTH .LE. 100 (NEG)
	TAD REDFLG
	CLL RAR		/SET LINK IF OUT
	DCA COMFLG
	DCA I (THSBLK
	SZL
	JMP .+3
	TPUSHJ
		COINPT	/READ FIRST BUFFER IF INPUT
	DCA I (COCNT
	JMP I [CONTIN
	*2521	/MAGIC ADRESS FOR NICE PATTERN
IDLER2,	-200		/2521
XIDLE,	0
	TAD IDLER1	/NULL JOB
	ISZ IDLER2	/2524
	JMP .-1		/2525
	ISZ IDLER3
	JMP XIDOUT
	CLL RAL
	SNL
	CLA CMA
	DCA IDLER1
	TAD [-200
	DCA IDLER3
XIDOUT,	JMS I (INTRPT
	TAD [-200
	DCA IDLER2
	JMP I XIDLE
IDLER1,	0
IDLER3,	-6

CCLOSR,	JMS I [CCLOSE
	JMP I [CONTIN

REDFLG,	0
LOWTEM,	0		/KEEP HERE : 'POPF'

LOWOUT,	0	/OUT DRIVER
	DCA LOWTEM
	TAD I [ECHO	/CHK ECHO;CDF P STILL ON
	CDF L
	TAD INECH
	SPA CLA		/0+-1:NO PRINT
	JMP OUTOUT
	TAD OUTFLG
	SNA CLA		/0:TTY
	JMP LOWTTO
	TAD LOWTEM
	JMS I [NOCHAR	/WRITE ON FILE
	TAD OUTECH
	SZA CLA		/0:ECHO
	JMP OUTOUT
LOWTTO,	TAD LOWTEM
	JMS I [TERMNL	/ON TTY
OUTOUT,	CIF CDF P
	JMP I LOWOUT

	PAGE
/INTERRUPT PROCESSOR

INTRPT,	0
	CLA CLL
	RDF
	TAD CCDI
	DCA INTEXI
	TSF		/GIVE OUTPUT PRIORITY
	JMP KINT
	TCF
	DCA TELSW	/TURN OFF THE IN-PROGRESS-FLAG
	CDF P
	TAD I OPTRI
	SNA
	JMP KINT
	TPC		/TYPE NEXT
	DCA TELSW	/CLEAR AC AND TURN ON THE FLAG
	DCA I OPTRI	/ZERO OUT THE DATA AREA
	TAD OPTRI
	IAC
	AND [37
	TAD OPTR0
 	DCA OPTRI
KINT,	KSF		/CHECK FOR KEYBOARD FIRST
	JMP INTEXI-1	/MORE TO COME
	KRS		/INPUT CHARACTER
	KCF		/CLEAR FLAG
	AND [177	/IGNORE BLANK AND L-T AND PARITY BIT
	SNA
	JMP INTEXI-2	/GO INITIATE NEXT READ
	TAD [200
	DCA INBUF
	TAD INBUF
	TAD [-203	/CTRL.C?
	SNA
	JMP I [MEXIT	/YES
	CLL RAR		/(CHAR-203)/2=6 FOR CTRL.O AND P
	TAD [-6		/IS IT?
	SNA CLA
	JMP RECOVR	/YES A BREAK
	CDF V
	TAD INBUF
	DCA I XDOL	/SAVE IN INPUT VARIABLE
	SKP
	KCC
	JMS I [MORE
INTEXI,	CIF CDF L
	JMP I INTRPT

XDOL,	DOLL
CCDI,	CIF CDF 0

KSTAT,	0
BREAK,	0
CTCADR,	MEXIT
CTPADR,	RECOVR

OFILES=7600
OPTR0,	OFILES
OPTRO,	OFILES
OPTRI,	OFILES
XOUT,	0		/VIA (OUTDEV)
	DCA ERROL
	ISZ CHRCNT
	CDF L
	DRONE		/MAY SKIP
	CDF P
	TAD I OPTRO	/ANY ROOM ?
	SZA CLA		/A CHAR. IS NONZERO
	JMP .-5		/NO = WAIT
	TAD TELSW	/IN PROGRESS ?
MIN40,	SMA SZA CLA
	JMP .+5
	TAD ERROL	/NO
	TLS		/TYPE CHAR
	DCA TELSW	/SET IN PROGRESS FLAG
	JMP .+10	/RETURN
	TAD ERROL	/SEND DATA
	DCA I OPTRO
	TAD OPTRO	/SET POINTERS
	IAC
	AND [37
	TAD OPTR0
	DCA OPTRO
	CDF L
	JMP I XOUT
	*2736

ERRONC,	-2
DKSTAT,	KSTAT

ERROL,	0	/ERROR PRINT AND RESET
	CLA CMA CLL
	TAD I ERROL	/GET ERROR CODE
	DCA ERRCOD	/DEFINED BY TECO CODE:
	/^O^T&37-1*20UY^T&37-1+QY=^D
	JMS I [IOWAIT	/WAIT FOR OUTPUT TO FINISH
	TAD ERRCOD
RECOVR,	IAC		/AB=A BREAK
RESTRT,	DCA ERRCOD	/AA=START ALL OVER
	ISZ ERRONC	/AVOID STAYING IN CLOSE ERROR
	JMS I [OCHK
	DCA CTCINH	/TO KEEP INTERRUPT OFF
	JMS I [DISMISS
	CLA CLL CMA RAL	/NOW WE ARE OK
	DCA ERRONC
	TAD DKSTAT
	6047		/SET ETOS STATUS
	CLA CLL
	DCA INBUF	/CLEAR INPUT BUFFER
	TAD MIN40	/CLEAR OUTPUT BUFFER
	DCA XCNTR
	CMA
	TAD OPTR0
	DCA AUTO1
	TAD OPTR0
	DCA OPTRI
	TAD OPTR0
	DCA OPTRO
	DCA OUTECH
	DCA INECH
	DCA OUTFLG	/CLEAR IN/OUT FLAGS
	DCA INFLG
	CDF P
	DCA I AUTO1
	ISZ XCNTR
	JMP .-2
	CLA IAC		/RESET ECHO TO ON
	DCA I [ECHO
	CDF L
	TAD [215	/BACK TO START OF LINE
	JMS TERMNL
	TAD [212
	JMS TERMNL
	TAD (213	/RESET COUNTERS
	JMS TERMNL
	TAD [77
	JMS TERMNL	/?
	TAD ERRCOD
	CLL RTR
	RTR
	TAD (301	/FIRST LETTER
	JMS TERMNL
	TAD ERRCOD
	AND (17
	TAD (301	/SECOND LETTER
	JMS TERMNL
	CIF CDF P
	JMP I .+1	/FOR LINENO PRINTOUT
		ENDERR

/IN DRIVER

LOWIN,	0
	TAD INFLG
	SPA
	JMP EOF		/-:END OF FILE
	SNA CLA
	JMP LOWTTI	/0:TTY
	JMS I (ICHAR	/INPUT FROM FILE
	SKP
LOWTTI,	JMS I (XIN	/FROM TTY
	CIF CDF P
	JMP I LOWIN
EOF,	ERROR1
		105	/EF=END-OF-FILE

TERMNL,	0	/HANDLER FOR TTY DEVICE
	AND [177
	DCA LOWIN
	TAD LOWIN
	TAD (-17	/CHAR-17
	CLL
	TAD (10		/OVERFLOW IF 7.LE.CHAR.GE.16
	SZL CLA		/FORMAT CHAR.?
	JMP TERCTL
	TAD LOWIN	/CONTRL.CHAR.?
	AND TERNMV
	SZA CLA
	JMP TEROUT	/NO;OUT NORMAL
	TAD INECH	/O I TTY:?
	SMA		/FALLS THRU WITH -1;SO NO MOVE
	JMP TERCON	/NO. CONVERT TO ^X
TERMMV,	IAC		/WITH NEXT GIVES -2
TERNMV,	CMA CLL		/-1, ALSO MASK 140
	TAD CHRCNT
	DCA CHRCNT	/MODIFIED CHAR.CNT.
TEROUT,	TAD LOWIN	/GIVE OUT STANDARD
	JMS I (XOUT
TERCHK,	TAD CHRCNT	/CHECK IF OVERFLOW
	SPA CLA
	JMP I TERMNL	/NO. GO BACK
	TAD [215	/FALLS IN FROM LINE OVERFLOW
	JMS I (XOUT
TERLFD,	JMS TERLF
	JMP LINRES	/NOT AT END OF PAGE
TERFF,	TAD LINCNT	/END OF PAGE OR FF.
	TAD [-6		/EXTRA SKIP
	DCA LINCNT
	JMS TERLF
	JMP .-1		/NOT AT END;CONTINUE
TERRES,	TAD PAGLEN	/AT END	*****
	DCA LINCNT	/RESET
	JMP LINRES	/NOW RESET LINE
TERCTL,	TAD LOWIN	/BUILD JUMP
	TAD TERJMP
	DCA .+1
	HLT		/MUST!! BE 6 AFTER 'TERRES'*****
	JMP TERNMV	/" 7":BELL;UNCHANGED;NO MOVE
	JMP TERMMV	/"10":BSPC; " " ;BACKUP CHAR.CNT.
	JMP TERTAB	/"11":HTAB
	JMP TERLFD	/"12":LF  ;RESETS CHAR.CNT.
TERJMP,	JMP TERRES	/"13":VTAB;RESET
	JMP TERFF	/"14":FFED;SIMULATE
	JMP TERCR	/"15":CRET;CRLF
LINNEW,	TAD [215	/"16":CRONLY
	JMS I (XOUT
	CLA CLL
TERCR,	TAD [215
	JMS I (XOUT	/FOR DELAY
LINRES,	TAD LINLEN	/RESET CHAR. CNTR.
	DCA CHRCNT
	JMP I TERMNL

TERLF,	0		/SUB FOR GENERATING LF,S
	TAD [212
	JMS I (XOUT
	ISZ LINCNT
	JMP I TERLF
	ISZ TERLF	/SECOND RETURN:AT END
	JMP I TERLF

TERTAB,	TAD (240
	JMS I (XOUT
	TAD CHRCNT
	AND [7
	SZA CLA
	JMP TERTAB
	JMP TERCHK	/GO CHECK IF END OF LINE
TERCON,	TAD (136	/^
	JMS I (XOUT
	TAD [100	/CONVERT;100+LOWIN=ALPHA
	JMP TEROUT
LINCNT,	-102
LINLEN,	-110
PAGLEN,	-102		/TOTAL LENGTH-6

	*COMBUF
	ZBLOCK 1000
	IFNDEF KEY<
	ZBLOCK 1000
	>
/FILE SECURITY DATAPLAN-FOS877
/TO BE ASSEMBLED WITH PARAMETER KEY=CODENU
/CALL PROGRAM TO BE MODIFIED WITH L C XXXXX
/PROGRAM THAN SAVES AGAIN AND COMES BACK FOR MORE
/IF FOS8 IS TO BE RECODED:INSERT THE CODE-NUMBER FIRST
/ADRESS FOR CODE-NUMBER IN FOCAL IS:01760

	IFDEF KEY<
	APPLEN=55

KEYER,	CDF 0
	TAD I (CODENU	/TRANSFER CODE-NUMBER
	CIA
	DCA TMCOD
	TAD TMCOD	/NEG. TEMP
	CIA
	DCA I (CODE	/IN APPEN
	CDF 10
	TAD I (BUFR	/GET LENGTH OF PROGRAM
	CLL
	TAD (APPLEN-GORETN	/SEE IF APPEN FITS IN PAGE
	SZL CLA
	ERROR1
		373	/?PL
	TAD I (BUFR
	DCA APPSTR
	TAD	APPSTR
	AND	(177
	DCA	KRELOC	/RELOCATION VALUE
	TAD	KRELOC
	TAD	(APPLEN-200	/DOES CODE FIT?
	SNL CLA
	JMP	.+6	/YES
	DCA	KRELOC	/NO RELOC
	TAD	APPSTR
	TAD	(200	/NEXT PAGE
	AND (7600
	DCA APPSTR	/STORE TEMP
	TAD APPSTR
	DCA I (BUFR	/RESET BUFR
	TAD (APPEN-2
	DCA AUTO1
	CMA
	TAD APPSTR
	DCA AUTO2
	TAD (APPLEN
	CIA
	DCA COUNT
	TAD	KRELOC
	DCA	REL1
TRNSLP,	CDF 0		/NOW TRANSFER APPEN TO FLD 2
	TAD I AUTO1
	SNA		/ZERO ENDS RELOCATION
	DCA	REL1
	SMA		/DON'T RELOCATE IOTS&OPRS$JMPJMSS
	TAD	REL1
	CDF 20
	DCA I AUTO2
	ISZ COUNT	
	JMP TRNSLP
	TAD TMCOD
	TAD I (LINE1
	DCA I (PC0+1	/C(LINE1)-CODE TO PC0+1
	TAD TMCOD
	TAD I (LINE0
	DCA I (LINE1	/C(LINE0)-CODE TO LINE1
	DCA I (LINE0	/0 TO LINE0
	TAD TMCOD
	TAD APPSTR
	IAC
	DCA I (PC0+2	/APPEN ENTRY-CODE TO PC0+2
	DCA I (LINE0-1	/NOT NEEDED ANY MORE
	CDF 0
	TAD I	(APPJMP
	MQL
	TAD I	(APPEN
	TAD	KRELOC	/RELOCATE 'JMS .'
	CDF T
	ISZ	APPSTR
	DCA I	APPSTR
	TAD	APPSTR
	TAD	(APPJMP-APPEN
	DCA	APPSTR
	MQA
	TAD	KRELOC
	DCA I	APPSTR	/RELOCATE 'JMP I APPBCK'
	CDF L
	JMS I (SAVPR	/NOW RESAVE PROGRAM
	JMP I	(EXITOS	/AND BACK TO FOCAL

TMCOD,	0
APPSTR,	0
KRELOC,	0
REL1,	0
COUNT,	0

	PAGE

/THIS PART IS MOVED TO FLD 2 AT THE END OF THE PROGRAM

	SKP		/FALLING IN WILL GIVE ERROR
APPEN,	JMS .		/ADRESS: C (PC0+2) + CODE
	CMA		/AC CARRIES C(PC0+2)
	TAD APPEN	/AC=CODE
	CIA
	TAD CODE
	SZA		/IF ZERO ALL OK
	JMP I PDLXR	/IT WILL BLOW UP
	DCA I PC02PT	/CLEAR POINTER
	TAD I LIN1PT
	TAD CODE
	DCA I LIN0PT	/SET LINE0
	TAD I PC01PT
	TAD CODE
	DCA I LIN1PT	/SET LINE1
	DCA I PC01PT
	CDF 10
	TAD SNACL
	DCA I MODPT	/KILL MODIFY
	TAD DCALIN
	DCA I WRITPT
	DCA I WRIT1P	/KILL WRITE
	DCA I WRIT2P
	CIF CDF 0
	DCA I SVPTPT
	TAD SAVMOD
	DCA I BLM4PT	/KILL SAVE
	TAD APPEN	/APPEN IN AC FOR BUFR
APPJMP,	JMP I APPBCK
	0		/END OF RELOC
APPBCK,	CODENU-4
CODE,	0
PC02PT,	PC0+2
LIN1PT,	LINE1
LIN0PT,	LINE0
PC01PT,	PC0+1
SNACL,	SNA CLA
DCALIN,	DCA	LINENO
MODPT,	MODIFY+4
WRITPT,	WRITE
WRIT1P,	WRITE+3
WRIT2P,	WRITE+14
SVPTPT,	SAVEPT+4
SAVMOD,	TAD	[OCLOSE	/READ INSTEAD OF WRITE
BLM4PT,	BLLL-4
	APPLEN=.-APPEN+1
	ZBLOCK 5200-.
	>
/GET OUT THE PAGE 0 LITERALS
	FIELD 0
/FIRST TIME INITIALIZING FOR OS/8 FOCAL

	CDTBL=7200
	USRTBL=7300

	*5200

SETUP,	DCA CHAINS	/REMEMBER CALL
	CDF 0
	CIF 10
	JMS I (7700	/CALL USR
	10		/LOCK IN
	TAD CHAINS
	SNA CLA
	JMP NODECD
	CIF 10
	JMS I (200
	5		/COMMAND DECODE
	5200		/SPECIAL MODE
NODECD,	CLA CMA		/ZAP OPEN FILES,SET -1
	CDF 10
	TAD I (36	/GET POINTER TO DEVNAM TABLE
	CDF 0
	DCA .+4
	JMS I (MVCORE	/MOVE TABLE DOWN
	-20
	CDF 10
	HLT
	CDF 0
	USRTBL		/IN CHAIN AREA
	JMS I (MVCORE	/MOVE FILE TABLE DOWN
	-50
	CDF 10
	7600
	CDF 0
	CDTBL		/ALSO IN CHAIN AREA
	CIF 10
	JMS I (200
	11		/USROUT

	JMS I (MVCORE	/CLEAR OUTPUT BUFFER
	-40
	CDF 0
	COMBUF
	CDF 10
	7600
	TAD I (CDTBL+6	/CHECK IF NAME
	SNA CLA
	JMP I (GOSTRT	/NO;RUN FCINIT(MAYBE)
	TAD I (CDTBL+5	/GET DEVNO
	JMS I (DNTONM	/CONVERT
	LINE3A+4
	JMP I (DEVERR
	JMS I (MVCORE
	-3		/MOVE FILENAME
	CDF 0
	CDTBL+6
	CDF 0
	LINE3A+7
	TAD I (CDTBL+11	/CHECK EXTENSION
	SNA
	TAD (603	/DEFAULT - FC
	DCA I (LINE3A+13
	TAD I (CDTBL+12	/CHECK INPUT
	SNA
	JMP I (NOINPT+3	/SET TTY:,E
	JMS I (DNTONM
	LINE2A+4
	JMP I (DEVERR
	TAD I (CDTBL+13
	SNA CLA
	JMP I (NOINPT	/NO NAME
	JMS I (MVCORE
	-3		/MOVE NAME
	CDF 0
	CDTBL+13
	CDF 0
	LINE2A+7
	TAD (5640	/SET . FOR EXTNSN
	DCA I (LINE2A+12
	TAD I (CDTBL+16
	SNA
	TAD (604	/DEFAULT .FD
	DCA I (LINE2A+13
	JMP I (NOINPT
CHAINS,	0

	PAGE

NOINPT,	JMS I (GESWIT
	"I-300		/INPUT ECHO?
	SKP
	TAD (5405	/YES - SET ,E
	DCA I (LINE2A+14
	TAD I (CDTBL	/GO ON WITH O O
	SNA
	JMP NOOUTP+3
	JMS I (DNTONM
	LINE1A+4
	JMP I (DEVERR
	TAD I (CDTBL+1
	SNA CLA
	JMP NOOUTP
	JMS I (MVCORE
	-3
	CDF 0
	CDTBL+1
	CDF 0
	LINE1A+7
	TAD (5640
	DCA I (LINE1A+12
	TAD I (CDTBL+4
	SNA
	TAD (604
	DCA I (LINE1A+13
NOOUTP,	JMS I (GESWIT
	"O-300
	SKP
	TAD (5405
	DCA I (LINE1A+14
	JMP .+4
GOSTRT,	JMS I (GESWIT	/CHECK IF CHAIN TO FCINIT
	"C-300
	SKP CLA
	CLA IAC
	CLL CML RAL	/SETS MODE TO 1 OR 3
	DCA MODE	/FOR START OR GOTO
	JMS I (GESWIT	/NO FUNCTIONS?
	"N-300
	JMP .+4
	TAD (CDF 10
	JMS I (PATCH
	NOFUNC
	JMS I (GESWIT	/REDUCED PRECISION?
	"6-225
	JMP FULPRC
	TAD (CDF 10
	JMS I (PATCH
	REDPRC
	TAD (CDF 0
	JMS I (PATCH
	OTHVAR
	JMS I (MVCORE
	-31
	CDF 0
	DIVOVL
	CDF 10
	DUBDIV+10
	JMS I (MVCORE
	-36
	CDF 0
	NEWVAR
	CDF 10
	STSECR
FULPRC,	JMS I (GESWIT
	"B-300		/BACK SPACE TERMINAL?
	JMP NOBCKS
	JMS I (MVCORE
	-6
	CDF 0
	BACKSP
	CDF 10
	FORW+11
NOBCKS,	JMS I (GESWIT
	"A-300		/MODIFY ASK TO COLON?
	JMP NOCOL
	TAD (":
	CDF 10
	DCA I (DIDO
	CDF 0
NOCOL,	JMS I (GESWIT
	"R-300
	JMP NOBEL
	TAD (207	/BELL IN ASK
	CDF 10
	DCA I (DIDO
	CDF 0
NOBEL,	JMS I (GESWIT
	"Q-300
	JMP I (NOQUES
	TAD ("?		/? IN ASK
	CDF 10
	DCA I (DIDO
	CDF 0
	JMP I (NOQUES
MODE,	0

	PAGE
NOQUES,	TAD I (CDTBL+46	/CHECK = OPTION
	SNA
	TAD (110	/NO TTY LINE-WIDTH
	CIA		/MINUS LINE-WIDTH
	DCA I (LINLEN
	TAD I (LINLEN
	DCA CHRCNT
	TAD I (CDTBL+42
	AND (3777	/ELIMINATE ALT-MODE SWITCH
	SNA
	TAD (110	/NO PAGE-LENGTH
	CIA
	TAD (6		/SKIP LENGTH AT PAGE BOUNDARY
	DCA I (PAGLEN
	TAD I (PAGLEN
	DCA I (LINCNT
NOTTWD,	JMS I (GESWIT
	"S-300		/SAVE SWITCH;GO BACK TO KM.
	SKP
	JMP I (7600	/WITH PATCHES SET
	JMS I (GESWIT
	"W-300		/WRITE PROGRAM?
	JMP NOWRIT
	TAD (340	/YES;SET L C;NO EXECUTION
	DCA I (LINE3A+3
	CLA CLL IAC CML RAL	/'GO'=3
	DCA I (MODE
	TAD (ENDWRT	/SET TO COME BACK HERE
	CDF 10
	DCA I (FORLEX+2
	JMP NOWRIT+3	/SIMULATE ALT-MODE
ENDWRT,	TAD (LEXIT	/RESET
	CDF 10
	DCA I (FORLEX+2
	TAD (200
	DCA I (PC
	CDF 20
	TAD (GORETN-1
	DCA I (PDLXR	/RESET PDL FOR RETURN
	CDF 0
	JMS ETINIT
	CLA CLL IAC RTL	/'WRITE'=4
	JMP I (CHENTR

NOWRIT,	JMS I (GESWIT
	0		/CHECK ALT-ESC
	JMP NOALTM	/NONE
	CDF 10		/YES CHANGE EXIT
	TAD (FORLEX
	DCA I (START
	CDF 0
	JMP YESGO
NOALTM,	JMS I (GESWIT	/CHECK IF GO
	"G-300
	SKP CLA
	JMP YESGO
	TAD (340
	DCA I (LINE3A+3	/SET L C
YESGO,	CMA
	TAD I (MODE
	SZA CLA		/IF START ERASE ALL
	JMP NOSTRT
	DCA I (LINE0A
	TAD (LINE1
	CDF 10
	DCA I (BUFR
	CDF 0
NOSTRT,	TAD CHNDCA
	DCA I (CHENTR	/RESET CHAIN ENTRY
	JMS I (MVCORE	/NOW MOVE HEADER UP
	-400
	CDF 0
	POPSUB
	CDF 20
	0
	JMS I (MVCORE	/AND PDL (WIPE OUT BATCH?)
	-100
	CDF 0
	PDLMON
	CDF 20
	7500
CDEXIT,	JMS ETINIT
	TAD I (MODE	/GO TO FOCAL
	JMP I (CHENTR

ETINIT,	0
	TAD	(KSTAT
	6047
	CLA CLL
	TAD	(215
	JMS I	(TYPIT
	TAD	(212
	JMS I	(TYPIT
	JMP I	ETINIT
CHNDCA,	3217

	PAGE

/MOVE CORE ROUTINE:	JMS MVCORE
/			-# OF WORDS
/			CDF FROM
/			ADRESS FROM
/			CDF TO
/			ADRESS TO

MVCORE,	0
	TAD I MVCORE
	DCA MVCNT
	ISZ MVCORE
	TAD I MVCORE
	DCA FRMCDF
	ISZ MVCORE
	TAD I MVCORE
	DCA MVPTFR
	ISZ MVCORE
	TAD I MVCORE
	DCA TOCDF
	ISZ MVCORE
	TAD I MVCORE
	DCA MVPTTO
	ISZ MVCORE
FRMCDF,	HLT
	TAD I MVPTFR
	ISZ MVPTFR
TOCDF,	HLT
	DCA I MVPTTO
	ISZ MVPTTO
	ISZ MVCNT
	JMP FRMCDF
	CDF 0
	JMP I MVCORE
MVCNT,	0
MVPTFR,	0
MVPTTO,	0

/GET A SWITCH ROUTINE:	JMS GESWIT
/	CODE:		ALTESC=0,A-Z="X-300,0-9="#-225
/			RETURN NOT SET
/			RETURN SET

GESWIT,	0
	TAD I GESWIT
	CIA
	DCA SWITNU	/SAVE SWITCH NUMBER NEGATIVE
	TAD SWILOC
	DCA SWIPNT	/RESET POINTER
	TAD SWITNU
	SZA CLA		/ALT-ESC?
	JMP NEXSWI	/NO
	CLA CMA		/YES
	DCA SWITNU	/ROTATE ONLY ONCE
	SKP		/KEEP POINTER AT FIRST WORD
NEXSWI,	ISZ SWIPNT	/NEXT WORD
	CLA CLL CML	/SET MASK-BIT
SWILUP,	RAR
	SZL		/AT END OF WORD?
	JMP NEXSWI	/YES;TO NEXT WORD,DON'T BUMP SWITNU
	ISZ SWITNU	/RIGHT LOC?
	JMP SWILUP	/NO;SHIFT MORE
	AND I SWIPNT	/YES;AND MASK WITH SWITCH
	ISZ GESWIT
	SZA CLA		/BIT SET?
	ISZ GESWIT	/YES;BUMP RETURN
	JMP I GESWIT

SWITNU,	0
SWIPNT,	0
SWILOC,	CDTBL+42

/DEVICE CODE TO NAME AND STORE ROUTINE
/	TAD DEVNO
/	JMS DNTONM
/	ADRESS FOR STORE
/	ERROR RETURN (NOT IN LIST)
/	NORMAL RETURN (STORED)

DNTONM,	0
	AND (17		/TAKE DEVICE BITS
	TAD (7300	/ADRESS OF TABLE
	DCA DNPTR
	TAD I DNTONM
	DCA PUTDCN	/SET ADRESS FOR STORE
	ISZ DNTONM	/AT ERROR RETURN
	TAD I DNPTR	/GET USR DEVICE NAME
	CIA
	DCA DCCODE
	TAD (DVCDNM	/START SEARCH
	DCA DNPTR
DNLOOP,	CLA CLL
	TAD DCCODE
	TAD I DNPTR	/GET CODE,IS IT .GE. DCCODE?
	ISZ DNPTR
	SZL SNA
	JMP DNFND+2	/EXACT
	SZL		
	JMP DNEXIT	/NOT IN LIST
	TAD I DNPTR	/SEE IF WE GET AN INDEXED NAME
	SZL
	JMP DNFND	/YES;OVERFLOW IS MAX#-#
	ISZ DNPTR
	ISZ DNPTR	/BUMP POINTER-SEARCH ON
	ISZ DNPTR
	JMP DNLOOP
DNFND,	CIA		/#-MAX#
	TAD I DNPTR	/#
	MQL
	ISZ DNPTR
	TAD I DNPTR	/TRANSFER NAME
	DCA I PUTDCN
	ISZ DNPTR
	ISZ PUTDCN
	MQA		/ADD IN NUMBER
	TAD I DNPTR
	DCA I PUTDCN
	ISZ DNTONM	/NORMAL RETURN
DNEXIT,	CLA CLL
	JMP I DNTONM

DNPTR,	0
PUTDCN,	0
DCCODE,	0

PATCH,	0	/ROUTINE PATCH CDF ADRESS OF TABLE
	DCA PATCDF	/COMES IN WITH CDF X
	TAD I PATCH	/GET LIST ADRESS
	ISZ PATCH
	DCA PATATO
PATLUP,	TAD I PATATO	/GET ADRESS TO PATCH
	SNA
	JMP I PATCH	/0 ENDS LIST
	DCA PATTER
	ISZ PATATO
	TAD I PATATO	/A LA RIM LOADER
PATCDF,	HLT
	DCA I PATTER
	CDF 0
	ISZ PATATO
	JMP PATLUP

PATATO,	0
PATTER,	0

DEVERR,	CIF 10		/USER ERROR 7
	JMS I (7700
	7
	7

	PAGE

/DEVICE NAME TABLE:	CODE
/			# OF OF INDEXED NAMES-1
/			DEVICE NAME
/7777 IN CODE ENDS LIST
/CODES IN INCREASING ORDER!

DVCDNM,	406
	0
	DEVICE DF
	2303
	0
	DEVICE SC
	2426
	0
	DEVICE TV
	4020
	0
	DEVICE LPT
	4024
	0
	DEVICE PTP
	4224
	0
	DEVICE PTR
	4503
	7
	DEVICE CSA0
	4573
	3
	DEVICE DKA0
	4604
	7
	DEVICE DTA0
	4631
	0
	DEVICE SYS
	4673
	3
	DEVICE DKB0
	5524
	0
	DEVICE TTY
	5604
	7
	DEVICE LTA0
	5704
	7
	DEVICE MTA0
	5723
	0
	DEVICE DSK
	6373
	3
	DEVICE RKA0
	6464
	3
	DEVICE SDA0
	6473
	3
	DEVICE RKB0
	6504
	0
	DEVICE CDR
	6564
	3
	DEVICE SDB0
	6601
	0
	DEVICE BAT
	7777
TYPIT,	0
	TLS
	CLA CLL
	TSF
	JMP	.-1
	JMP I	TYPIT

BACKSP=.
	RELOC FORW+11
	/FOR TERMINAL WITH BS
	JMP .+2
	TAD M30
	TAD SPC
	DCA T3
M30,	-30
	TAD T3
	RELOC
	*6400
	POPSUB=.
	RELOC 0

/GETS LOADED IN FIELD 2
/CORE MAP:	/0-177:	 PDL SUBROUTINES
		/200-X: TEXT
		/X-7545: PUSHDOWN LIST
		/7546-7577: MONTHS OF THE YEAR

	0		/FOR RUBOUT PROTECTION;SEE RUB1
PSHBUF,	BUFR		/INDIRECT FOR TEXT PROTECTION
PSHCDF,	CDF 0
PSHERR,	ERROL+3		/POINTER TO ERRROR ROUTINE
	0
	0		/FOR ODT
	0
PSHCNT,	0
PSHAX,	0
PDLXR,	GORETN-1	/MAIN AX FOR PDL
PSHM4,	-4
PSHMSK,	7
POPOVR,	376-1	/PO=PDL. OVERFLOW
PSHM5,	-5
FLDCDI,	HLT		/CDI CURRENT
	JMP I FLDRET		/EXIT
FLDRET,	0

ZPOPA,	0	/ONE ITEM FROM PDL TO AC;OLD AC IN MQ
	JMS FLDSET
	TAD I PDLXR
	JMP FLDCDI	/NO INC RETURN

ZPUSHA,	0	/AC TO PDL;AC TO MQ
	JMS FLDSET
	CLA CMA
	JMS PCHK
	MQA
	DCA I PDLXR
	CLA CMA
	JMS PCHK
	JMP FLDCDI	/NO INC RETURN

	/LOCAL FIELD SATELLITES FOR ALL POPS EXCEPT
	/POPJ MUST BE AS FOLLOWS:
	/XPOPU,	0
	/	MQL
	/	FLDCUR	(DEFINED ON OTHER PAGE)
	/	CIF T	(WHERE T IS FIELD OF POP SUBS.)
	/	JMS I .+1
	/	ZPOPU
	/FLDCUR=CLA   FOR FIELD		0
	/	=CLA IAC		1
	/	=CLA IAC RAL		2
	/	=CLA CLL CML IAC RAL	3
	/	=CLA IAC RTL		4
	/	=CLA CLL CMA RTL	5
	/	=CLA CLL CMA RAL	6
	/	=CLA CMA		7

FLDSET,	0	/SUBROUTINE FOR ANALYZING FIELDS AND ADRESSES
	AND PSHMSK	/TAKE ONLY 7 BITS
	CLL RAL
	RTL
	TAD PSHCDF
	DCA FLDCDF	/CALLING DATA FIELD
	TAD PSHCDF	/NOW LET'S SEE WHICH D.F. HE PUT
	RDF
	DCA ACCES	/ACCES DATA FIELD
	CDF T		/THIS FIELD
	CLA CLL CMA RAL	/JMS FLDSET ALWAYS FIRST INSTR. OF ZPOPU'S
	TAD FLDSET	/ZPOPU+2
	DCA FLDRET	/NOW BECAUSE OF STANDARD FORM OF SATELLITES
	TAD PSHM5	/-5 PLUS THE
	TAD I FLDRET	/CONT. OF ZPOPU ENTRY,GIVES ADRESS OF XPOPU
	DCA FLDRET
FLDCDF,	HLT		/CHANGE TO CALLING D.F.
	TAD I FLDRET	/THIS IS ADRESS OF ARG.
	DCA FLDRET	/AND FINAL RETURN ADD. FOR POPA,PUSHA
	CLA CMA		/FOR RELATIVE ADRESSING:'TAD FLDRET'
	TAD I FLDRET	/ARGUMENT-1 FOR AX
	DCA PSHAX
	CLA CLL IAC RAL	/BUILD A CIF CDF CALLING FIELD
	TAD FLDCDF	/FOR FINAL RETURN
	DCA FLDCDI
	CDF T		/BACK TO THIS FIELD
	JMP I FLDSET

	/BY THE WAY: THE DATA FIELD IS ALWAYS RESET TO CURRENT
	/THIS CAN BE USEFUL

	/CALLS IN A PROGRAM WILL LOOK LIKE THIS:
	/CDF ACCES
	/PUSHF
	/    LOC	/RELATIVE: LOC-.-1
	/WILL PUSH 4 WORDS STARTING IN LOC IN FIELD ACCES
ZPUSHF,	0	/4 WORDS IN PDL;AC CONSERVED;AC TO MQ
	JMS FLDSET
	TAD PSHM4
	JMS PCHK
	TAD PSHM4
	DCA PSHCNT
ACCES,	HLT		/SET BY FLDSET
	TAD I PSHAX	/""
	CDF T
	DCA I PDLXR	/STORE IN PDL
	ISZ PSHCNT
	JMP ACCES	/LOOP
	TAD PSHM4
	JMS PCHK	/RESET PDLXR
PSHFEX,	MQA		/RESTORE AC
	ISZ FLDRET	/BUMP PAST ARG
	JMP FLDCDI

ZPOPF,	0	/4 WORDS FROM PDL IN LOC;AC CONSERVED;AC TO MQ
	JMS FLDSET
	TAD PSHM4
	DCA PSHCNT
	TAD ACCES	/RELOCATE CDF ACCES
	DCA .+3
POPLOP,	CDF T
	TAD I PDLXR
	HLT
	DCA I PSHAX
	ISZ PSHCNT
	JMP POPLOP	/LOOP
	JMP PSHFEX	/SAME RETURN AS ZPUSHF

	/!!!!!
	/POPJ IS THE ONLY POPU THAT NEEDS ANOTHER SATELLITE!
	/XPOPJ,	CIF CDF T
	/	JMP I .+1	/JMP!!
	/	ZPOPJ
ZPUSHJ,	0	/GO TO ARG IN ACCES;CDF ALSO ACCES;AC CONSERVED
	JMS FLDSET			/AC TO MQ
	CLA CLL CMA RAL	/-2
	JMS PCHK
	IAC		/TO BUMP PAST ARG
	TAD FLDRET	/RETURN AFTER POPJ
	DCA I PDLXR
	TAD FLDCDI	/CDI AFTER POPJ
	DCA I PDLXR
	CLA CLL CMA RAL
	JMS PCHK
	CLA CLL IAC RAL
	TAD ACCES	/BUILD CDI ACCES
	DCA .+1
	HLT
	MQA		/RESTORE AC
	JMP I PSHAX	/!!

ZPOPJ,	TAD I PDLXR	/AC INCS RETURN AND IS LOST;MQ CONSERVED
	DCA FLDRET
	TAD I PDLXR
	DCA FLDCDI
	JMP FLDCDI

PCHK,	0	/SUB TO BACKUP PDL AND CHECK OVERFLOW
	TAD PDLXR	/AC COMES IN WITH AMOUNT OF BACKUP
	DCA PDLXR
	TAD PDLXR
	CIA CLL
	CDF P		/SOME OTHER FIELD
	TAD I PSHBUF	/GET LOWER BOUNDARY
	CDF T
	SNL CLA
	JMP I PCHK	/NO OVERFLOW
	TAD POPOVR
	CIF CDF L
	JMP I PSHERR

VPOPA=JMS I .	/FOR FIELD T POPS
	NOP
VPUSHA=JMS I .
	NOP
VPUSHJ=JMS I .
	NOP
VPOPJ=JMP I .
	NOP
VPUSHF=JMS I .
	NOP
VPOPF=JMS I .
	NOP
	RELOC
	*6600
	RELOC 200

PC0,	0	/TEXT BUFFER HEAD
	0
	0
	0
	0
	5051	/LPAR,RPAR FOR DUMP
	BUFR
	235
LINE0,	LINE1
LINE0A=LINE0+POPSUB
	0
	TEXT "C-FOS8 DATAPLAN-77"
	*.-1
	7715	/DUMMY CR
LINE1A=.+POPSUB
/TEXT FOR AUTOMATIC LOADING AFTER CHAIN
LINE1,	LINE2
	212		/LINE 1.1
	TEXT "O O TTY :           ,E"
	*.-1
	7715
LINE2A=.+POPSUB
LINE2,	LINE3
	224		/LINE 1.2
	TEXT "O I TTY :           ,E"
	*.-1
	7715
LINE3A=.+POPSUB
LINE3,	0000
	236		/LINE 1.3
	TEXT "L R DSK : FCINIT. FC <00.0> "
	*.-1
	7715
LINE4A=.+POPSUB
LINE4=.
	7715
	7715
	RELOC
DIVOVL=.
	RELOC DUBDIV+10
	TAD AC1L
	TAD LORD
	DCA MP2
	RAL
	TAD HORD
	TAD AC1H
	SNL
	JMP .+4
	DCA HORD
	TAD MP2
	DCA LORD
	CLA
	TAD MP1
	RAL
	DCA MP1
	TAD MP4
	RAL
	DCA MP4
	ISZ MP3
	JMP DV3
	TAD MP1
	DCA LORD
	TAD MP4
	DCA HORD
	JMP I DUBDIV
	RELOC
NEWVAR=.
	RELOC STSECR

	4400
	0000
	0013
DOLL1,	0001
	0000
	4300
NMBSG1=.+2
	ZBLOCK 4
	4100
EXCLA1=.+2
	ZBLOCK 4
	4200
QUOTS1=.+2
	ZBLOCK 4
	2011	/PI
	0000
	0002
	3110
	3756
	2605	/VE
	0000
	0001
	2000
	0000
STVAR1=.
	RELOC
	*7000
NOFUNC,	VARTOP	/
	FNTABL-10
	FNTABF+7	/
	ERCALL
	FNTABF+11	/
	ERCALL
	FNTABF+13	/
	ERCALL
	FNTABF+15	/
	ERCALL
	FNTABF+17	/
	ERCALL
	FNTABF+21	/
	ERCALL
	FNTABF+23	/
	ERCALL
	0000

OTHVAR,	XNMBSG	/
	NMBSG1
	XEXCLA	/
	EXCLA1
	XQUOTS	/
	QUOTS1
	XDOL	/
	DOLL1
	0000
REDPRC,	LASTV	/ADRESS
	STVAR1
	END	/
	STVAR1
	FSIZE	/
	6
	DECP	/
	3
	GINC	/
	5
	MFLT	/
	-3
	DIGITS	/
	7
	TWOPI+2	/
	3756
	PI+2	/
	3756
	PIOT+2	/
	3756
	PTEN+2	/
	3147
	FPNT+3	/
	DCA OVER1
	FPNT+4	/
	DCA OVER2
	ZERO+20	/
	DCA OVER1
	TEST2	/
	27
	DMULT+32	/
	DMDONE&177+5200
	DMDONE+7	/
	DCA OVER2
	MULDIV+4	/
	ISZ OVER2
	MIF	/
	-27
	0000
	PDLMON=7100

	*7104
	RELOC 7504

GORETN,	INPUTX+2	/RETURN FOR GOTO
	CIF CDF P
	ZBLOCK 40

	/MONTHS OF THE YEAR

MONAME,	TEXT "--19"
	*.-1
	TEXT "JAN-"
	*.-1
	TEXT "FEB-"
	*.-1
	TEXT "MAR-"
	*.-1
	TEXT "APR-"
	*.-1
	TEXT "MAY-"
	*.-1
	TEXT "JUN-"
	*.-1
	TEXT "JUL-"
	*.-1
	TEXT "AUG-"
	*.-1
	TEXT "SEP-"
	*.-1
	TEXT "OCT-"
	*.-1
	TEXT "NOV-"
	*.-1
	TEXT "DEC-"
	RELOC

	FIELD 0
	*200
	$$$$