/	PS/8 SYSTEM CONFIGURATOR	CONFIG.002

/28 OCTOBER 1970		R.L./E.F.
/COPYRIGHT 1970			DIGITAL EQUIPMENT CORP.
/				MAYNARD,MASS.

/ABSTRACT---
/CONFIG IS THE SYSTEM CONFIGURATOR FOR PS/8.CONFIG
/CONTAINS CONDITIONAL ASSEMBLY PARAMETERS WHICH DEFINE
/MONITOR TABLES AND DEVICE HANDLERS.ANY CHANGES TO DEVICE
/HANDLERS MUST BE MADE IN CONFIG.
/	PS/8 SYSTEM CONFIGURATOR

/I)	DETAILS OF CONDITIONAL ASSEMBLY

/	CONFIG USES PARAMETERS WHICH MAY BE SPECIFIED AT
/ASSEMBLY TIME.THESE PARAMETERS ARE USED IN CONSTRUCTING
/CORE RESIDENT TABLES,AND ALSO IN DETERMINING WHICH DEVICES
/ARE IN THE SYSTEM.SPECIFICALLY,WHICH DEVICE WILL BE THE
/SYSTEM DEVICE.

/PARAMETERS:
/A)	DIRECT
/	IFNDEF DIRECT <DIRECT=0>

/THIS SWITCH CONTROLS THE WRITING OF THE DIRECTORY AND ABSLDR
/FILES ON THE SPECIFIED SYSTEM DEVICE. IF DIRECT IS DEFINED
/NON-ZERO, THOSE RECORDS CONTAINING THE DIRECTORY
/AND THE ABSOLUTE LOADER ARE NOT REWRITTEN WHEN A NEW SYSTEM
/IS GENERATED. A NEW SYSTEM CAN BE BUILT WITHOUT DESTROYING
/PREVIOUSLY LOADED FILES.

/B) SYSTEM DEVICE PARAMETERS
/DEFINING ONE OF THESE AT ASSEMBLY TIME SPECIFIES WHICH DEVICE
/IS TO BE USED AS THE SYSTEM DEVICE. INTERNAL TABLES ARE ASSEMBLED
/TO REFLECT THIS DEVICE.

/	DECTAPE
/	IFNDEF DECTAPE <DECTAPE=0>

/	DEFINING DECTAPE WILL DESIGNATE DTA0 AS SYS:
/	NOTE:IF DECTAPE=1, DEVICE DSK: WILL BE DTA0:
/	IF DECTAPE =2, DEVICE DSK: WILL BE DTA1:

/	RF08
/	IFNDEF RF08 <RF08=0>
/	DEFINING RF08=N, WHERE N IS AN INTEGER FROM 1 TO 4
/	WILL CAUSE AN N DISK RF08 TO BE THE SYSTEM DEVICE.

/	LINCSYS
/	IFNDEF LINCSYS <LINCSYS=0>
/	FOR PDP-12 USERS. IF LINCSYS IS SPECIFIED, LINCTAPE UNIT
/	0 WILL BE THE SYSTEM DEVICE.
/	NOTE:IF LINCSYS=1, DEVICE DSK: IS TAPE UNIT 0(DTA0:)
/	IF LINCSYS=2, DEVICE DSK: IS TAPE UNIT 1 (DTA1:)

/	RK08
/	IFNDEF RK08 <RK08=0>
/	DEFINING RK08 WILL SPECIFY A SINGLE RK8 UNIT AS
/	THE SYSTEM DEVICE.

/	DF32
/	IFNDEF DF32 <DF32=0>
/	DEFINING DF32=N, WHERE N IS AN INTEGER FROM 1 TO 4
/	WILL CAUSE AN ASSEMBLY FOR AN N DF32 DISK SYSTEM.

/IF NO SYSTEM DEVICE PARAMETERS ARE SPECIFIED, THE ASSEMBLY
/RESULTING WILL BE A ONE DECTAPE SYSTEM;I.E. THE SAME AS
/AN ASSEMBLY IN WHICH DECTAPE WAS SET=1.
/C) DEVICE HANDLER PARAMETERS
/CERTAIN I/O HANDLERS ARE ALSO SPECIFIED BY ASSEMBLY TIME
/SWITCHES.

/	LINE PRINTER
/PS/8 SUPPLIES TWO LINE PRINTER HANDLERS: ONE FOR THE
/OLDER TYPE---- AND ONE FOR THE LP08.
/	IFNDEF LP08 <LP08=1>
/THE DEFAULT LINE PRINTER HANDLER WILL BE THE LP08.

/	LINCTAPE
/FOR PDP-12 USERS, PS/8 CAN RUN WITH LINCTAPE INSTEAD OF
/DECTAPE, BOTH AS I/O HANDLER AND AS SYSTEM DEVICE.
/NOTE:CONFIG'S TABLES ARE SET UP SUCH THAT LINCTAPES
/ARE STILL REFERRED TO AS DTAN: WHEN REFERENCED. TO CHANGE
/THIS THE DEVICE NAME TABLE WILL HAVE TO BE ALTERED. SEE
/THAT TABLE FOR THE PROPER FORMAT.

/PLEASE NOTE: SPECIFYING MORE THAN ONE SYSTEM DEVICE
/PARAMETER OR SPECIFYING BOTH DECTAPE AND LINCTAPE WILL
/CAUSE ASSEMBLY ERRORS.

/	HIGH SPEED PAPER TAPE
/IF THE USER DOES NOT HAVE HIGH SPEED I/O, A PARAMETER
/IS PROVIDED WHICH USES THE TTY AS A SIMULATED HIGH SPEED
/I/O UNIT. REFERENCES TO PTP AND PTR WILL USE THE
/TTY IN THE SAME WAY THAT PTP AND PTR WOULD BE USED.
/	IFNDEF NOHSPT <NOHSPT=0>
/THE DEFAULT ASSEMBLY ASSUMES THE USER HAS HIGH SPEED I/O.


/II) REFERENCES TO THE MAIN PS/8 ASSEMBLY
/CERTAIN LOCATIONS FROM THE MAIN ASSEMBLY OF PS/8 MUST BE
/USED IN CONFIG. IF THESE LOCATIONS CHANGE FROM THEIR CURRENT
/VALUE, THESE CHANGES MUST BE MADE IN CONFIG, OR UNPREDICTABLE
/RESULTS WILL OCCUR.

/	MFREE=FIRST RECORD OF FILE STORAGE ON SYS:
/	IT IS CURRENTLY SET TO 70 (OCTAL)

/	SDNAME=SYSTEM DEVICE NAME TABLE
/	CURRENTLY AT 564
/	SET AASDNAME=SDNAME IN CONFIG

/	SDVHND=SYSTEM DEVICE HANDLER TABLE
/	CURRENTLY SET TO 767
/	SET AASDVHND=SDVHND

/LOCATION 20 IN FIELD 0 IS THE DIRECT PARAMETER. CONFIG
/EXPECTS LOCATION 20 TO HAVE THE TAG RBFLAG. RBFLAG SHOULD
/BE AT LOCATION 20.

/CONFIG EXPECTS THE INITIAL PS/8 DIRECTORY (ABSLDR.SV)
/TO TERMINATE AT LOCATION 1413 IN FIELD 1. THIS LOCATION IS
/OVERLAID WITH THE NUMBER OF BLOCKS REMAINING ON THE
/SPECIFIED SYSTEM DEVICE. IF THE INITIAL DIRECTORY IS
/ALTERED, CONFIG SHOULD BE ALTERED TO CORRESPOND WITH THE
/NEW DIRECTORY.
/III) TABLES IN PS/8 SET UP BY CONFIG

/CERTAIN MONITOR TABLES ARE ASSEMBLED WITH CONFIG.
/CONDITIONAL PARAMETERS ARE USED TO CORRECTLY ASSEMBLE THESE 
/TABLES.

/	SDNAME
/SDNAME SPECIFIES THE STANDARD NAMES FOR THE PS/8 DEVICES.

/	SDVHND
/SDVHND CONTAINS INFORMATION ABOUT THE HANDLERS, SUCH AS
/WHERE THEY WILL BE FOUND ON THE SYSTEM DEVICE
/AND THE RELATIVE LOCATION OF THEIR ENTRY POINTS. SEE THE
/TABLE FOR DETAILED FORMAT.

/NOTE: THE ENTRIES IN THESE TABLES MUST BE KEPT IN THE
/SAME RELATIVE POSITIONS.
/SDVHND USES THE ADDRESSES IN CONFIG WHICH ARE THE ACTUAL
/ASSEMBLY POINTS OF THE HANDLERS. IF THE ASSEMBLY POINTS
/SHOULD CHANGE, THIS CHANGE MUST BE REFLECTED IN SDVHND.


/IV) THE SUPPLIED DEVICE HANDLERS.

/CONFIG CONTAINS THE DEVICE HANDLERS WHICH ARE CURRENTLY
/SUPPORTED. SEE THE INDIVIDUAL HANDLERS FOR RESTRICTIONS AND
/DETAILS.


/V) SYSTEM DEVICE HANDLER MAP
/CONFIG WRITES DEVICE HANDLER RECORDS ONTO THE SYSTEM
/DEVICE. THE FOLLOWING IS THE HANDLER "MAP":

/	RECORD NO.		HANDLER RESIDENT
/
/	20,21			CDR,LPT (CARD READER,LINE PRINTER)
/	16			PTR,PTP (HI SPEED READER/PUNCH)
/	17			TTY (TELETYPE)
/	22			DTAN: (8 DECTAPE HANDLERS)



/ANY DEVICE HANDLERS SUPPLIED BY DEC IN THE FUTURE WILL
/BE PLACED IN FIELD 0 OF CONFIG. FOR THIS REASON WE SUGGEST
/THAT ANY USER WRITTEN HANDLER BE EDITED INTO FIELD 1.
/THE AVAILABLE LOCATIONS IN FIELD 1 ARE:
/
/	4000 THRU 7500
	/DEVICE DEPENDENT CODE FOR PS/8 MONITOR


