File: SPATCH.07 of Tape: OS8/OS8-V3/dec-s8-osysb-a-ua3
(Source file text) 

/OS8 SABR ASSEMBLER OVERLAY                  **** SPATCH.07 ****
/
/
/
/
/
/
/COPYRIGHT  (C)  1974 BY DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
/CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
/DIGITAL.
/
/
/
/
/
/
/
/
/
/
/SABR ASSEMBLER, LIKE 8K FORTRAN UNDER OS/8, RUNS
/IN FIELD 1 WITH ITS TABLES IN FIELD 0.
/	OCTOBER 26,1971
/
/MODIFIED SO THAT SABR WILL, AT RUN TIME, DETERMINE IF THE USER
/SPECIFIED I/O DEVICES REQUIRE TWO PAGE HANDLERS, AND IF SO
/SABR WILL ALLOCATE SPACE FOR THEM.  ALSO IF ALL I/O IS DONE VIA THE
/SYSTEM DEVICE, SABR WILL NOT RESERVE ANY SPACE FOR I/O HANDLERS
/SPACE FOR TWO PAGE HANDLERS IS MADE BY SHRINKING THE INPUT
/BUFFERS-CURRENTLY 4 PAGES-TO 2 PAGES.  B.CLOGHER  10/71
/

	FIELD 0
	SDVHND=766
	MPARAM=7643
	DVHNDL=7647
	JSBITS=7746
	MOFILE=7600
	CORE1=6200	/UPPER CORE LIMIT OF OCCURRENCE TABLE(VARIES WITH I/O HANDLERS NEEDED!!)
	SABR=202	/SABR V17 FIRST LOC AFTER "JMS I IOINIT"
	PASS=110	/SABR V17
	SERROR=JMS I 177/SABR V17
	ERRE=2701	/SABR V17
	PRSYMP=41	/SABR V17
	TEM1=123	/SABR V17
	TEM2=124	/"
	M4=3704		/"
	CLOC1=6		/"
	CLOC2=3162	/"
	CLOC3=4356	/"
	CTYPE=23	/"
	CHR=61		/"
	SYMBOL=3	/"
	LLFS=5364	/"
	LINE=67		/"
	L64=4772	/"
	TYPE=54		/"
	PUNCH=42	/"
	INBUF=6200	/6200-7177 OR 6600-7177
	PRJ5=4051
	PRNOP=4136
	PRJ2=4170
	PRS2=4025
	PRS5=4101
	*30	/CCL PATCH; GOES HERE AS A HACK
CCLKLG,	TAD	[SKP
	DCA I	[CCLSKP
	CDF	10
	ISZ I	[7645
	JMP I	[NOTFRT
	CDF
	JMP I	[SETCOR

	*200	/INITIALIZATION - GETS DESTROYED DURING SABR EXECUTION

START,	ISZ I [FSWITC	/SKIPS SINCE FSWITC=-1. ENTRY FROM "R SABR"
FSTART,	JMP CCLKLG	/ENTRY FROM 8K FORTRAN VIA "RUN SABR" MONITOR CALL
	CLA CMA		/USED AS TEM. BY SUBR. DNUM
	DCA I [FSWITC	/USED AS TEM. BY SUBR. DNUM
PTEM1,	CIF 10
	JMS I [7700	/CALL I/O MONITOR
	10		/AND ASK IT TO STICK AROUND
	CIF 10
	JMS I [200
	5		/COMMAND DECODE
	2302		/.SB ASSUMED EXTENSION
NOTFRT,	CDF 10
	TAD I [MPARAM
	AND [100
	CDF 0
	SNA CLA		/IS /F SWITCH ON?
	DCA I [FSWITC	/NO - ZERO OUT FSWITC
	TAD I [JSBITS
	TAD [1000
	DCA I [JSBITS
CCLSKP,	JMP .+5
SETCOR,	ISZ I [FDSW	/SET DELETE SWITCH
	CIF	10
	JMS I	[7700	/CALL I/O MONITOR--LOCK IT IN
	10
	CDF	10
	TAD I	[MOFILE	/CHECK FIRST TWO OUT DEV. SPECS.--NEED 2 PAGE HNDLR?
OUTL,	JMS	DNUM
	JMP	OSYS	/NO OUTPUT OR SYS DEV.
	JMP	TWOPAG	/NEED TWO-PAGE HANDLER
DONE,	TAD I	[MOFILE+5	/1 PAGE HNDLR-LOOK AT 2ND OUT DEV.
	ISZ	CNT	/DONE BOTH?
	JMP	OUTL	/NO-GO ON
	CLA		/YES-
	TAD	PTEM2	/ARE BOTH OUT DEVS. SYS: OR NOT THERE?
	SZA	CLA	/IF SO-ALLOT 0 PAGES FOR OUTPUT HANDLER
	TAD	[-200	/NO-ALLOT 1 PAGE FOR HANDLER
DONE1,	DCA	OPGES	/-SIZE OF OUT HANDLER NEEDED
INLP,	TAD I	TEM	/NOW LOOP THRU 9 POSSIBLE INPUT SPECS.
	JMS	DNUM
	JMP	ISYS	/INPUT NOT THERE OR SYS DEV.
	JMP	TWOPG	/TWO PAGE HANDLER NEEDED
ILP1,	ISZ	TEM	/ONE-MOVE PTR TO NEXT
	ISZ	TEM
	ISZ	CNT1	/DONE ALL 9?
	JMP	INLP	/NO
	TAD	TEM3	/YES-ARE ALL INPUTS FROM SYS OR NOT THERE?
	SZA	CLA	/IF SO-DON'T SAVE ROOM FOR INPUT HANDLER
	TAD	[-200	/NO-NEED ONE PAGE FOR HANDLER
IDONE,	DCA	IPGES	/STORE AS SIZE OF INPUT HANDLER
	TAD	IPGES
	TAD	OPGES
	TAD	[400	/NEED MORE THAN A TOTAL OF 2 PAGES FOR HANDLERS?
	CDF	00	/BACK TO DF 0
	SMA	CLA
	JMP	NOTWO	/NO-GO ON
	DCA I	[INREC1	/YES-ADJUST INPUT ROUTINE FOR ONLY 2 PAGE BUFFERS
	TAD	[200
	DCA I	[INBFPT-1
	DCA I	[INRD1
	DCA I	[INRD1+1
	TAD	[6600	/RESET ADDRESS OF INPUT BUFFER
	DCA I	[INBFPT
	TAD	[400
NOTWO,	TAD	[6200	/RESET UPPER CORE LIM. OF OCCURRANCE TABLE
	TAD	IPGES
	TAD	OPGES
	DCA	[CORE1
	TAD	OPGES
	TAD	[200
	SPA	CLA	/MORE THAN ONE PAGE OUT HNDLR NEEDED?
	IAC		/YES
	TAD	OPGES
	TAD I	[INBFPT	/ADJUST HANDLER FETCH FOR TWO PAGE HANDLER
	CDF	10	/BACK TO DATA FIELD 1
	DCA I	[OUHND
	CMA		/PROPAGATE CHANGES INTO MAIN PART OF SABR
	TAD	[CORE1
	DCA I [CLOC1
	TAD I [CLOC1
	DCA I [CLOC3
	TAD	[CORE1
	DCA I [CLOC2
	TAD	IPGES
	TAD	[200
	SPA	CLA	/MORE THAN ONE PAGE FOR INPUT HNDLR?
	IAC		/YES-ADJUST IN HNDLR FETCH ROUTINE
	TAD I	[CLOC2	/(CONTAINS START ADDRESS OF CORE FOR IN HNDLR.)
	CDF	00
	DCA I	[ADEVN	/STORE FOR HNDLR FETCH ROUTINE
	CDF	10
	JMP I	[LCHK
ISYS,	ISZ	TEM3
IPGES,	0
	JMP	ILP1	/INPUT SPEC. NOT THERE OR SYS DEV.
TWOPG,	TAD	[-200	/INPUT SPEC-NEEDS TWO PAGES
	JMP	IDONE-1	
TWOPAG,	TAD	[-200	/OUT HNDLR NEEDS TWO PAGES
	JMP	DONE1-1
OSYS,	ISZ	PTEM2	/OUT HNDLR NOT NEEDED OR SYS. DEVICE
OPGES,	0
	JMP	DONE
/
/ROUTINE TO CHECK DEVICE SPECS. LEFT BY COMMAND DECODER AND SEE
/IF WE NEED ANY TWO PAGE HANDLERS. ALSO CHECK IF ALL I/O IS FROM
/SYS DEVICE IN WHICH WE DON'T HAVE TO SAVE ROOM FOR ANY HANDLERS
/RETN. TO CALL + 1 IF DON'T NEED ROOM FOR ANY HANDLER
/RETN. TO CALL + 2 IF NEED 2 PAGES FOR HANDLER
/RETN. TO CALL + 3 IF NEED 1 PAGE FOR HANDLER
/
DNUM,	0
	AND	[17	/MASK DEV. #
	DCA	FSTART+1	/STORE
	TAD	FSTART+1
	CLL
	SNA		/ANYTHING THERE?
	JMP I	DNUM	/NO-TREAT LIKE SYS. DEV
	TAD	[DVHNDL-1	/CHECK IF THIS HANDLER CO-RESIDENT WITH SYS.(TD8/E--UNIT 1)
	DCA	FSTART+2
	TAD I	FSTART+2
	TAD	[200
	SZL	CLA	/IS ENTRY PT. ABOVE 7600??
	JMP I	DNUM	/YES-JUST LIKE SYS DEV.
	TAD	FSTART+1
	TAD	[SDVHND-1	/NO-PICK UP TABLE WD WHICH TELLS IF 2 PAGE HNDLR.
	DCA	FSTART+2
	TAD I	FSTART+2
	ISZ	DNUM	/BUMP RETN.
	SMA	CLA	/BIT 0=1? I.E. DOES IT NEED TWO PAGES?
	ISZ	DNUM	/NO-NORMAL RETN. TO CALL+3--NEED 1 PAGE
	JMP I	DNUM	/YES-RETN. TO CALL+2--NEED 2 PAGES
TEM3,	-11
CNT,	-2
CNT1,	-11
PTEM2,	-2
TEM,	MOFILE+17
*400
LCHK,	TAD I [MPARAM+1
	AND [40
	SNA CLA		/IF /S IS ON
	TAD I [MOFILE+5
	SZA CLA		/OR IF THERE IS NO LISTING OUTPUT FILE
	JMP NSPEED
	TAD [PRS5&177+5200	/SPEED UP SYMBOL TABLE SORT
	DCA I [PRJ5
	DCA I [PRNOP
	DCA I [SYMXX	/AND PRINT "U" MESSAGE FOR UNDEFINEDS
	TAD [PRS2-1&177+5200
	DCA I [PRJ2
NSPEED,	CDF 10
	TAD I [MOFILE+4	/GET EXTENSION OF BINARY OUTPUT
	SNA		/IS IT THERE?
	TAD [2214	/NO - SET TO .RL
	DCA I [MOFILE+4
	TAD I [MOFILE+11
	SNA
	TAD [1423	/SIMILIARLY SET LISTING EXTENSION TO .LS
	DCA I [MOFILE+11
	DCA I [OUTINH
	TAD I [MOFILE
	SNA CLA		/BINARY OUTPUT?
	JMP NOBNOT	/NO
	CDF CIF 10
	JMS I [TSTNTR	/YES - OPEN IT
	CDF 10
	JMP YESBOT
NOBNOT,	TAD [MOFILE+1
	DCA I [PFILE
	ISZ I [OUTINH	/INHIBIT OUTPUT
YESBOT,	TAD I [MOFILE+5
	CDF 0
	SZA CLA
	DCA I [LSTFLG
	CDF 10
	TAD I [MPARAM
	AND [41		/"L" OR "G" FLAGS ON?
	CDF 0
	SNA CLA
	JMP NOLOAD
	JMS I [MINCOR
	CLA IAC		/DEVICE "SYS"
	CIF 10
	JMS I [200
	2	/LOOKUP
ALOAD,	LOADER
	0	/LENGTH GOES HERE AND IS IGNORED
	JMP NOLODR	/COULDN'T FIND IT
	TAD ALOAD
	DCA I [LDRBLK
	CDF 10
	TAD I [OUTREC
	CDF 0
	DCA I [REMEMB
NOLOAD,	JMS I [OPENFL	/OPEN FIRST INPUT FILE WHILE MONITOR STILL IN CORE
	CDF CIF 10
	JMP I .+1
	SABR	/FIRST LOC IN SABR AFTER "INITIAL DIALOGUE"
NOLODR,	TAD [1200
	JMP I [ERROR
LOADER,	TEXT	/LOADERSV/
	*1100	/FILE OPENER - RESIDES IN PART OF THE OLD SABR INPUT BUFFER
O7760,	7760
OPENFL,	0
	CDF 10
	TAD I FILPTR
	SNA	/IS THERE ANOTHER INPUT FILE?
	JMP I (ERROR+1	/ERROR - NO END STATEMENT IN PROGRAM
	DCA OTEMP
	TAD OTEMP
	AND (17		/EXTRACT DEVICE NUMBER
	TAD (DVHNDL-1
	DCA OTEMP2
	TAD I OTEMP2
	DCA OTEMP2
	ISZ FILPTR
	TAD I FILPTR	/GET STARTING BLOCK #
	CDF 0
	DCA I (INREC	/STORE IT AWAY
	ISZ FILPTR
	TAD OTEMP
	AND (7760	/EXTRACT LENGTH
	SZA		/LENGTH OF 256 IMPLIES MAY BE LARGER
	TAD (17
	CLL CML RTR
	RTR		/GET LENGTH AS A NORMAL NEGATIVE NUMBER
	DCA I (INCNT	/STORE THAT AWAY TOO
	TAD OTEMP2
	SZA
	JMP GOTIT
	JMS I (MINCOR	/GET MONITOR
	TAD	ADEVN	/THIS LOC. SET UP BY INITIALIZATION ROUTINE
	DCA ADEVNO
	TAD OTEMP
	CIF 10
	JMS I O200
	1		/ASSIGN
ADEVNO,	5600		/FORCE HANDLER INTO PAGE 5600
	JMP I (DELERR	/GIVE S ERROR
	TAD ADEVNO
GOTIT,	DCA I (INDEV
	JMS I (MOUCOR	/GET MONITOR OUT
	CLA CMA
	DCA I (INCHCT	/FORCE BUFFER LOAD ON FIRST READ
	JMP I OPENFL
OTEMP,	0
OTEMP2,	0
FILPTR,	7617
O200,	200
ADEVN,	0	/SET UP BY INIT. ROUTINE-PAGE ADDR. OF IN HNDLR
	*1600
MINCOR,	0
	RDF
	TAD MINCIF
	DCA MINXIT
MINCIF,	CDF CIF 0
	CIF 10
	JMS I SYSTEM
	10	/ESCAPE
	TAD MIN200
	DCA SYSTEM
MINXIT,	0		/RESTORE CALLING FIELDS
	JMP I MINCOR
MOUCOR,	0
	CDF 0
	TAD SYSTEM
E7500,	SMA
	CIF 10
MN7700,	SMA CLA
	JMS I SYSTEM
	11	/GET OUT
	TAD MN7700
	DCA SYSTEM
	JMP I MOUCOR
SYSTEM,	200
MIN200,	200
ERROR,	TAD E7500	/MAKE SABR ERROR "B"
	DCA MINCOR
	JMS MOUCOR	/KICK MONITOR OUT
	CDF CIF 10
	DCA I EPASS	/SET PASS=0 SO ERROR WILL PRINT
	TAD EL64
	DCA I ETYPE
	TAD MINCOR
	JMP I .+1
	ERRE
EPASS,	PASS
EL64,	L64
ETYPE,	TYPE
	*7200
SPAUSE,	0		/"PAUSE" STATEMENT PATCH
	TAD FSWITC
	CLL RAL
	TAD I (FILPTR
	DCA I (FILPTR	/RESET FILE POINTER IF CALLED FROM FORTRAN
	JMS I (OPENFL	/OPEN NEXT FILE
	CDF CIF 10
	JMP I SPAUSE
FSWITC,	-1		/AS ADVERTISED

DELETE,	TAD I (MPARAM
	RTR		/PUT "K" SWITCH IN LINK
D7600,	7600
	CDF 0
	TAD I (JSBITS
	RAR
	CLL CML RAL
	DCA I (JSBITS	/MARK "DON'T CARE IF MONITOR AREA DESTROYED" BITS
	TAD FDSW
	SZL SNA CLA	/DELETE ONLY IF CALLED FROM FORTRAN WITH
	JMP NODLET	/"K" SWITCH(IN LINK) ZERO
	JMS I (MINCOR
	CLA IAC		/DEVICE "SYS"
	CIF 10
	JMS I (200
	4	/CLOSE - USED AS DELETE
	NAME	/NAME FOR CLOSE PROCESSOR
	0	/NO BLOCKS - WILL BE DELETED
	JMP DELERR	/ERROR
NODLET,	TAD LDRBLK
	SNA CLA		/WAS A LOADER BLOCK STORED
	JMP GETOUT
	CDF 10
	TAD I (L64
	CDF 0
	SZA CLA		/IF WE USED THE TELETYPE ROUTINE,
	JMP GETOUT	/THEN THERE WAS AN ERROR
	TAD REMEMB
	CDF 10
	DCA I (MOFILE+1
	STA
	DCA I (MPARAM+2
	CDF 0
	JMS I (MINCOR
	CIF 10
	JMS I (200
	6	/RUN
LDRBLK,	0
REMEMB,	0
FDSW,	0
GETOUT,	TAD I (SYSTEM
	CDF 10
D7700,	SMA CLA
	CMA
	DCA I D7700
	CDF 0
	JMP I .+1
	7605
DELERR,	TAD (1700	/GIVE A "S" ERROR
DELER2,	TAD (200
	CDF CIF 0
	JMP I (ERROR
NAME,	0617;2224;2216;2415

INREAD,	0
	AND D7700
	SNA CLA
	JMS I POPNFL
	JMS I INDEV
	400	/OR 200 IF NEED TWO PAGE HANDLERS-REDUCE BUFFER SIZE TO MAKE ROOM
INBFPT,	INBUF
INREC,	0
	JMP INERR
	ISZ INREAD
	ISZ INREC
INREC1,	ISZ INREC	/OR 0000 IF TWO PAGE HANDLERS-SINCE IN BUFFER IS 1/2 SIZE
	JMP I INREAD
INDEV,	0
INERR,	SPA CLA
	JMP DELER2
	JMP INREC+3
POPNFL,	OPENFL

CLSMBE,	0		/SUBR TO CLOSE OUTPUT FILE IF ONE EXISTS
	CDF CIF 10
	TAD I (OUTINH
	SNA CLA
	JMS I (OUCLOS
	CIF 0		/IN CASE WE DIDN'T CLOSE IT
	JMP I CLSMBE
	*7400	/END OF PASS CRAP AND INPUT ROUTINE
P40,	40
PASEND,	ISZ I (PASS	/BUMP PASS COUNTER
LSTFLG,	JMP SBSYMT	/ZERO IF LISTING FILE EXISTS
	JMS I (CLSMBE	/CLOSE BINARY FILE
	CDF CIF 10
	JMS I (TSTNTR	/ENTER LISTING FILE
	TAD I (FSWITC
	SZA CLA
	JMP .+4
	TAD (7617
	DCA I (FILPTR	/RESET FILE POINTER TO BEGINNING
	JMS I (OPENFL	/AND OPEN FIRST FILE
		/IF CALLED FROM FORTRAN WE DONT HAVE TO DO THIS
		/BECAUSE OF THE PECULIAR NATURE OF FORTRAN OUTPUT
	JMS I (MOUCOR	/KICK MONITOR OUT
	CDF CIF 10
	TAD I (MPARAM+1
P200,	AND P40		/MASK OUT "S" SWITCH
	DCA I (OUTINH	/INTO "OUTPUT INHIBIT" FLAG
	JMS I (SYMPRT	/PRINT SYMBOL TABLE UNDER CONTROL OF /S
	DCA I (OUTINH	/ZERO FLAG FOR LISTING
	TAD I (MPARAM+1	/SYMPRT RETURNS WITH DATA FIELD=10
	RTL
	CIF 10
	SNL CLA		/"N" FLAG IS IN THE LINK
	JMP I (ENDRSM	/HE WANTS A LISTING - GO GET IT
SBREND,	CIF 0
	JMS I (CLSMBE	/CLOSE OUTPUT FILE
	JMP I (DELETE	/DELETE FORTRN.TM AND CHAIN OR RETURN

SBSYMT,	TAD (TDUMMY
	CDF CIF 10
	DCA I (PUNCH	/INHIBIT ALL FUTURE OUTPUT
	JMS I (SYMPRT	/CHECK SYMTAB FOR UNDEFINEDS
	CDF 0
	ISZ I (JSBITS	/SET "DON'T CARE ABOUT USR CORE" FLAG
	JMP SBREND	/NOW GO CLOSE BINARY OUTPUT FILE AND RETURN

INCHAR,	0
	ISZ INJMP
	KSF
	JMP .+5
	KRS
	TAD (-203
	SNA CLA
	JMP I (7600	/EXIT TO MONITOR IF ^C TYPED
	ISZ INCHCT
INJMPP,	INJMPE
	TAD INCNT
INRD,	JMS I (INREAD
	DCA INCNT	/RETURN HERE ON EOF
INRD1,	ISZ INCNT	/SET TO 0000 IF 2 PAGE HANDLERS FORCE INPT. BUFF. TO 1/2 SIZE
	SKP		/	"	"	"
	TAD (600
	ISZ INCNT
IN7400,	7400
	TAD (-1401
	DCA INCHCT
	TAD INJMPP
	DCA INJMP
	TAD I	(INBFPT
	DCA INPTR
	JMP INCHAR+1
	INJMPE=JMP .
INJMP,	INJMPE
	JMP INCHA1
	JMP INCHA2
INCHA3,	TAD INJMPP
	DCA INJMP
	TAD I INPTR
	AND IN7400
	CLL RTR
	RTR
	TAD INTEMP
	RTR
	RTR
	ISZ INPTR
	JMP INCOM
INCHA2,	TAD I INPTR
	AND IN7400
	DCA INTEMP
	ISZ INPTR
INCHA1,	TAD I INPTR
INCOM,	AND (177
	SZA
	TAD (-177
	SNA
	JMP INCHAR+1
	TAD (145	/CHECK FOR ^Z
	SNA
	JMP INRD	/^Z ON INPUT MEANS GO TO NEXT FILE
	TAD (232
	CDF CIF 10
	DCA I (CHR
	JMP I INCHAR
INPTR,	0
INCHCT,	0
INTEMP,	0
INCNT,	0
	FIELD 1
	*6400	/OUTPUT ROUTINE INTERFACE - CANT GO PAST 6423
OUCHAR,	0
	DCA I POUTEM
	TAD OUTINH
	SZA CLA
OUCRET,	JMP I OUCHAR	/DOUBLES AS OFF-PAGE RETURN
	ISZ I POUJMP
	ISZ OUCHCT
	JMP I POUJMX
	JMS OUTDMP
	JMP OUCHAR+2
POUJMP,	OUJMP
POUJMX,	OUJMX
POUTEM,	OUTEMP
OUTINH,	0
F3ERR,	TAD O2100
F2ERR,	TAD O2100
F1ERR,	CDF CIF 0
	JMP I .+1
	ERROR
O2100,	2100
	*6457	/LOADS OVER OLD SABR INITIALIZATION ROUTINE
TSTNTR,	0		/CALLED FROM FIELD 0
	TAD PFILE
	TAD C4
	DCA PFILE
	TAD I PFILE
	ISZ PFILE
	DCA ODEVNO
	TAD	OUHND	/THIS LOC. IS SET UP AT INIT. TIME
	DCA OUHNDL
	CIF 0
	JMS I (MINCOR
	JMS I (200
	13		/RESET OUTPUT DEVICE
	TAD ODEVNO	/LOAD OUTPUT DEVICE
	JMS I (200
	1
OUHNDL,	7400
	JMP F2ERR
	TAD PFILE
	DCA ENAME	/POINTS TO FILE NAME
	DCA OULNGT	/ZERO CLOSING LENGTH
	TAD ODEVNO	/LOAD DEVICE NUMBER AND REQUESTED LENGTH
	JMS I (200
	3	/ENTER
ENAME,	0		/POINTER INTO COMMAND DECODER AREA GOES HERE
	OUCHCT=ENAME
ELENGT,	0		/"0 LENGTH" MEANS AS LARGE A SPACE AS POSSIBLE
	JMP F2ERR	/COULDN'T ENTER FILE - MAYBE BAD DIRECTORY
	TAD ENAME	/GET STARTING BLOCK #
	DCA OUTREC	/STORE IT AWAY
	JMS OUSPTR	/INITIALIZE OUTPUT ROUTINE
ENTRTN,	CDF CIF 0
	JMP I TSTNTR
OUSPTR,	0
	TAD POUBUF
	DCA I (OUPTR
	TAD (-601
	DCA OUCHCT
	TAD (OUJMPE
	DCA I POUJMP
	JMP I OUSPTR
OUTDMP,	0
	CIF 0
	JMS I OUHNDL
	4200
POUBUF,	1200	/REMAINDER OF OLD SABR INPUT BUFFER
OUTREC,	0
	JMP F3ERR
	ISZ OUTREC
	JMS OUSPTR
	ISZ OULNGT
	ISZ ELENGT
	JMP I OUTDMP
	JMP F2ERR
OUCLOS,	0
	TAD OUT232	/PUT A ^Z IN THE OUTPUT FILE
	JMS OUCHAR
	TAD OUCHCT
	CMA
	SZA CLA
	JMP .-4		/FILL REMAINDER OF BUFFER WITH ZEROS
	JMS OUTDMP
	CIF 0
	JMS I (MINCOR
	TAD ODEVNO
	JMS I (200
C4,	4	/CLOSE
PFILE,	7574
OULNGT,	0
	JMP F2ERR	/ERROR ON CLOSE
	DCA OULNGT
	CIF 0
	JMP I OUCLOS
OUT232,	232
ODEVNO,	0
OUHND,	0	/SET UP AT INIT. TIME TO ALLOW 2 PAGE HNDLR
			/IF NEEDED
	*6610	/OUTPUT ROUTINE - CANT GO PAST 6661
OUJMX,	CDF 0
	OUJMPE=JMP .
OUJMP,	OUJMPE
	JMP OUCHA1
	JMP OUCHA2
OUCHA3,	TAD OUTEMP
	RTL
	RTL
	DCA OUTEMP
	TAD OUJMPP
	DCA OUJMP
	TAD OUTEMP
	AND OU7400
	TAD I OUPOLD
	DCA I OUPOLD
	TAD OUTEMP
	RTL
	RTL
	AND OU7400
	TAD I OUPTR
	DCA I OUPTR
	ISZ OUPTR
	JMP OUCOM
OUCHA2,	TAD OUPTR
	DCA OUPOLD
	ISZ OUPTR
OUCHA1,	TAD OUTEMP
	AND OU377
	DCA I OUPTR
OUCOM,	CDF 10
	JMP I .+1
	OUCRET
OUPTR,	0
OUJMPP,	OUJMPE
OUPOLD,	0
OUTEMP,	0
OU7400,	7400
OU377,	377
		/PATCHES TO SABR TO HOOK INTO THESE WONDERFUL ROUTINES
	*4574		/OLD "INITR" ROUTINE AREA - 4 LOCATIONS LONG
SYMPRT,	0	/INTERMEDIATE ROUTINE TO PRINT SYMBOL TABLE
	JMS I PRSYMP	/CALL SABR'S ROUTINE
	CIF 0
	JMP I SYMPRT	/BUT RETURN TO FIELD 0

	*4641		/CODE IN THIS SECTION CAN'T GO PAST 4704
FETCH,	0	/REPLACES ROUTINE IN SABR OF SAME NAME
	CDF CIF 0
	JMS I .+2
	JMP I FETCH
	INCHAR

LDRCT,	7700	/FOR LEADER-TRAILER ROUTINE ON SAME PAGE

USYMFG,	0		/ROUTINE TO GIVE UNDEFINED SYMBOL MESSAGES WHEN
	JMS I CTYPE	/NO SYMBOL TABLE IS REQUESTED
SYMXX,	JMP I USYMFG	/ZEROED IF CHECKING FOR UNDEFINEDS
	TAD SYMBOL
	DCA I PLLFS	/SET UP SABR CELLS SO THAT ERROR ROUTINE WILL
	DCA LINE	/PRINT THE NAME OF THE UNDEFINED SYMBOL
	TAD U2300	/FUDGE FOR "U" ERROR MESSAGE - UNFORTUNATELY,
	JMP I .+1	/THIS MESSAGE IS INSTANTLY FATAL - SERVES HIM RIGHT
	F1ERR
PLLFS,	LLFS		/RANDOM LOCATION IN SABR
U2300,	2300

TDUMMY,	0		/DUMMY OUTPUT ROUTINE
	CLA
	JMP I TDUMMY	/AS DUMMY AS YOU CAN GET

	*6133		/PATCH TO SYMBOL TABLE PRINTER TO USE ABOVE
	JMS I 6177	/THIS REPLACES A "JMS I CTYPE"
	*6177
	USYMFG		/LUCKILY THERE WAS A LOCATION FREE

	*3665		/REWRITE OF OCTAL TYPEOUT ROUTINE TO
	DCA TEM1	/NOT KEEP INFORMATION IN THE LINK ACROSS
	TAD M4		/A CALL TO THE OUTPUT ROUTINE
	DCA TEM2
L62A,	TAD TEM1
	RTL
	RAL
	DCA TEM1
	TAD TEM1
	RAL
	*3702
	JMP L62A

	*4317	/"PAUSE" PROCESSOR
	CLA	/REPLACES CLA HLT
	CDF CIF 0

	*4332	/PATCHES TO INITIALIZATION ROUTINE
	NOP	/DON'T GIVE
	NOP	/TWO USELESS CARRIAGE RETURN - LINE FEED PAIRS

	*4341
	NOP	/DON'T JMS I 4372 'CAUSE WE HAVE CHANGED 4372!

	*4372	/MORE "PAUSE" FUDGE
	SPAUSE

	*4715	/ALTER COUNT ON LEADER-TRAILER
	TAD LDRCT

	*562	/"END" STMT PROCESSOR
	CIF 0
	JMP I PEND	/END OF PASS 1
	ENDRSM=.

	*566	/MORE ON "END"
	NOP	/ELIMINATE HALT AT END OF PASS 1

	*571	/STILL MORE ON "END"
	CDF CIF 0
	JMP I SEND	/END OF PASS 2

	*576	/THERE ARE (WERE) TWO WHOLE FREE LOCATIONS IN THIS PAGE!
SEND,	SBREND
PEND,	PASEND

	*2761	/FATAL ERROR HALT IN ERROR ROUTINE
	CDF CIF 0
	JMP I 166	/166 = LITERAL 7600

	*4003	/LISTING ROUTINE
	SKP CLA	/ALWAYS PUT LISTING ON "PUNCH"

	*PUNCH	/POINTER TO PUNCH ROUTINE
	OUCHAR	/POINTER TO MY PUNCH ROUTINE
	$