/THESE ARE CONDITIONAL PARAMETERS. SEE INTRODUCTORY COMMENTS.

	IFNDEF DIRECT	<DIRECT=0>	/"DON'T REWRITE DIRECTORY" FLAG
	IFNDEF NOHSPT	<NOHSPT=0>	/"NO HIGH-SPEED PAPER TAPE" FLAG
	IFNDEF RF08	<RF08=0>
	IFNDEF LP08	<LP08=1>
	IFNDEF LINCTAPE	<LINCTAPE=0>
	IFNDEF LINCSYS	<LINCSYS=0>
	IFNDEF RK8	<RK8=0>
	IFNDEF DF32	<DF32=0>
	IFNDEF DECTAPE	<
	IFZERO DF32+RF08+RK8+LINCSYS	<DECTAPE=1>
	IFNZRO DF32+RF08+RK8+LINCSYS	<DECTAPE=0>
	>


	SBLOCK=7776	/RANDOM DEFINITIONS FROM MAIN ASSEMBLY
	MFREE=70	/FIRST FREE BLOCK ON THE SYSTEMS DEVICE
			/(FIELD 1)
	SOFSET=7747	/NOT REALLY NECESSARY!

	FIELD 1

/LAST INITIAL DIRECTORY LOCATION. CHANGE IF NECESSARY.
/THESE CONDITIONALS PUT IN DIRECTORY LENGTHS.

	*1413
	IFNZRO DECTAPE+LINCSYS	<MFREE+5-1341	/IF DECTAPE>
	IFNZRO RF08	<6000^RF08+MFREE+6	/IF RF08>
	IFNZRO RK8	<MFREE+5-6260	/IF RK8>
	IFNZRO	DF32	<7600^DF32+MFREE+6	/IF DF32>

	AASDNAME=564		/DEPENDS ON PS8 ASSEMBLY
	*AASDNAME
	/SYSTEM DEVICE NAME TABLE
	/THE ENTRIES ARE THE TWO WORD SUM OF THE SIXBIT FOR THE SYSTEM
	/DEVICES, WITH THE HIGH ORDER BIT FORCED ON

/CHANGES IN SDNAME MUST BE ACCOMPANIED BY CHANGES IN
/SDVHND. KEEP CORRESPONDENCE ONE TO ONE.

SDNAME,	4631	/SYS
	5723	/DSK
	5524	/TTY
	4020	/LPT
	4604	/DTA0
	4605	/DTA1
	4606	/DTA2
	4607	/DTA3
	4610	/DTA4
	4611	/DTA5
	4612	/DTA6
	4613	/DTA7
	4024	/PTP
	4224	/PTR
	6504	/CDR


	AASDVHND=766		/DEPENDS ON PS8 ASSEMBLY
	*AASDVHND

	/SYSTEM HANDLER TABLE
	/CONTENTS:
	/BIT 0		- ON IF THE HANDLER IS A TWO-PAGE HANDLER
	/BITS 1-4	- OFFSET FROM "DVHORG-1" OF RECORD CONTAINING HANDLER
	/BITS 5-11	- ENTRY POINT OF HANDLER RELATIVE TO LOADING ADDRESS


/EACH DEVICE HANDLER HAS AN ENTRY IN SDVHND. THE EQUATION
/USED IN EACH ENTRY IS: OFFSET *200+ENTRY POINT-ASSEMBLY POINT
/THE OFFSET IS BITS 1-4.
/FOR A TWO PAGE HANDLER, ADD 4000.

SDVHND,	0	/SYSTEM HANDLER HAD BETTER BE RESIDENT
		/OR PAGE 17600 IS PROBABLY BLOWN
	IFZERO LINCSYS+DECTAPE-2	<5^200+DTA1-7200
			/FOR MULTIPLE DECTAPE SYSTEMS,DTA1=DSK>
	IFNZRO LINCSYS+DECTAPE-2	<0	/OTHERS,DSK=SYS>
	2^200+TTY-7000
	4^200+LPT-6200
	5^200+DTA0-7200
	5^200+DTA1-7200
	5^200+DTA2-7200
	5^200+DTA3-7200
	5^200+DTA4-7200
	5^200+DTA5-7200
	5^200+DTA6-7200
	5^200+DTA7-7200
	1^200+PTP-6400
	1^200+PTR-6400
	3^200+CDR-5600+4000	/TWO PAGE HANDLER


	IFNZRO DECTAPE	<SYSD=4160>
	IFNZRO LINCSYS	<SYSD=4170>
	IFNZRO RF08	<SYSD=RF08^10+4050>
	IFNZRO RK8	<SYSD=4050>
	IFNZRO DF32	<SYSD=DF32^10+4110>
	DTADCB=LINCTAPE^10+4160		/4160 OR 4170
	FIELD 0
/NOTE:RBFLAG MUST BE AT LOC. 20 OF MAIN ASSEMBLY!!!!
	IFNZRO DIRECT	<*20; 1 /DON'T REWRITE DIRECTORY OR ABSLDR>



	/DEVICE CONTROL BLOCK TABLE - ONE WORD PER DEVICE
	/BIT 0 - 1 IF FILE STRUCTURED DEVICE
	/BIT 1 - 1 IF READ ONLY DEVICE
	/BIT 2 - 1 IF WRITE ONLY DEVICE
	/BITS 3-8	- THE DEVICE TYPE
	/0		TELETYPE
	/1		HIGH SPEED READER
	/2		HIGH SPEED PUNCH
	/3		CARD READER (CR8/I)
	/4		LINE PRINTER
	/5		RK8 DISK
	/6		RF08 DISK(ONE PLATTER)
	/7		RF08 DISK(TWO PLATTERS)
	/10		RF08 DISK(THREE PLATTERS)
	/11		RF08 DISK(FOUR PLATTERS)
	/12		DF32 DISK(ONE PLATTER)
	/13		DF32 DISK(TWO PLATTERS)
	/14		DF32 DISK(THREE PLATTERS)
	/15		DF32 DISK(FOUR PLATTERS)
	/16		DECTAPE
	/17		LINCTAPE(PDP12 ONLY - FORMATTED 128 WDS/BLOCK)
	/20		IBM-COMPATIBLE MAGNETIC TAPE(TYPE 57A)
	/21-77		TO BE ASSIGNED
	/BITS 9-11	- FLAG FOR WHETHER AN OUTPUT FILE IS CURRENTLY OPEN

	*7560
DCB,	SYSD;SYSD;0;1040;DTADCB;DTADCB;DTADCB;DTADCB
	DTADCB;DTADCB;DTADCB;DTADCB;1020;2010;2030


	IFZERO DECTAPE+LINCSYS-2	<*7450;0	/USE TAPE 1 AS DSK>
	IFNZRO	DECTAPE+LINCSYS		<*7453;7607	/DTA0 IS RESIDENT>



/THE MAJOR FUNCTION OF CONFIG FOLLOWS: WRITE THE DEVICE
/HANDLER RECORDS.NOTE THAT LOC. 0 CONTAINS 7607, OR THE SYSTEM
/DEVICE HANDLER ENTRY POINT.
/SYSTEM GENERATION STARTS AT LOC. 4000 AND CONTINUES THROUGH
/THIS CODE.

*4200
WRDEVH,	0		/SUBR TO WRITE OUT DEVICE HANDLER RECORDS
	WRITE=JMS I 0
	DVHORG=16
	WRITE;	4301;	5600;DVHORG+2;	JMP BERR	/CDR AND LPT HANDLERS
	WRITE;	4100;	7000;DVHORG+1;	JMP BERR	/TTY HANDLER
	WRITE;	4100;	7200;DVHORG+4;	JMP BERR	/DTA HANDLERS
	WRITE;	4100;	6400;DVHORG+0;	JMP BERR	/PTR & PTP HANDLERS
	ISZ WRDEVH
BERR,	JMP I WRDEVH
	*5600

/CARD READER HANDLER FOR PS8

/MARK BRAMHALL

/OCT 8, 1970

/DEFINITIONS OF CARD READER IOTS
RCSF=6631
RCRA=6632
RCSP=6671
RCSE=6672

CDR,	0		/ENTRY POINT RELATIVE ZERO
CDR770,	7700		/"SMA CLA" CLEARS THE AC
CDRTMP,	0		/LESS THAN 400 - PROTECTS THE "SMA CLA"
	JMP CDRSET	/INITIALIZATION - BECOMES "RDF"
	TAD CDRCIF	/FORM "CIF CDF N" TO CALLING FIELDS
	DCA CDRXIT	/SAVE CALLING FIELDS
	TAD CDRCCF-1
	DCA CDRXIT-1	/RESTORE THE "ISZ CDR"
	TAD I CDR	/GET FUNCTION WORD
	AND CDR070	/GET BUFFER FIELD BITS
	TAD CDRCCF	/MAKE A "CDF N"
	DCA CDRTM2	/SAVE IT TEMPORARILY
	TAD I CDR	/GET FUNCTION WORD AGAIN
	ISZ CDR
	SPA		/IS IT A WRITE FUNCTION?
	JMP CDRERR	/YES - HARD ERROR
	AND CDR770	/GET COUNT BITS
	CIA
	DCA CDRWC	/SAVE WORD COUNT (DIVIDED BY 2)
	TAD I CDR	/GET BUFFER ADDRESS
	DCA CDRCA	/AND SAVE IT
	ISZ CDR		/THE BLOCK NUMBER IS IGNORED
CDRCCF,	CDF		/WE ARE IN FIELD 0
	DCA I CDRIN2	/RESET ^Z FLAG TO ZERO
	TAD CDRTM2
	DCA I CDRIN3	/SET THE BUFFER FIELD "CDF N"
CDRLP,	JMS I CDRIN4	/GET A CHARACTER
	DCA I CDRCA	/BUFFER FIELD IS RETURNED CORRECTLY
	JMS I CDRIN4	/GET NEXT CHARACTER
	DCA CDRTMP	/AND SAVE IT
	JMS I CDRIN4	/GET NEXT CHARACTER
	RTL
	RTL		/GET THE FIRST FOUR BITS OF IT
	DCA CDRTM2	/SAVE THE REST FOR LATER
	TAD CDRTM2
	AND CDR740	/ONLY 4 BITS
	TAD I CDRCA
	DCA I CDRCA	/ADD THOSE BITS TO 1ST CHARACTER
	ISZ CDRCA	/BUMP POINTER TO BUFFER
CDR740,	7400		/PROTECT THE ISZ AGAINST SKIPS
	TAD CDRTM2
	RTL
	RTL		/NOW GET LOW ORDER 4 BITS
	AND CDR7400	/AND ONLY 4 BITS
	TAD CDRTMP	/ADD IN THE 2ND CHARACTER
	DCA I CDRCA	/AND STORE THE WORD
	ISZ CDRCA	/BUMP POINTER AGAIN
CDR070,	70		/PROTECT THE ISZ
	ISZ CDRWC	/DONE?
	JMP CDRLP	/NO - LOOP
	ISZ CDR
	ISZ CDR		/IF ^Z THIS IS "CLL CLA IAC"
CDRXIT,	HLT		/RESTORE CALLING FIELDS
	JMP I CDR	/EXIT

CDRERR,	CLL CLA CML RAR	/HARD ERROR
	JMP CDRXIT-2

CDRCA,	0		/BUFFER POINTER
CDRWC,	0		/WORD COUNT DIVIDED BY 2
CDRTM2,	0		/SPLIT WORD TEMPORARY
CDRCIF,	CIF CDF 0	/TO FORM EXIT WORD

CDRIN2,	CDRJMP-CDRLOC	/CORRECTED AT INITIALIZATION TIME
CDRIN3,	CDRCDF-CDRLOC
CDRIN4,	CDRGCH-CDRLOC

CDRTBL,	0021;2223;2425;2627;3031;3203;4007;3502
	2017;6364;6566;6770;7172;7514;0577;3637
	1552;5354;5556;5760;6162;0104;1211;3374
	0641;4243;4445;4647;5051;7316;3410;1376

/DO NOT INSERT ANYTHING BETWEEN "CDRTBL" AND "CDRBUF"!!

CDRBUF=.		/CARD BUFFER

CDRSET,	RDF		/INITIALIZATION CODE
	TAD CDRCCF
	DCA CDRSE1	/SAVE CALLING FIELDS
	CDF		/WE ARE IN FIELD 0
	JMS .		/FIND OUT OUR LOCATION
CDRLOC,	TAD CDRSE2	/ADDRESS TO MODIFY
	TAD CDRLOC-1	/CORRECT IT
	DCA CDRSE3	/SAVE IT
	TAD I CDRSE3	/GET DATA TO MODIFY
	TAD CDRLOC-1	/CORRECT IT
	DCA I CDRSE3	/AND RESTORE IT
	ISZ CDRLOC	/NEXT ADDRESS
	ISZ CDRSE4	/MORE?
	JMP CDRLOC	/YES - LOOP
	TAD CDRSET
	DCA CDR+3	/SET THE "RDF"
CDRSE1,	HLT		/RESTORE CALLING FIELDS
	JMP CDR+3	/AND BACK TO NORMAL

CDRSE3,	0		/MODIFY POINTER
CDRSE4,	-6		/SIX LOCATIONS TO MODIFY

CDRSE2,	CDRIN2-CDRLOC	/LOCATIONS TO MODIFY
	CDRIN3-CDRLOC
	CDRIN4-CDRLOC
	CDRIN5-CDRLOC
	CDRABF-CDRLOC
	CDRTAD-CDRLOC
*CDRBUF+50		/END OF THE BUFFER

CDRGCH,	0		/GET A CHARACTER ROUTINE
	CDF		/WE ARE IN FIELD 0
CDRJMP,	0		/THIS IS "JMP CDRCDF" AFTER A ^Z
	ISZ CDRCNT	/MORE CHARACTERS IN THE INTERNAL BUFFER?
	JMP CDRGET	/YES - GET ONE
CDRGE4,	ISZ CDRCT2	/GIVE A 215, 212 FOR EVERY CARD
	JMP CDRCLF	/215, 212 ROUTINE
	CLL CLA CMA RTL
	DCA CDRCT2	/RESET COUNT TO -3
	TAD CDRABF
	DCA CDRPT	/SET POINTER TO INTERNAL BUFFER
CDRGE0,	KSF		/KEYBORAD FLAG UP?
	JMP CDRGE7	/NO - TRY TO READ A CARD
	KRS		/READ STATIC FROM KEYBOARD
	AND CDR177	/IGNORE PARITY
	TAD CDRM03	/IS IT ^C?
	SNA
	JMP I CDR760	/YES - TO MONITOR VIA 07600
	TAD CDRM27	/IS IT ^Z?
	SZA CLA
	JMP CDRGE7	/NO - GET A CARD
	KCC		/KILL FLAG
CDRGEZ,	CLA CMA
	DCA CDRCNT	/RESET COUNTS TO SKIP
	CLA CMA
	DCA CDRCT2
	TAD CDRMOD
	DCA CDRJMP	/SET TO GIVE 0'S
	TAD CDROPR
	DCA I CDRIN5	/AND A SOFT ERROR
	TAD CDR232	/^Z
CDRCDF,	HLT		/TO BUFFER FIELD
	JMP I CDRGCH	/EXIT

CDRGE7,	RCSE		/SELECT A CARD
	JMP CDRGE0	/NO GO - TRY AGAIN
	DCA CDRSW	/SET PACKING SWITCH
CDRGE1,	RCSP		/CARD DONE?
	JMP CDRGE2	/NO - TRY FOR DATA READY
CDRGE3,	TAD I CDRPT	/GET LAST TWO CHARACTERS
	SZA		/BOTH SPACES?
	JMP CDRGE5	/NO
	CLA CMA
	TAD CDRPT
	DCA CDRPT	/BACK UP POINTER ONE
	ISZ CDRCNT
	ISZ CDRCNT	/AND TAKE COUNT DOWN BY 2
	JMP CDRGE3	/TEST AGAIN OR...
	JMP CDRGE4	/IF COUNT IS ZERO THE A BLANK CARD

CDRGE5,	AND CDR077	/IS RIGHT HAND CHARACTER A SPACE?
	SNA CLA
	ISZ CDRCNT	/YES A SPACE - REDUCE COUNT
	TAD I CDRPT	/GET LAST NON-SPACE
	TAD CDRM77	/IS IT "_ "?
	SNA CLA
CDROPR,	CLL CLA IAC	/YES - 1 INTO AC
	TAD CDRCNT	/IS COUNT ALSO 1?
	SNA CLA
	JMP CDRGEZ	/YES - MUST BE END OF FILE
CDRGE6,	TAD CDR077
	DCA CDRSW	/SET OFFSET FROM "CDRTBL"
CDRGET,	ISZ CDRSW	/BUMP OFFSET
	TAD CDRSW	/OFFSET INTO AC
	JMS CDRGE8	/GET A CHARACTER
	TAD CDR240	/MAKE IT ASCII
CDRMOD,	JMP CDRCDF

CDRGE8,	0		/GET FROM BUFFER ROUTINE
	CLL RAR		/DIVIDE BY 2 - AND INTO LINK IS INDICATOR
	TAD CDRTAD	/ADDRESS OF "CDRTBL"
	DCA CDRTM3	/SET POINTER
	TAD I CDRTM3	/GET WORD
	SZL		/SHIFT?
	JMP .+4		/NO
	RTR		/YES
	RTR
	RTR
	AND CDR077	/GET 6 BITS
	JMP I CDRGE8

CDRGE2,	RCSF		/DATA READY?
	JMP CDRGE1	/NO - TRY FOR END OF CARD
	CLA CMA
	TAD CDRCNT
	DCA CDRCNT	/COUNT THE CHARACTERS
	RCRA		/READ ALPHA
	JMS CDRGE8	/GET TABLE ENTRY
	ISZ CDRSW	/WHICH SIDE?
	JMP CDRGE9	/LEFT SIDE
	TAD I CDRPT
	DCA I CDRPT	/FORM RIGHT SIDE
	JMP CDRGE1	/CONTINUE

CDRGE9,	CLL RTL		/SHIFT LEFT
	RTL
	RTL
	ISZ CDRPT	/BUMP POINTER
	DCA I CDRPT	/STORE LEFT SIDE
	CLA CMA
	JMP CDRGE1-1	/CONTINUE - SET SWITCH

CDRCLF,	CLA CMA
	DCA CDRCNT	/SET MAIN COUNT TO SKIP
	TAD CDRCT2
	CLL CMA RTL	/ALL THIS DOES IS...
	TAD CDRCT2	/MAKE A 2 OR -1
	TAD CDR213	/SO THIS MAKES A 215 OR 212
	JMP CDRCDF

CDR760,	7600		/MONITOR ADDRESS
CDRM03,	-3		/^C TEST
CDRM27,	-27		/-27-3=-32 ^Z TEST
CDRCNT,	-1		/MAIN COUNT
CDRCT2,	-1		/215, 212 COUNT
CDRPT,	0		/BUFFER POINTER
CDRSW,	0		/SWITCH
CDRTM3,	0		/TEMPORARY
CDR240,	240		/ASCII SPACE
CDR213,	213		/215, 212 CORRECTION FACTOR
CDR232,	232		/ASCII ^Z
CDR177,	177		/PARITY MASK
CDR077,	77		/SIX BIT MASK
CDRM77,	-7700		/-"_ "

CDRABF,	CDRBUF-1-CDRLOC	/MODIFIED LOCATIONS
CDRTAD,	CDRTBL-CDRLOC
CDRIN5,	CDRXIT-1-CDRLOC
	IFZERO LP08	<
	*6200
	/LINE PRINTER HANDLER FOR "OLD STYLE" LINE PRINTER
	/RECOGNIZES TAB,LINE FEED,VERTICAL TAB AND FORM FEED
	/IGNORES CARRIAGE RETURNS, TREATS ^N AS "CARRIAGE RETURN
	/ WITHOUT LINE FEED" CONTROL CHARACTER.
	LSE=6651
	LCF=6652
	LLB=6654
	LSD=6661
	LCB=6662
	LPR=6664
LPT,	0
LP7700,	7700
LPT11,	11	/FALLS THROUGH HARMLESSLY, CLEARING THE AC
	RDF
	TAD LPTCIF
	DCA LPTXIT
	TAD I LPT
	AND LPT70
	TAD LP6201
	DCA LPTCDF
	CLA CLL CML RAR
	TAD I LPT	/LINK IS NOW 1 IF COMMAND WAS A "WRITE"
	AND LP7700
	CIA
	DCA LPTWC	/LPTWC=WORD COUNT/2
	ISZ LPT
	TAD I LPT
	DCA LPTCA
	ISZ LPT
	TAD I LPT
	ISZ LPT
	SNL
	JMP LPTERR
	SZA CLA
	JMP LPTCDF
	LCB
	JMS LPWAIT
	TAD LPT214
	JMS LPTPCH	/FORM FEED, INITIALIZES COUNT
LPTCDF,	HLT
LPTLP,	TAD I LPTCA
	JMS LPTPCH
	TAD I LPTCA
	AND LP7400
	DCA LPTTMP
	ISZ LPTCA
LP7400,	7400
	TAD I LPTCA
	JMS LPTPCH
	TAD I LPTCA
	AND LP7400
	CLL RTR
	RTR
	TAD LPTTMP
	RTR
	RTR
	JMS LPTPCH
	ISZ LPTCA
LPT7,	7
	ISZ LPTWC
	JMP LPTLP
LPTRTN,	ISZ LPT
LPTXIT,	HLT
	JMP I LPT
LPTWC,	0
LPTCA,	0
LPTPCH,	0
	AND LPT177
	SZA
	TAD LPM140
	SMA
	JMP LPFLSH
	TAD LPT106
	SNA
	JMP LPTCTZ
	TAD LPT13
	CLL
	TAD LPT6
	SZL SNA
	JMP LPTCTL
	TAD LPT11
	LLB
	JMP LPTKSF
LPWAIT,	-1
	LSD
	JMP .-1
	LCF
	ISZ LPLPTR
	JMP I LPWAIT
	CLA IAC
LPTCTL,	SNA
	JMP LPTTAB
	TAD LPTTAD
	DCA LPTXXX
	TAD LP7607
	DCA LPLPTR
LPTXXX,	HLT
	SNA
	JMP .+3
	LPR
LPTKSF,	JMS LPWAIT
	KRS
LPFLSH,	TAD LPM203
	SNA CLA
	KSF
	JMP I LPTPCH
LPTCIF,	CDF CIF 0
	JMP I .+1
	7600
LPTCTZ,	TAD LPT214
	JMS LPTPCH
	JMP LPTRTN
LPT6,	6
LPTTAB,	TAD LPT40
	LLB
	JMS LPWAIT
	TAD LPLPTR
	AND LPT7
LPM140,	SZA CLA
	JMP LPTTAB
	JMP LPTKSF+1
LPTERR,	CLA CLL CML RAR
	JMP LPTXIT
LPTTAD,	TAD .
LPT70,	70	/LF
LPT13,	13	/VT
LPT177,	177	/FF
	0	/CR
LPT40,	40	/CR, NO LF
LPM203,	-203
LPT106,	106
LPT214,	214
LP7607,	7607
LP6201,	CDF 0
LPTTMP,	0
LPLPTR,	0
	>
	IFNZRO LP08	<
	*6200
	/LINE PRINTER HANDLER FOR LP08 LINE PRINTER - HANDLES TABS,
	/VERTICAL TABS. LP08 HARDWARE HANDLES FORM FEEDS, CARRIAGE RETURNS  AND
	/LINE FEEDS.
	/ACCEPTS ^N AS EQUAL TO CARRIAGE RETURN FOR PSEUDO-COMPATIBILITY
	/WITH 645 HANDLER

	LSF=6661
	LSR=6663
	LLS=6666

LPT,	0
	CLL CML CLA RAR
	TAD I LPT	/LINK GOES ON HERE. IF NOT READ WAS REQUESTED
LPT215,	AND LP7700
	CIA
	DCA LPTWC
LPT214,	RDF
	TAD LPTCIF
	DCA LPTXIT	/SAVE CALLING FIELD IN RETURN SEQUENCE
	TAD I LPT
	AND LPT70
	TAD LP6201
	DCA LPTCDF	/GET BUFFER FIELD
/NOTE!!!!!!!! 
LP7700,	7700		/MUST BE AT LOC. 15 OF PAGE!
	ISZ LPT
	TAD I LPT
	DCA LPTCA	/LPTCA GETS BUFFER ADDRESS
	ISZ LPT
	TAD I LPT
	ISZ LPT
	SNL		/IF LINK NOT SET,GIVE ERROR
	JMP LPTERR
LPM140,	SZA CLA	/GIVE FORM IF REC. 0
	JMP LPTCDF
	TAD LPT214
	JMS LPTPCH	/OUTPUT A FORM FEED IF WRITING "RECORD ZERO"
LPTCDF,	HLT

/NOW PICK UP THE CHARACTERS, UNPACK THEM AND PRINT.
/TEST FOR:TABS, LINE FEEDS,VERTICAL TABS

LPTLP,	TAD I LPTCA
	JMS LPTPCH
	TAD I LPTCA
	AND LP7400
	DCA LPTCDF
	ISZ LPTCA
LP7400,	7400
	TAD I LPTCA
	JMS LPTPCH
	TAD I LPTCA
	AND LP7400
	CLL RTR
LPTLF,	RTR
	TAD LPTCDF
	RTR
	RTR
	JMS LPTPCH
	ISZ LPTCA
LPT177,	177
	ISZ LPTWC
	JMP LPTLP
LPRTRN,	ISZ LPT
LPTXIT,	HLT
	JMP I LPT
LPTWC,	0
LPTCA,	0
LPTPCH,	0
	AND LPT177
	SZA
	TAD LPM140
	SMA
	JMP LPFLSH
	TAD LPT106
	SNA
	JMP LPTCTZ
	TAD LPT13
	CLL CML
	TAD LPT7
	SNL SZA
	JMP LPTCTL
	TAD LPT10
	JMS LPWAIT
LPTJMP,	JMP	LPJTAB-1	/LPJTAB-1 = "JMP LPTKRS"
LPTCTZ,	TAD LPT214
	JMS LPTPCH
	JMP LPRTRN

LPWAIT,	0
	LLS
	LSF
	JMP .-1
LP7600,	7600
	LSR
	JMP LPWISZ
LPTERR,	CLA CLL CML RAR	/FATAL ERROR EXIT
	JMP LPTXIT
LPWISZ,	ISZ LPLPTR
	JMP I LPWAIT
LPLF,	TAD LPTLF
	JMP LPTKRS-3
LPTCTL,	TAD LPTJMP
	DCA .+1
LPTXXX,	HLT
LPTTAB,	TAD LPM140
	JMS LPWAIT
	TAD LPLPTR
	AND LPT7
	SNA CLA
/NOTE!!!!!!!
	JMP LPTKRS	/MUST BE AT LPJTAB-1
LPJTAB,	JMP LPTTAB
	JMP LPLF
	JMP LPTVTB
	CMA CML
LPT10,	RAR
	TAD LPT215
	DCA LPLPTR
	TAD LPLPTR	/PREVENTS DOUBLE SPACING ON 80TH CHAR
	JMS LPWAIT
	TAD LPM120
	DCA LPLPTR
LPTKRS,	KRS
LPFLSH,	TAD LPM203
	SNA CLA
	KSF
	JMP I LPTPCH
LPTCIF,	CDF CIF 0
	JMP I LP7600

LPT7,	7
LPT13,	13
LPM203,	-203
LPT106,	106
LP6201,	6201
LPTM10,	-10
LPT70,	70
LPM120,	-120
LPLPTR,	0
LPTVTB,	TAD LPTM10
	DCA LPLPTR
	TAD LPTLF
	JMS LPWAIT
	JMP .-2
	>
	*7000
	/TELETYPE HANDLER - NOT VERY INTELLEGENT.
	/ONLY RECOGNIZES ^Z AND ^C ON INPUT
	/AND ^C AND ^O ON OUTPUT
	/OH WELL, WHAT CAN YOU EXPECT IN ONE PAGE.
	/ THE LOGIC IS VERY SIMILIAR TO THE PTR AND PTP HANDLERS.
TTY360,	360		/MUST BE FIRST LOC ON PAGE!
TTY,	0
TT7600,	7600
	RDF
	TAD TTYCIF
	DCA TTYXIT	/SAVE RETURN FIELD
	TAD I TTY
	AND TT70
	TAD TTCDF
	DCA TTYCDF	/DATA FIELD OF BUFFER
	TAD I TTY
	AND TT7700
	CLL RAL		/READ/WRITE IN LINK, PAGE COUNT IN AC 0-4
	SZA		/PROTECT LINK
	CIA		/WHILE COMPLEMENTING AC
	DCA TTYWC
	ISZ TTY
	TAD I TTY
	DCA TTYCA	/SAVE BUFFER ADDRESS
	ISZ TTY
	ISZ TTY
TTYLP,	SNL CLA
	JMP TTYGLP	/ZER LINK MEANS READ
	JMS TTYTST	/TEST FOR ^C
	TAD TTYM14	/-203-14=-217 =-"^O"
	SNA CLA
	JMP TTYCTO
	TAD I TTYCA	/CHARACTER 1 IS LOW ORDER 8 BITS OF WORD 1
	JMS TTYPCH
	AND TT7400
	DCA TTYGCH
	ISZ TTYCA
TT7400,	7400
	TAD I TTYCA	/CHARACTER 2 IS LOW ORDER 8 BITS OF WORD 2
	JMS TTYPCH
	AND TT7400
	CLL RTR
	RTR
	TAD TTYGCH
	RTR
	RTR	/CHARACTER 3 IS HIGH ORDER 4 BITS OF WORDS 1 AND 2
	JMS TTYPCH	/WILL SET LINK ON!
			/AC IS NON-ZERO HERE BUT WE DON'T CARE
TTLOOP,	ISZ TTYCA
TT70,	70
	ISZ TTYWC
	ISZ TTYWC
	JMP TTYLP
TTYRTN,	TAD TTYCDF
	CLL CIA
	SNL CLA
	ISZ TTY	/SKIP PAST ERROR RETURN
TTYXIT,	HLT	/RESTORE CALLING FIELDS
	RAL
	JMP I TTY
TTYPCH,	0
	TAD TTM232
	SNA
	JMP TTYRTN
	TAD TTY232
	JMS TTPRNT
	JMP I TTYPCH
TTYTST,	0
TTYCDF,	0
	TAD TTY200
	KRS		/TEST FOR ^C WITH FLAG UP
	TAD TTM203
	KSF
	CLA IAC
	SZA		/YES..BACK TO MONITOR
	JMP I TTYTST
TTYCIF,	CDF CIF 0
	JMP I TT7600
TTPRNT,	0
	TLS
	TSF
	JMP .-1
	JMP I TTPRNT
TTYCA,	0
TTYWC,	0
TTCDF,	CDF 0

/FOLLOWING CODE READS TTY AND PACKS IN BUFFER.
TTYGLP,	JMS TTYGCH
	DCA I TTYCA
	JMS TTYGCH
	DCA TTYPCH
	JMS TTYGCH
	RTL
	RTL
	DCA TTYGCH
	TAD TTYGCH
	AND TT7400
	TAD I TTYCA
	DCA I TTYCA
	TAD TTYGCH
TTY200,	AND TTY360
	CLL RTL
	RTL
	TAD TTYPCH
	ISZ TTYCA
	DCA I TTYCA
	JMP TTLOOP
TTYGCH,	0
	TAD TTYCDF
TT7700,	SMA CLA
	JMP I TTYGCH
	ISZ TTYTST
	JMP TTYKSF
	TAD TTY212
	JMP TTECHO
TTYKSF,	KSF
	JMP .-1
	JMS TTYTST
	TAD TTM27
	SNA		/IS IT A ^Z?
	DCA TTYCDF	/YES - SET END-OF-FILE FLAG
	TAD TTY14
	DCA TTYTST	/TTYTST=-1 IF CARRIAGE RETURN
	KRB
TTECHO,	JMS TTPRNT	/ECHO THE INPUT CHARACTER
	JMP I TTYGCH
TTY232,	232		/THIS CAN BE OPTOMIZED OUT!
TTY212,	212
TTY14,	14
TTM203,	-203
TTM27,	-27
TTYM14,	-14
TTM232,	-232
TTYCTO,	6032
	JMP TTYRTN
	IFZERO LINCTAPE	<
	*7200
	/DECTAPE HANDLERS(PAGE RELOCATABLE) FOR PS/8 MONITOR
D177,	177
DM3,	-3
DBLOCK,	0
DBLKCT,	0
DLOC,	0
WC,	7754
CA,	7755
DERRCT,	0
DTA0,	ISZ DTANO
DTA1,	ISZ DTANO
DTA2,	ISZ DTANO
DTA3,	ISZ DTANO
DTA4,	ISZ DTANO
DTA5,	ISZ DTANO
DTA6,	ISZ DTANO
DTA7,	ISZ DTANO
D400,	400
	CLA CLL CMA RTL
	DCA DERRCT	/SET TO REPEAT THREE TIMES IN CASE OF ERROR
	TAD DTANO
	CMA
	TAD DTATAD	/GENERATE "TAD DTAN" WHERE DTAN IS THE ONE THAT
	DCA DTANO	/WAS CALLED.
	CLA CLL CML RTR
	TAD DTANO	/ALSO GENERATE "DCA DTAN" SO WE CAN RESTORE IT
	DCA DTADCA
	RDF
	TAD DCDIF0
	DCA DSTOP	/STORE CALLING FIELD FOR RETURNING
DTANO,	0		/GET CALLING ADDRESS
	DCA DTA		/SAVE IT
	TAD DTAISZ
DTADCA,	0		/RESTORE ENTRY POINT
	DFUN=DTADCA
DTAISZ,	ISZ DTANO	/BUMP DTANO FOR VARIOUS GROOVY REASONS
			/WHICH WILL BE APPARENT LATER
	TAD I DTA
	DCA DFUN		/STORE AWAY FUNCTION WORD FOR FUTURE USE
	ISZ DTA
DT7140,	CLL CMA		/THE "CLL" IS ONLY NECESSARY TO FORM THE 7140
	TAD I DTA
	DCA DLOC	/BUFFER ADDRESS -1
	ISZ DTA
	TAD I DTA
	CLL RAL		/MULTIPLY BY 2 FOR 256-WORD SIMULATED RECORDS
	DCA DBLOCK	/DECTAPE BLOCK #
	ISZ DTA
DTATRY,		TAD WC
DCDIF0,	CDF CIF 0
	DCA I CA
	TAD DFUN
	RAR
	CLA CML	/COMPLEMENT OF BIT 11 OF DFUN NOW IN THE LINK
	TAD DTANO	/DTANO = "TAD DTAN+1"
	RTR
	RTR		/THESE TWO ROTATES FORM THE FLLOWING NUMBER
			/IN THE AC: YYYF00101000, WHERE YYY =DTAN+1
			/AND F IS THE COMPLEMENT OF DFUN(11)
	TAD DT7140	/THE MAGIC STEP - THIS SIMULTANEOUSLY BUMPS DOWN
			/THE RECORD NUMBER IN AC(0-2) AND TRANSFORMS
			/THE REST OF THE AC TO F10001000 WHICH IS A
			/SEARCH IN DIRECTION F(F=1 MEANS BACKWARDS) WITH
			/THE MOTION BIT ON.
	DTCA DTXA
	DTLB		/SET DECTAPE FIELD TO 0 FOR SEARCHING
	JMP DC+3	/JUMP INTO THE BLOCK SEARCH ROUTINE
DERR,	RTL	/DECTAPE STATUS REGISTER B IS USUALLY IN THE AC HERE
	RAL
D7600,	7600	/GET THE "END OF TAPE" FLAG INTO THE LINK AND CLEAR THE AC
	TAD D200	/GET MOTION BIT
DC,	SZL	/AND, IF LINK IS ON
DTATAD,	TAD D400	/REVERSE DIRECTION OF MOTION
	DTXA
	KRS
D200,	AND D177
	TAD DM3
	SNA CLA
	KSF		/CHECK FOR ^C TYPED
	JMP DTAWT
	TAD D7600
	DCA DTA		/FAKE DTA SO WE GO TO LOC 7600 IN FIELD 0
	JMP DSTOP+1	/AFTER STOPPING THE TAPE
DTAWT,	DTSF DTRB
	JMP .-1	/WAIT FOR SEARCH TO COMPLETE
	SPA	/HAS AN ERROR OCCURED?
	JMP DERR	/DO SOMETHING APPROPRIATE
	DTRA
	RTL
	CMA RTL
	SNL CLA	/WAS MOTIOZ OF TAPE FORWARDS?
	CML RTL	/NO, SO ONLY SUCCEED IF WE ARE 2 BLOCKS IN FRONT 
		/OF TARGET BLOCK
	TAD I WC
	CMA
	TAD DBLOCK
	CMA	/AFTER THIS OPERATION WE HAVE THE FOLLOWING 4 POSSIBILITIES
		/1)AC=0, L=1	/SEARCH COMPLETE
		/2)AC=0, L=0	/RIGHT PLACE ON TAPE,WRONG DIRECTION
		/3)AC .GT. 0, L=0	/WEVE PASSED THE CORRECT BLOCK
		/4)AC .GT. 0, L=1	/WE HAVENT REACHED THE CORRECT BLOCK YET
	SZA CLA
	JMP DC
	SNL
	JMP DC+1
	TAD DLOC
	DCA I CA	/SET THE CURRENT ADDRESS REGISTER TO THE BUFFER -1
	TAD DFUN
	DTLB		/SET FIELD TO BUFFER FIELD
	TAD DFUN
	CLL RAL
	AND D7600
	DCA DBLKCT	/GET UNCOMPLEMENTED WORD COUNT INTO DBLKCT
	RAL
	IAC
	CLL CML RTL
	RTL	/FORM A 50 IF L=1, A 30 IF L=0
DL,	DTXA	/XOR IN 50(WRITE) OR 30(READ) OR 0(CONTINUE PREVIOUS OP)
	TAD D7600
	DCA I WC	/READ/WRITE 128 WORDS FROM/INTO EACH BLOCK
	DTSF DTRB
	JMP .-1
	CLL CML	/SET ERROR FLAG ON INITIALLY
	SPA CLA
	JMP DERR2	/TRANSMISSION ERROR - TRY AGAIN
	TAD DBLKCT
	TAD D7600
	SNA	/BUMP WORD COUNT BY -128 AND SEE IF 0
		/ALSO REVERSE LINK.
	JMP DOVER	/YES - DONE
	DCA DBLKCT	/RESTORE BUMPED WORD COUNT
	JMP DL		/AND LOOP
DERR2,	ISZ DERRCT	/ERROR CODE(LINK) IS 1
	JMP DTATRY	/TRY AGAIN
	JMP DSTOP	/3 ERRORS - ITS CURTAINS FOR YOU,CHARLEY
DOVER,	ISZ DTA		/SKIP ERROR RETURN
DSTOP,	HLT		/RESTORE CALLING FIELD
	TAD D200	/STOP THE TAPE
	DTXA
	DCA DTANO	/INITIALIZE DTANO FOR THE NEXT CALL
	RAR	/GET ERROR CODE FROM LINK INTO AC0
	JMP I DTA	/AND EXIT
DTA,	0
	>
	IFNZRO LINCTAPE <
	*7200
	/LINCTAPE HANDLER FOR PS/8 - CRUDE VERSION (WRITE OPERATION CHECKS
	/AFTER EACH BLOCK)
	/ALL 8 HANDLERS ARE IN THIS PAGE - SEE DECTAPE HANDLER FOR
	/DUMB COMMENT

	/PDP-12 OPCODES NEEDED
	LINC=	6141
	PDP=	0002
	CLR=	0011
	AXO=	0001
	TMA=	0023
	TAC=	0003

LTA4,	4
LTA7,	7
LTA20,	20
LTA70,	70
LTA702,	702
LT3700,	3700
LT4000,	4000
LT7700,	7700
DTA0,	ISZ LTANO
DTA1,	ISZ LTANO
DTA2,	ISZ LTANO
DTA3,	ISZ LTANO
DTA4,	ISZ LTANO
DTA5,	ISZ LTANO
DTA6,	ISZ LTANO
DTA7,	ISZ LTANO
LTA200,	200
	TAD LTANO
	CMA
	TAD LTATAD
	DCA LTANO
	CLA CLL CML RTR
	TAD LTANO
	DCA LTADCA
	RDF
	TAD LCDIF0
	DCA LTAXIT
LTANO,	0
	DCA LTA
	TAD LTAISZ
LTADCA,	0
	TAD I LTA
	DCA LTARG1
	ISZ LTA
	TAD I LTA
	DCA LTARG2
	ISZ LTA
	TAD I LTA
	CLL RAL	/MOVE ARGUMENTS TO WORK AREA
	DCA LTARG3
	ISZ LTA
	ISZ LTA
	TAD LTARG1	/GET CORE FIELD
	AND LTA70
	CLL RTL
	RTL		/MOVE TO BITS 0-2. CONTROLLER
	RTL		/WANTS THEM THERE
SLTARG3,	DCA LTATMP
	TAC
	TAD LTANO	/GET UNIT NO.
	AND LTA7
	CLL RAR
	TAD LTATMP
	TAD LTA20	/SET BIT 7 ON. EXTENDED ADD. MODE
	LINC
	AXO		/SEND DATA TO CONTROLLER
	PDP
LT7600,	7600
	DCA LTANO	/RESET UNIT NO.
	TAD LTARG1
	AND LT4000	/WATCH THE LINK!
	RTL
	RTL
	TAD LTA702	/ADD TAPE INST; STORE IT
	DCA LTINST
LTALP,	KRS
	AND LTA177
	TAD LTAM3
	SNA CLA
	KSF		/TEST FOR ^C
	JMP LTAGO
LCDIF0,	CDF CIF 0
	JMP I LT7600
LTAGO,	TAD LTARG2	/CORE ADDRESS TO CONTROLLER
	LINC
	TMA
	CLR
LTINST,	0		/TAPE INSTRUCTION HERE
LTARG3,	0		/BLOCK NO. HERE
	PDP
	CMA		/OPERATION DONE. AC HAS CHECKSUM
	SNA CLA		/7777=GOOD CHECKSUM
	JMP LTNERR
	TAD LTINST
	AND LTA4
	SNA CLA	/WAS IT A WRITE OPERATION?
	JMP LTALP	/NO..RETRY IT
LTNERR,	TAD LTARG1
	AND LT3700
	TAD LT7700
	SNA		/ALL DONE?
	JMP LTAXIT
	DCA LTARG1	/NO.. SAVE COUNT
	TAD LTARG2
LTATAD,	TAD LTA200
	DCA LTARG2
	ISZ LTARG3
	JMP LTALP
LTAXIT,	HLT
	JMP I LTA
LTAISZ,	ISZ LTANO
LTARG1,	0
LTARG2,	0
LTATMP,	0
LTA177,	177
LTAM3,	-3
LTA,	0
	>
	*6400
	/THIS IS THE REAL HIGH SPEED HANDLER.
	/HIGH SPEED PAPER TAPE HANDLER FOR BLEEP MONITOR
	/PACKS 3 CHARACTERS IN 2 WORDS ON INPUT, UNPACKS ON OUTPUT
	/PAGE RELOCATABLE
	IFZERO NOHSPT	<
PTP,	0
	CLA CLL CML	/SET LINK ON TO INDICATE PUNCH
	JMS PSETUP	/DO COMMON CRAP
PTPLP,	TAD I PTPCA
	JMS PTPPCH	/FIRST CHAR IN LOW ORDER 8 BITS OF WORD 1
	DCA PTR
	ISZ PTPCA
PT7700,	7700
	TAD I PTPCA
	JMS PTPPCH	/SECOND CHAR IN LOW ORDER 8 BITS OF WORD 2
	CLL RTR
	RTR
	TAD PTR
	RTR
	RTR	/THIRD CHARACTER NOW IN AC
	JMS PTPPCH
PTPEND,	ISZ PTPCA
PT70,	70	/JUST IN CASE WERE PUNCHING PG 7600 KEEP THIS LITERAL HERE
	KSF
	JMP PTPISZ	/KEYBOARD FLAG OFF - DON'T WORRY ABOUT ^C
PTPKRS,	KRS
	AND PTP177
	TAD PTPM3
	SZA CLA	/IS THERE A ^C IN THE TTY BUFFER?
	JMP PTPISZ	/NO
PTPCIF,	CDF CIF 0
	JMP I .+1
	7600
PSETUP,	0
	RDF	/GET FIELD OF CALLING PROGRAM
	TAD PTPCIF
	DCA PTPXIT	/SET UP RETURN SEQUENCE
	TAD I PTP
	AND PT70
	TAD PCDF
	DCA PTPCDF
	RAR		/GET LINK(1=PTP,0=PTR)
	TAD I PTP	/GET FUNCTION WORD
	ISZ PTP
	SPA		/CHECK CORRECT MODE
	JMP PTPERR	/SIGNAL "UNRECOVERABLE DEVICE ERROR"
	AND PT7700
	CMA		/SET UP -(WORD COUNT)/2-1
	DCA PTPWC
	TAD I PTP	/SET UP STARTING ADDRESS
	ISZ PTP
	DCA PTPCA
	TAD I PTP
PTPCDF,	0		/SET DATA FIELD TO ACCESS BUFFER
	PTPEOF=PTPCDF
	SNA CLA
	SZL
	JMP PTPISZ
	TAD PTP336	/INPUT INITIALIZATION - TYPE "^" AND WAIT
	TLS
	KSF
	JMP .-1
	JMS PTRGCH	/INITIALIZE THE PTR BUFFER CHAR
	6032		/CLEAR AC AND KEYBOARD FLAG
	JMP PTPKRS	/CHECK FOR ^C
PTPISZ,	ISZ PTPWC
	JMP I PSETUP	/LOOP FOR BUFFER SIZE (128 WORDS)
PTPRTN,	TAD PTPEOF
	SZA CLA		/DID WE RUN OUT OF TAPE?
	ISZ PTP
	ISZ PTP
PTPXIT,	HLT	/EXIT CDF GOES HERE
	JMP I PTP
PTPPCH,	0
	PLS	/NOTICE THE GLORIOUS LACK OF OVERLAP
	PSF
	JMP .-1
	AND PT7400
	JMP I PTPPCH
PTPCA,	0
PTR,	0		/CORRECT ENTRY IN MAIN ASSEMBLY IF THIS IS MOVED!
	CLA CLL
	TAD PTR
	DCA PTP
	JMS PSETUP	/SET UP ADDRESS, COUNT, FIELDS
PTRLP,	JMS PTRGCH	/READ FIRST CHARACTER OF 3
	DCA I PTPCA
	JMS PTRGCH
	DCA PTPPCH
	JMS PTRGCH
	RTL
	RTL
	AND PT7400
	TAD I PTPCA
	DCA I PTPCA	/HIGH ORDER 4 BITS INTO WORD 1
	TAD PTR		/GET THE CHAR FROM THE PTR BUFFER
	RTR
	RTR
	RAR		/PUT THE LOW ORDER BITS INTO AC 0-3
	AND PT7400
	TAD PTPPCH
	ISZ PTPCA
PT7400,	7400
	DCA I PTPCA	/LOW ORDER 4 BITS INTO WORD 2
	JMP PTPEND
PTRGCH,	0
	TAD PTPEOF
	SNA CLA
	JMP I PTRGCH
	RFC
	DCA PTPEOF
PTTIME,	ISZ PTPEOF	/THIS LOOP OVERFLOWS IN APPROX. 100 MS ON A PDP-8,
	JMP PGCHLP	/72 MS ON A PDP-8/E
	DCA PTPTMP	/IF IT DOES, IT MEANS WE HAVE RUN OUT OF TAPE
	TAD PTP232	/ZERO THE GARBAGE CHARACTER AT THE END OF THE TAPE AND SEND
	JMP I PTRGCH	/AN END-OF-FILE CHARACTER (^Z)
PGCHLP,	TAD PTPTMP
	DCA PTR
PTP232,	232
PTP336,	336		/FALL THROUGH CONSTANTS TO STALL FOR TIME
PTP177,	177
	RSF
	JMP PTTIME	/READER NOT READY - CHECK TIMING
	RRB		/READER READY - READ CHAR
	DCA PTPTMP	/BUFFER READER BY ONE CHARACTER TO ELIMINATE
	TAD PTR		/GARBAGE CHARACTER AT END OF TAPE
	JMP I PTRGCH	/AND RETURN
PTPERR,	CLA CLL CML RAR	/SIGNAL A "PERMANENT I/O ERROR" ON THE DEVICE
	JMP PTPXIT-2
PCDF,	CDF 0
PTPTMP,	0
PTPWC,	0
PTPM3,	-3
	>
	/THIS IS THE PTP,PTR HANDLER FOR PEOPLE WITH
	/NO HIGH SPEED I/O.

	IFNZRO NOHSPT	<
PTP,	0
	CLA CLL CML	/SET LINK ON TO INDICATE PUNCH
	JMS PSETUP	/DO COMMON CRAP
PTPLP,	KSF
	JMP PTPCNT	/KEYBOARD FLAG OFF - DON'T WORRY ABOUT ^C
	KRS
	AND PTP177
	TAD PTPM3
	SZA CLA	/IS THERE A ^C IN THE TTY BUFFER?
	JMP PTPCNT	/NO
PTPCIF,	CDF CIF 0
	JMP I PT7600
PTPCNT,	TAD I PTPCA
	JMS PTPPCH	/FIRST CHAR IN LOW ORDER 8 BITS OF WORD 1
	DCA PTR
	ISZ PTPCA
PT7700,	7700
	TAD I PTPCA
	JMS PTPPCH	/SECOND CHAR IN LOW ORDER 8 BITS OF WORD 2
	CLL RTR
	RTR
	TAD PTR
	RTR
	RTR	/THIRD CHARACTER NOW IN AC
	JMS PTPPCH
PTPEND,	ISZ PTPCA
PT70,	70	/JUST IN CASE WERE PUNCHING PG 7600 KEEP THIS LITERAL HERE
	JMP PTPISZ
PSETUP,	0
	RDF	/GET FIELD OF CALLING PROGRAM
	TAD PTPCIF
	DCA PTPXIT	/SET UP RETURN SEQUENCE
	TAD I PTP
	AND PT70
	TAD PCDF
	DCA PTPCDF
	RAR		/GET LINK(1=PTP,0=PTR)
	TAD I PTP	/GET FUNCTION WORD
	ISZ PTP
	SPA		/CHECK CORRECT MODE
	JMP PTPERR	/SIGNAL "UNRECOVERABLE DEVICE ERROR"
	AND PT7700
	CMA		/SET UP -(WORD COUNT)/2-1
	DCA PTPWC
	TAD I PTP	/SET UP STARTING ADDRESS
	ISZ PTP
	DCA PTPCA
	TAD I PTP
PTPCDF,	0		/SET DATA FIELD TO ACCESS BUFFER
	PTPEOF=PTPCDF
	SNA CLA
	SZL
	JMP PTPISZ
	TAD PTP336	/INPUT INITIALIZATION - TYPE "^" AND WAIT
	TLS
	KSF
	JMP .-1
PT7600,	7600
PTPISZ,	ISZ PTPWC
	JMP I PSETUP	/LOOP FOR BUFFER SIZE (128 WORDS)
PTPRTN,	TAD PTPEOF
	SZA CLA		/DID WE RUN OUT OF TAPE?
	ISZ PTP
	ISZ PTP
PTPXIT,	HLT	/EXIT CDF GOES HERE
	JMP I PTP
PTPPCH,	0
	TLS
	TSF		/NOTICE THE GLORIOUS LACK OF OVERLAP
	JMP .-1
	AND PT7400
	JMP I PTPPCH
PTPCA,	0
PTR,	0		/CORRECT ENTRY IN MAIN ASSEMBLY IF THIS IS MOVED!
	CLA CLL
	TAD PTR
	DCA PTP
	JMS PSETUP	/SET UP ADDRESS, COUNT, FIELDS
PTRLP,	JMS PTRGCH	/READ FIRST CHARACTER OF 3
	DCA I PTPCA
	JMS PTRGCH
	DCA PTPPCH
	JMS PTRGCH
	DCA PTR
	TAD PTR
	RTL
	RTL
	AND PT7400
	TAD I PTPCA
	DCA I PTPCA	/HIGH ORDER 4 BITS INTO WORD 1
	TAD PTR		/GET THE CHAR FROM THE PTR BUFFER
	RTL
	RTL
	AND PT7400
	TAD PTPPCH
	ISZ PTPCA
PT7400,	7400
	DCA I PTPCA	/LOW ORDER 4 BITS INTO WORD 2
	JMP PTPEND
PTRGCH,	0
	TAD PTPEOF
	SNA CLA
	JMP I PTRGCH
	CLA CLL CMA RTL		/-3
	DCA PTPEOF
	DCA PTR
PTTIME,	ISZ PTR		/TIMEOUT LOOP FOR LOW SPEED READER
	JMP PTP232
	ISZ PTPEOF	/TIMES OUT IN 132 MS(PDP 8/E) OR 205 MS(PDP 8)
	JMP PTP232
	TAD PTP232
	JMP I PTRGCH	/OVERFLOWED - PTPEOF IS NOW 0, RETURN ^Z
PTP232,	232		/WASTE SOME TIME
PTP177,	177
	KSF
	JMP PTTIME	/READER NOT READY - CONTINUE TIMEOUT
	KRB
	JMP I PTRGCH	/RETURN WITH CHARACTER
PTPERR,	CLA CLL CML RAR	/SIGNAL A "PERMANENT I/O ERROR" ON THE DEVICE
	JMP PTPXIT-2
PCDF,	CDF 0
PTP336,	336
PTPWC,	0
PTPM3,	-3
	>
/THE NOPUNC AND ENPUNC PSEUDO OPS ARE USED TO
/'FAKE OUT' THE ASSEMBLER. THE CODE ASSEMBLES AS IF THE
/ORIGIN WERE AT 7607, BUT WHEN IT IS LOADED, THAT CODE GETS
/LOADED INTO 6607! THIS MEANS THAT ONE CAN BULID A DISK
/VERSION OF PS/8 WHILE RUNN ING UNDER A DECTAPE VERSION, AS
/THE SYSTEM HANDLERS ARE NOT OVERLAPPED.

/IN EACH SYSTEM HANDLER THE CODE
/		IFNZRO .-7700 <NZERR>
/APPEARS. THIS WILL CAUSE AN ASSEMBLY ERROR IF THINGS ARE
/SHUFFLED AROUND. THE SKP;HLT FOLLOWING ARE TO PREVENT
/MISTAKENLY DOING A JMS I (7700 WITH IF=0.
/THIS MISTAKE COULD DESTROY A SYSTEM.


	*6607	/SYSTEM HANDLER IN FIELD 0
	NOPUNCH
	*7607
	ENPUNCH
	IFNZRO	RF08+DF32	<
SHNDLR,	0
	CLA CLL CMA RTL	/-3
	DCA SYSCNT		/# TRYS ON ERROR
	TAD I SHNDLR
	RAL
	CLA RTL
	TAD S6603
	DCA SFUN	/EITHER A READ OR WRITE
	TAD I SHNDLR
	AND S70
	DCA SFIELD	/GET FIELD OF BUFFER
	TAD I SHNDLR
	RAL
	AND S7600
	CIA
	DCA SWC		/SET UP WORD COUNT
	CLA CMA
	ISZ SHNDLR
	TAD I SHNDLR
	DCA SCA		/BUFFER ADDRESS-1
	ISZ SHNDLR
	IFNZRO	DF32 <TAD I SHNDLR
/NOTE----SOFSET IS ZERO CURRENTLY

	TAD SOFSET
	RTL
	AND S3700>
	TAD SFIELD
	6615		/LOAD DISK EXTENDED MEMORY
S7600,	7600
	IFNZRO RF08 <TAD I SHNDLR
	TAD SOFSET
	RTR
	RTR
	AND S377
	6643	/LOAD HIGH ORDER>
	TAD I SHNDLR
	TAD SOFSET
	RTR
	RTR
	RAR
	AND S7400
SFUN,	HLT		/BECOMES DISK IOT.(READ OR WRITE)
	RDF
	TAD SCIF
	DCA SFIELD
	IFNZRO	DF32	<6622>
	IFNZRO	RF08	<6623>
	JMP .-1
	ISZ SHNDLR
	6621		/SKIP ON ERROR
	IFNZRO RF08 <SKP	/SENSE OF SKIP IS REVERSED>
	JMP SYSER
	ISZ SHNDLR
SFIELD,	HLT		/RETURN TO PROPER FIELD
	6601	/CLEAR TROUBLESOME FLAG
	JMP I SHNDLR
SYSER,	CLA CLL CML RAR	/4000
	ISZ SYSCNT	/TRY AGAIN?
	SKP CLA
	JMP SFIELD	/WHY BOTHER
	CLA CLL CMA RTL
	TAD SHNDLR
	DCA SHNDLR	/RESET PARAMETERS AND TRY AGAIN
	IFNZRO RF08	<IFNZRO .-7700	<NZERR>;	SKP;	HLT>
	JMP SHNDLR+3
SCIF,	CIF 0
SYSCNT,	0
	IFNZRO DF32	<IFNZRO .-7700	<NZERR>;	SKP;	HLT>
S6603,	6603
S70,	70
S7400,	7400
	IFNZRO	DF32 <S3700,	3700>
	IFNZRO RF08 <S377,	377>
	SCA=7751
	SWC=7750
	>
	IFNZRO DECTAPE <
SHNDLR,	0
	CLA CLL CMA RTL
	DCA SYSCNT	/3 TRIES ON ERROR
	RDF
	TAD SCIF
	DCA SFIELD	/RETURN FIELD SETUP
	TAD I SHNDLR
	DCA SFUN
	ISZ SHNDLR
	CLA CMA
	TAD I SHNDLR
	DCA SLOC	/BUFFER ADDRESS-1
	ISZ SHNDLR
STRY,	TAD S410	/SETUP DTA0 TO DO SEARCH REVERSE
	DTCA DTXA	/BUT MOTION BIT IS NOT ON
	DTLB
	CLA CMA CLL RAL
	DCA SCA	/7776=SBLOCK FROM PS/8 ASSEMBLY
	TAD SFUN
	RTR
	RTR
SERR,	RTL
	RAL		/LAST 4 INST. PUT MOTION BIT IN LINK
			/IF THIS BIT WAS SET IN THE CALLING
			/SEQUENCE, SEARCH STARTS FORWARD.
S7600,	7600
	TAD S200
SC,	SZL
	TAD S400
	DTXA		/ZAP MOTION BIT ON
	DTSF DTRB
	JMP .-1
	SPA		/CHECK FOR ANY ERRORS
	JMP SERR
	DTRA		/NO ERRORS
	RTL
	CMA RTL		/COMPLEMENT OF DIRECTION TO LINK
			/IF LINK ON, SEARCHING FORWARD.
	SNL CLA
	CML RTL
	TAD SBLOCK	/SEARCH FOR ONE RECORD BEFORE THE
			/REQUIRED ONE. THEN REVERSE DIRECTION
	CMA
	TAD I SHNDLR
	TAD I SHNDLR	/X+X=2*X; RECORDS TO BLOCKS
	TAD SOFSET
	TAD SOFSET	/ALSO DOUBLE OFFSET
	CMA
	SZA CLA	/IS IT PROPER RECORD?
	JMP SC
	SNL		/YES..IF LINK IS ON,WAS FWD SRCH
	JMP SC+1	/REVERSE..REVERSE TAPE MOTION
			/AND SEARCH FORWARD
	TAD SLOC
	DCA SCA
	TAD SFUN
	DTLB		/SET UP FIELD
	TAD SFUN
	CLL RAL
	AND S7600
	DCA SBLKCT	/BLOCK COUNT
	RAL		/FUNCTION TO BIT 11
	IFNZRO .-7700	<NZERR>
	SKP
	HLT		/TO PROTECT AGAINST BAD PROGRAMMERS
	IAC
	CLL CML RTL
	RTL		/FORMS EITHER READ OR WRITE
SL,	DTXA
	TAD S7600
	DCA SWC	/TRANSFER 200 (8)
	DTSF DTRB
	JMP .-1
	CLL CML	/IN CASE OF FATAL ERROR
	SPA CLA
	JMP SERR2
	TAD SBLKCT
	TAD S7600
	SNA		/ALL DONE?
	JMP SOVER	/YES
	DCA SBLKCT
	JMP SL
SERR2,	ISZ SYSCNT	/TRY AGAIN?
	JMP STRY
	SKP		/DON'T BOTHER
SOVER,	ISZ SHNDLR
	ISZ SHNDLR
	TAD S200	/STOP THE TAPE
	DTXA
	RAR		/GIVE FATAL RETURN
SFIELD,	HLT
	JMP I SHNDLR
SCIF,	CIF 0
S400,	400
S200,	200
S410,	410
	SBLKCT=7777
	SYSCNT=7750
	SFUN=7751
	SLOC=7752
	SWC=7754
	SCA=7755
	>
	IFNZRO RK8	<
	DCLA=6731
	DLDR=6733
	DLDC=6732
	DRDS=6741
	DRWC=6752
	DCLS=6742
	DSKC=6745
	DSKE=6747
	DLWC=6753
	DLCA=6755

		/I WILL ADMIT THAT THE FOLLOWING HANDLER
		/IS WRITTEN TERRIBLY, BUT IT WAS WRITTEN WHILE THE
		/RK8 HARDWARE WAS BEING DEBUGGED AND SO I COULD NOT
		/USE SOME OF THE COOL FEATURES OF THE CONTROLLER.
		/THE RK8 NOW WORKS BUT I AM TOO LAZY TO REWRITE THIS HANDLER

SHNDLR,	0
	CLA CLL CMA RTL
	DCA SYSCNT	/NO. ERROR TRIES
	RDF
	TAD SCIF
	DCA SFIELD	/CALLING FIELD..FOR RETURN
	TAD I SHNDLR
	DCA SFUN	/FUNCTION WORD
	ISZ SHNDLR
	CLA CMA
	TAD I SHNDLR
	DCA SLOC	/BUFFER ADDRESS-1
	ISZ SHNDLR
STRY,	TAD I SHNDLR
	TAD SOFSET	/SOFSET=0
	DCA SREC
	TAD SFUN
	RAL
	AND S7600
	DCA SBLKCT	/WORD COUNT
	RTL
	TAD SDLDR
	DCA SINST	/SINST=6733 (READ) OR 6735 WRITE
SLOOP,	TAD SLOC
	DLCA		/LOAD CURRENT ADDRESS
	TAD SBLKCT
	TAD S7600	/FULL OR HALF RECORD READ?
	SZA CLA
	TAD S7600	/FULL..2 PAGES
	TAD S7600	/HALF..1 PAGE
	DLWC		/WORD COUNT
	CLA CMA
	DCLS		/CLEAR ALL FLAGS
S7600,	7600
S7400,	7400
	TAD SFUN
	AND S70
	DLDC		/LOAD DATA FILED OF BUFFER
	TAD SREC
SINST,	0		/READ OR WRITE IOT
	DSKC
	SKP
	JMP SNEXT
	DSKE		/SKIP ON ERROR
	JMP SINST+1
SERROR,	ISZ SYSCNT
	JMP .+3		/TRY AGAIN!
	CLA CLL CML RAR	/DON'T BOTHER..YOU LOSE
	JMP SRTRN+1
	DRDS
	AND S40		/INSPECT 'SECTOR NOT FOUND BIT'
	ISZ SZERO
	JMP .-1		/DELAY TO LET UNIT QUIET DOWN (KLUDGE!)
	SNA CLA
	JMP SLOOP	/ERROR, BUT SECTOR FOUND
	CLA CMA
	DCLS
	IFNZRO .-7700	<NZERR>
	SKP CLA
	HLT
	DCLA		/SEEK TRACK 0
	DSKC
	JMP .-1
	JMP SLOOP	/AND RETRY
SNEXT,	DSKE		/DONE..IS ERROR FLAG UP?
	SKP
	JMP SERROR	/YEAH?!
	ISZ SREC	/NO..BUMP RECORD NO.
S70,	70
	TAD SLOC
	TAD S400
	DCA SLOC
	TAD SBLKCT
	CLL CML
	TAD S7400
	SZL SNA		/WORD COUNT EXHAUSTED?
	JMP .+3		/YES
	DCA SBLKCT
	JMP SLOOP
	CLA
SRTRN,	ISZ SHNDLR
	ISZ SHNDLR
SFIELD,	HLT
	JMP I SHNDLR
SLOC,	0
SREC,	0
SBLKCT,	0
SYSCNT,	0
SFUN,	0
SZERO,	0
S400,	400
SCIF,	CIF 0
SDLDR,	DLDR
S40,	40
	>
	IFNZRO LINCSYS <
SHNDLR,	0
S7600,	7600
	RDF
	TAD SCIF
	DCA SXIT
	TAD I SHNDLR
	DCA SFUN	/FUNCTION
	ISZ SHNDLR
	TAD I SHNDLR
	DCA SADR	/BUFFER ADDRESS
	ISZ SHNDLR
	TAD I SHNDLR
	TAD SOFSET	/SOFSET=0
	CLL RAL
	DCA SBLOK	/BLOCK NO.
	ISZ SHNDLR
	CLL CML RAR
	AND SFUN
	RTL
	RTL
	TAD S702	/GET FUNCTION;CREATE READ OR WRITE
	DCA SINST	/READ OR WRITE INSTRUCTION.
	TAD SFUN
	AND S70		/FIELD BITS TO AC 0-2
	RTL
	IAC RTL		/SET EXTENDED ADDRESS
	RTL
	LINC=6141
	PDP=2
	AXO=1		/SEND TO CONTROLLER
	TMA=23

	LINC
	AXO
	PDP
	CLA
	TAD SFUN
	RAL
	AND S7600
	DCA SFUN
SLOOP,	CLA CLL CMA RTL
	DCA SERRCT	/NO. ERROR TRIES
STRY,	TAD SADR
	LINC
	TMA		/CORE ADDRESS TO CONTROL
SINST,	0		/READ OR WRITE
SBLOK,	0		/BLOCK NO. HERE
	PDP
	CMA		/CHECKSUM HERE. 7777=GOOD
	SZA CLA
	JMP SERR
SOK,	ISZ SBLOK
	TAD SADR	/BUMP UP BLOCK AND CORE ADDRESS
	TAD S200	/PARAMETERS
	DCA SADR
	TAD SFUN
	TAD S7600
	SNA		/ALL DONE?
	JMP SDONE	/YES
	DCA SFUN
	JMP SLOOP
SERR,	TAD SINST
	IFNZRO .-7700	<NZERR>
	SKP
	HLT
	RTR;RTR
	SPA CLA	/WAS IT READ?
	JMP SOK		/NO..WRITE. CONTINUE
	ISZ SERRCT	/READ..RETRY IT?
	JMP STRY
	CLA CLL CML RAR	/DON'T BOTHER
	SKP
SDONE,	ISZ SHNDLR
SXIT,	0
	JMP I SHNDLR
SFUN,	0
SADR,	0
SERRCT,	0
S702,	702
S200,	200
S70,	70
SCIF,	CDF CIF 0
	>
	/MONITOR BOOTSTRAP AND GENERATOR
	IFNZRO	RF08+DF32	<

	*7400
	NOPUNC
	*6604
	ENPUNC
	NOP		/FOR "SWAP"
B6653,	6653
B7647,	7647
B7577,	7577
B200,	200
B7605,	7605
B7751,	7751
	ZBLOCK	6622-.
	TAD I B6653
	CDF 10
	DCA I B7647
	CDF 0
	ISZ B6653
	ISZ B7647
	JMP .-6		/MOVE FIELD 1 RESIDENT UP
	IFNZRO	RF08	<6643>
	6615
	7600
	TAD B7577
	DCA I B7751
	TAD B200
	6603		/NOW READ IN FIELD 0 RESIDENT FROM RECORD 1/2

	IFNZRO	RF08	<6623>
	IFNZRO	DF32	<6622>
	JMP .-1
	6621
	IFNZRO	RF08	<SKP>
	HLT		/ERROR READING SYSTEM IN
	JMP I B7605



	/BOOTSTRAP FOR DISK MONITOR IS AS FOLLOWS:

	/	LOCATION	CONTENTS
	/	7750		7600
	/	7751		6603
	/	7752		6622
	/	7753		5352
	/	7754		5752
	>
	IFNZRO DECTAPE <
	*7400		/DECTAPE BOOTSTRAP - LOADS INTO 7600
	NOPUNCH
	*7600
	ENPUNCH
	TAD B600	/THIS CODE ONLY EXECUTED ON DMS-TYPE BOOTSTRAP
	DTCA DTXA	/ALL IT DOES IS SIMULATE THE OTHER TYPE OF BOOTSTRAP
	DTSF		/MORAL: DISK MONITOR SYSTEM SUCKS
	JMP .-1
	DCA BOOTX
	DCA BOOTX+1	/FUDGE TO MAKE USE OF SOME COMMON CODE
	TAD B620
	JMP BOOT3	/START READING OVER OURSELVES WITH RECORD 0 AGAIN
	ZBLOCK	7611-.
BM7642,	-7642		/MUST BE BEFORE 7617
BOOT1,	TAD 7755
	TAD BM7642
	SNA CLA		/WATCH THE PROGRESS OF THE READ
	JMP BOOT2	/WHEN IT GETS PAST 7643, SWITCH TO FIELD 1
	NOP		/LOADS OVER DTSF IN 7616
	JMP BOOT1	/LOADS OVER JMP .-1 IN 7617 - STARTS BOOTSTRAP
BOOT2,	TAD B10
	DTLB		/ZAP A 10 INTO STATUS REG B TO LOAD INTO FIELD 1
	DTSF		/FROM HERE ON - LOAD THE FIELD 1 RESIDENT INTO FIELD 1
	JMP .-1
BOOT3,	DTXA	/CONTINUE READING NEXT RECORD(ALSO SEE CODE AT 7600)
	DTLB		/INTO FIELD 0
	TAD B7577
	DCA 7755	/PAGE 7600
	DCA 7754
BOOTX,	CDF CIF 10
	JMP 7643	/JUMP INTO WAIT LOOP IN FIELD 1
	JMP BOOT1	/DISK MONITOR FUDGE - JUMP INTO WAITING LOOP
B7577,	7577
B10,	10
B600,	600
B620,	620
	ZBLOCK	7643-.
	DTSF		/THIS IS LOADED INTO FIELD 1 WITH MONITOR RESIDENT
	JMP .-1		/IT IS IN THE CD OUTPUT AREA AND SO WILL BE ZAPPED
	CDF CIF 0	/BY THE KEYBOARD MONITOR
	JMP 7605	/OK, FIELD 0 RESIDENT READ IN, START UP MONITOR


	/BOOTSTRAP FOR DECTAPE MONITOR IS THE SAME AS FOR THE 
	/DEC LIBRARY SYSTEM, RL MONITOR AND POLY BASIC - OR JUST
	/READ RECORD 0 INTO 7600 AND TRANSFER TO 7600 A LA DISK
	/MONITOR SYSTEM ON DECTAPE
	>
	IFNZRO RK8 <
	*7400
	NOPUNC
	*1
	ENPUNC
BOOT,	TAD I BOOTX1
	DCA I BOOTX2
	TAD I BOOTX3
	CDF 10
	DCA I BOOTX4
	CDF 0
	TAD BOOTX2
	SZA CLA
	JMP BOOT
	JMP I B7605
BOOTX1,	200
BOOTX2,	7577
BOOTX3,	47
BOOTX4,	7646
	ZBLOCK	27-.
B7605,	7605
	DSKC		/MUST LOAD OVER LOC. 30
	JMP .-1		/MUST LOAD OVER 31
	JMP BOOT



	/THE BOOTSTRAP FOR THE RK8 IS AS FOLLOWS:

	/	LOCATION	CONTENTS
	/	30		6733
	/	31		5031

	/LOAD ADDRESS 30 AND START
	>
	IFNZRO LINCSYS <
	*7416		/ACTUALLY LOADS INTO 4016
B4047,	4047
B7647,	7647
	1020;20;4		/IO PRESET
	1020;20;AXO	/LOAD SOME LINCTAPE FLAGS
	1020;7600;TMA	/LOAD MEMORY ADDRESS
	720;1		/READ RECORD 1
	PDP		/BACK TO PDP-8 MODE
	CLA
	TAD I B4047
	CDF 10
	DCA I B7647
	CDF 00
	ISZ B4047
	ISZ B7647
	JMP .-6
	JMP I .+1
	7605



	/THE BOOTSTRAP FOR A LINCTAPE SYSTEM IS AS FOLLOWS:

	/LEFT SWITCHES=700,RIGHT SWITCHES=0
	/I-O PRESET IN LINC MODE AND PRESS "D0". TAPE WILL MOVE
	/WHEN TAPE STOPS PRESS "START 20".
	>
	$
