File: M5.PA of Tape: Sources/Multi8/multi8-2
(Source file text) 

/M5.PA 17-JUN-80
XLIST -LPWRUP-1&XLISTX
/EQUATES:

JSW=7746	/ADDRESS OF OS/8 JOB STATUS WORD
NO=1000		/DON'T RESTART BIT IN JSW
SYSHND=7607	/ENTRYPOINT OF SYSTEM HANDLER
USR=7700	/USER SERVICE ROUTINE.
FETCH=1		/FETCH HANDLER REQUEST CODE
LOOKUP=2	/FILENAME LOOKUP REQUEST CODE
ENTER=3		/ENTER NEW OUTPUT FILE
CLOSE=4		/CLOSE PERMANENT FILE
CD=5		/COMMAND DECODE
USRIN=10	/CALL USR INTO CORE REQUEST CODE
USROUT=11	/DISMISS USR REQUEST CODE
INQUIRE=12	/GET DEVICE NUMBER REQUEST CODE
	FIELD BGFLD%10
	*0
TEMP,	0
TEMP1,	0
TEMP2,	0
TEMP3,	0
	ZBLOCK 3	/ODT BREAKPOINT
TEMP4,	0
AUTO10,	0
AUTO11,	0
AUTO12,	0
AUTO13,	0
AUTO14,	0
AUTO15,	0
AUTO16,	0
AUTO17,	0
TEMP5,	0
TEMP6,	0
TEMP7,	0
ZNUM,	0
BINAC,	0
CHANGD,	0	/IF ZERO, CORE IMAGE MUST BE SAVED
CHAIND,	-1	/CHAIN SWITCH
	*200

PWRUP,	CLA CLL		/
	TAD [NO		/SET NOT-RESTART BIT
	CDF 0		//
	DCA I [JSW	//
	TAD [GTF	//
	DCA I [200	//RESTORE SKIPCHAIN
	CDF BGFLD	/
	AC0001		/ON SYS:
	CIF 10
	JMS I [7700	/DELETE THE OLD COPY OF MULTI8.SV
	   CLOSE	/SOME INEXPERIENCED USERS GET
	   MULTI8	/VERY CONFUSED BY AN OLD DATE!!
	   0		/0 MEANS DELETE
	CLA		/SO WHAT?
	JMS I [COPYZ	/COPY PAGE ZERO IN FOREGROUND FIELDS
	JMS I [SETNAM	/ENTER PREASSEMBLED TASKS IN NAMLST
	JMS I [LNKTCB	/LINK THE FREE TASK CONTROL BLOCKS
	JMS I [SAVE	/SAVE THE COMPLETE IMAGE IN 'MULTI8.SV'
	JMP I [STRT	/AND START TASKBUILDING PHASE
SAVE,	0		/SAVE CORE IN 'MULTI8.SV'
	TAD CHANGD
	SZA CLA		/NEED TO SAVE ?
	 JMP I SAVE	/NO, NOTHING CHANGED
	ISZ CHANGD	/YES, RESET CHANGED FLAG
	TAD [MULTI8
	DCA STBLK
	AC0001		/DEVICE IS SYS:
	CIF 10		/
	JMS I [7700	/LOOKUP THE FILE 'MULTI8.SV'
	   LOOKUP
STBLK,	   MULTI8
LNGTH,	   0
	 JMS NEWSAV	/CREATE THE SAVE FILE
	TAD LNGTH	/GET MINUS FILE LENGTH
	TAD NEWLEN
	SMA SZA CLA	/LONG ENOUGH ?
	 JMS NEWSAV	/TOO SHORT, MAKE A NEW SAVE FILE
	TAD STBLK	/GET STARTING BLOCK NUMBER
	DCA STBLK1	/AND MOVE IT TO THE FIRST WRITE REQUEST
	TAD STBLK
	DCA I [OFSET	/UPDATE OFFSET FOR TASKBUILDER
	CIF 0		/WRITE THE CORE CONTROL BLOCK
	JMS I [SYSHND	/IN THE FIRST BLOCK OF THE FILE
	   4200+BGFLD
	   CCB
STBLK1,	   0
ERR3,	 JMS I [ERROR	/?WRITING SYS:?
	TAD [CCBLST-1	/POINTER TO CORE PARAMETERS LIST
	DCA AUTO10	/WE USE IT IN SAVING THE FILE TOO
	TAD STBLK1	/SET BLOCK NUMBER
	IAC		/+1 FOR CCB
	DCA STBLK2	/
	TAD CCB		/NUMBER OF SEGMENTS
	DCA TEMP	/IN COUNTER
SAVLOP,	TAD I AUTO10	/GET CORE ADDRESS
	DCA ADR		/
	AC4000		/SET WRITE-BIT
	TAD I AUTO10	/
	DCA FUN		/SET FUNCTION WORD
	CIF 0		/WRITE THIS SEGMENT
	JMS I [SYSHND	/
FUN,	   0
ADR,	   0
STBLK2,	   0
ERR3A,	 JMS I [ERROR	/?WRITING SYS:?
	TAD FUN		/UPDATE BLOCKNUMBER
	AND [3700
	BSW
	IAC CLL RAR	/ROUND UP TO # OF BLOCKS
	SNA
	 TAD [20
	TAD STBLK2
	DCA STBLK2
	ISZ TEMP	/ALL SEGMENTS DONE ?
	 JMP SAVLOP	/NO, CYCLE
	JMP I SAVE	/YES, RETURN

NEWSAV,	0
ERR23A,	TAD ERR3
	DCA ERR23A	/ONCE ONLY !
	TAD [MULTI8
	DCA STBLK0	/SETUP POINTER TO FILENAME
	AC0001
	CIF 10
	JMS I [7700	/ENTER NEW FILE
	   ENTER
STBLK0,	   MULTI8	/POINTER TO FILENAME
TENTLN,	   0
ERR4,	JMS I [ERROR	/CAN'T CLOSE SAVE FILE
	TAD TENTLN
	CLL
	TAD NEWLEN
	SZL CLA		/IS THIS HOLE LARGE ENOUGH ?
ERR4A,	 JMS I [ERROR	/NO, NO ROOM FOR MULTI8.SV
	AC0001
	CIF 10
	JMS I [7700
	   CLOSE
	   MULTI8
NEWLEN,	   SVLNGT
ERR4B,	 JMS I [ERROR
	TAD NEWLEN
	CIA
	DCA LNGTH
	TAD STBLK0
	DCA STBLK
	JMP I NEWSAV	/RETURN TO MAIN SAVE ROUTINE
/DATA FOR SAVE ROUTINE:
MULTI8,
IFNDEF SINGL8 <
	FILENAME MULTI8.SV	/ >
IFDEF SINGL8 <
	FILENAME ZM16.SV	/ >

O1=0
CCB,	-FIELDS-1	/NUMBER OF SEGMENTS
	CDF CIF BGFLD	/STARTING FIELD
	STRT		/STARTING ADDRESS
	0000		/JOB STATUS WORD
CCBLST,	0000		/SEGMENT FOR BGFLD
	O=ENDPWR%2+BGFLD;O1=O+100%200+O1;O
IFZERO FIELDS-7&4000 <
	0000		/SEGMENT FOR FIELD 6
	O=ENDF60%2+60;O1=O+100%200+O1;O	/ >
IFZERO FIELDS-6&4000 <
	0000		/SEGMENT FOR FIELD 5
	O=ENDF50%2+50;O1=O+100%200+O1;O	/ >
IFZERO FIELDS-5&4000 <
	0000		/SEGMENT FOR FIELD 4
	O=ENDF40%2+40;O1=O+100%200+O1;O	/ >
IFZERO FIELDS-4&4000 <
	0000		/SEGMENT FOR FIELD 3
	O=ENDF30%2+30;O1=O+100%200+01;O	/ >
IFZERO FIELDS-3&4000 <
	0000		/SEGMENT FOR FIELD 2
	O=ENDF20%2+20;O1=O+100%200+O1;O	/ >
	0000		/SEGMENT FOR FIELD 1
	O=ENDF10%2+10;O1=O+100%200+O1;O
	0000		/SEGMENT FOR FIELD 0
	O=ENDF00%2+00;O1=O+100%200+O1;O

/THE REST OF THE FIRST BLOCK CONTAINS THE MAP OF THE FILE, E.G.
/WHERE ALL TASKS IN THE TASKLIBRARY ARE STORED:
DSKMAP,	O1+1	/OFFSET TO FIRST TASK (OVER THE SAVE PART)
	ZBLOCK CCB+400-. /GOOD FOR AT LEAST 235 BLOCKS
ENDMAP=.-1
	O2=LOADPT-TCBTAB%10
	O3=MAXNAM-O2^2
	SVLNGT=O1+O3
IFNZRO BGMAX <
COPDSK,	0		/SETUP DSKMAP
	TAD [XDSKTAB-1	/COPY XDSKTAB TO DSKTAB
	DCA AUTO17
	TAD [DSKTAB-1
	DCA AUTO16
	TAD [-40
	DCA TEMP1
DSKCO1,	TAD I AUTO17
	CDF 10
	DCA I AUTO16
	CDF BGFLD
	ISZ TEMP1
	 JMP DSKCO1
	JMP I COPDSK	/RETURN
DSKTAB=7600		/V7 NOW IN CD AREA, 17600 >


PAGE
/*****************************************************************
/********   T A S K B U I L D I N G   P H A S E   ****************
/*****************************************************************

/HERE STARTS THE TASKBUILDING PHASE:
STRT,	ACM1		/IF R MULTI8, SET SWITCH TO -1
	DCA CHAIND	/IF CHAINED SET TO 0
	TAD [NO		/SET NON-RESTATABLE BIT
	CDF 0		//IN OS8 JOB STATUS WORD
	DCA I [JSW	//
	CDF BGFLD	/
	TAD [MULTI8
	DCA OFSET	/LOOKUP PRESENT SAVE FILE
	AC0001		/SYS:=1
	CIF 10
	JMS I [7700	/CALL USR
	   LOOKUP
OFSET,	   MULTI8	/POINTER TO FILENAME/ STARTBLOCK OF FILE
ACTLEN,	   0		/GET FILE LENGTH
ERR6,	 JMS I [ERROR	/?MULTI8.SV NOT ON SYS:?
	ISZ CHAIND	/WAS IT A CHAIN ?
	 JMP I [GO	/YES, START MULTI8 RIGHT AWAY
TKBNXT,	CIF 10		/CALL COMMAND DECODER
	JMS I [7700	/
	   CD
	   0216		/DEFAULT EXTENSION FOR TASKS IS 'BN'
	JMS I [TSKBLD	/TASKBUILD WHATEVER IS SPECIFIED
	CDF 10		//LOOK AT ALTMODE FLAG
	TAD I [7642	//
	CDF BGFLD	/
	SMA CLA		/FINISHED TASKBUILDING ?
	 JMP TKBNXT	/NO, MORE EXPECTED
	JMS I [SAVE	/SAVE UPDATED IMAGE WITH NEW TASKS
	CDF 10
	TAD I [7644
	CDF BGFLD
	AND [2000
	SNA CLA		/ /N OPTION SET ?
	 JMP I [GO	/NO, GO START MULTI8
	CDF CIF 0
	JMP I [7600	/YES, BACK TO OS/8
/UPDATE BLOCK NUMBERS OF TASKS IN TASK CONTROL BLOCK TABLE:
SETBLK,	0		/ABSOLUTIZE BLOCKNUMBERS IN TCB'S
	CDF 0		//
	TAD [LOADPT+3	//START OF DISK RESIDENT TASKS
PWR1,	DCA TEMP
	TAD I TEMP	//FETCH RELATIVE BLOCK NUMBER
	SNA		//IF ZERO, W'RE PAST THE LAST ONE
	 JMP PWR1A	//DONE
	CDF BGFLD	/
	TAD OFSET	/ADD STARTBLOCK OF MULTI8.SV
	CDF 0		//
	DCA I TEMP	//STORE UPDATED BLOCK NUMBER
	TAD TEMP
	TAD [10		//NEXT BLOCK # IS 10 WORDS FURTHER
	JMP PWR1	//CYCLE
PWR1A,	CDF BGFLD	/
	JMP I SETBLK	/RETURN

LNKTCB,	0		/LINK THE FREE TCB'S
	CDF 0		//
	TAD I [FHEAD	//ADDRESS OF FIRST FREE BLOCK
LNKTC1,	DCA TEMP1	//
	O=MAXNAM^10+TCBTAB+200&7600-17
	TAD [-O
	TAD TEMP1
	SMA CLA		//END OF TCBTAB ?
	 JMP LNKTC2	//LAST TCB
	TAD TEMP1	//
	TAD [10		//COMPUTE ADDRESS OF NEXT BLOCK
	DCA I TEMP1	//AND STORE IN LINK WORD
	TAD I TEMP1
	JMP LNKTC1	//NO, CYCLE
LNKTC2,	DCA I TEMP1	//WHICH GETS A ZERO LINK
	CDF BGFLD	/
	JMP I LNKTCB	/RETURN
/LOOKUP THE SWAP-FILE 'SWPFIL.M8'
IFNZRO BGMAX <
SETSWP,	0		/SETUP THE SWAPFILE
	AC0001
	CIF 10
	JMS I [USR	/LOOKUP 'SWPFIL.M8' ON SYS:
	   LOOKUP
SWBLOK,	   SWPFIL	/THIS GETS THE STARTING BLOCK #
SWPLEN,	   0		/THIS GETS MINUS THE LENGTH
	 JMP NEWSWP	/NO SWAPFILE YET
	TAD SWBLOK
	AND [TRACK-1	/COMPUTE NUMBER OF EXTRA BLOCKS
	TAD SWPLEN	/CHECK IF SWAPFILE LONG ENOUGH
IFNDEF SINGL8 <
	TAD [BGCORE^BGMAX^20 >
IFDEF SINGL8 <
	TAD [BGCORE^BGMAX-BGFLDS+1^20 >
	SMA SZA CLA
	 JMP NEWSWP	/MUST MAKE A LONGER SWAPFILE
SWAP1,	TAD SWBLOK	/PUT BEGIN OF SWPFIL.M8 IN
	TAD [TRACK-1
	AND [-TRACK
SETSW1,	CDF 10		//
	DCA I [BSTAB	//FIRST LOC OF BSTAB
	CDF BGFLD	/
	JMP I SETSWP	/RETURN
NEWSWP,	AC0001		/FIRST DELETE THE OLD SWPFIL
	CIF 10		/
	JMS I [USR	/
	   CLOSE	/
	   SWPFIL	/POINTER TO FILE NAME
	   0		/LENGTH IS ZERO: DELETE FILE
	 NOP		/MAYBE IT ISN'T THERE AT ALL
	AC0001		/CREATE A NEW SWPFIL.M8
	CIF 10		/
	JMS I [USR	/
	   ENTER	/ENTER THE NEW FILE
	   SWPFIL	/POINTER TO FILENAME
NEWLNG,	   0		/GETS MAXIMUM LENGTH
ERR5,	 JMS I [ERROR	/?CAN'T ENTER SWPFIL.M8?
	TAD NEWLNG-1	/GET STARTING BLOCK
	CIA		/COMPUTE EXTRA BLOCKS TO ALLIGN WITH DISK
	AND [TRACK-1	/COMPUTE NUMBER OF EXTRA BLOCKS
IFNDEF SINGL8 <
	TAD [BGCORE^BGMAX^20 >
IFDEF SINGL8 <
	TAD [BGCORE^BGMAX-BGFLDS+1^20 >
	DCA CLNGTH	/AND STORE IN CLOSE REQUEST
	STL		/
	TAD CLNGTH	/SEE IF THERE IS ENOUGH ROOM
	TAD NEWLNG
	SNL SZA CLA	/ENOUGH ?
ERR5B,	 JMS I [ERROR	/?NO ROOM FOR SWPFIL.M8?
	AC0001
	CIF 10		/NOW CLOSE THE FILE
	JMS I [USR	/
	   CLOSE
	   SWPFIL
CLNGTH,	   0
ERR5A,	 JMS I [ERROR	/?CAN'T CLOSE SWPFIL.M8?
	TAD NEWLNG-1	/GET STARTING BLOCK
	DCA SWBLOK
	TAD CLNGTH
	DCA SWPLEN
	JMP SWAP1	/CARRY ON >

PAGE
IFNZRO BGMAX <
PTEMP1,	FAKHND
PTEMP2,	FAKSYS
PTEMP3,	-FAKLEN
PTEMP4,	BOBOOT
PTEMP5,	BOOBUF
PTEMP6,	-BOBOEND
PTEMP7,	BOBOEND-447-17
PTEMP8,	DEVLST
PTEMP9,	FASSGN
PTEMP0,	FASSGN+2-SYSHND+FAKSYS
PRBOOT,	RBOOT

SETFAK,	0		/ROUTINE TO SETUP FAKEHANDLER STUFF
	JMS I PRBOOT	/READ BOOTSTRAP FROM OS8 DEV
	CIF 10
	JMS I [USR
	   USRIN
/MOVE FAKEHANDLER OVER SYSTEM-HANDLER
PWR4,	TAD I PTEMP1
	DCA I PTEMP2
	ISZ PTEMP1
	ISZ PTEMP2
	ISZ PTEMP3	/DONE ?
	 JMP PWR4	/NO, CYCLE
	CDF 0
	TAD I [7777	/GET DATE EXTENSION BITS
	CDF BGFLD
	AND [4707
IFNDEF SINGL8 <
	TAD [BGFLDS-1^10+1000 /RTS8-BIT & SOFTWARE CORE SIZE >
IFDEF SINGL8 <
	TAD [BGCORE-1^10+1000 /RTS8-BIT & SOFTWARE CORE SIZE >
	DCA I [BGCORW	/CORE-SIZE SET INITIALLY AT #FLDS-FGRND
/COPY SYSTEM BOOTSTRAP
PWR4A,	TAD I PTEMP4
	DCA I PTEMP5
	ISZ PTEMP4
	ISZ PTEMP5
	ISZ PTEMP6
	 JMP PWR4A
/CLEAR DEVICE RESIDENCY TABLE
	DCA I PTEMP5
	ISZ PTEMP5
	ISZ PTEMP7
	 JMP .-3
/PUT FAKEHANDLER ENTRY POINTS IN DEVICE RESIDENCY TABLE
	TAD [SYSHND
	DCA I [DVRSTB	/ENTRYPOINT SYS:
	TAD [SYSHND
	DCA I [DVRSTB+1	/ENTRYPOINT DSK:
	JMP PWR5B
PWR5,	DCA DEVNAM
	ISZ PTEMP8
	TAD I PTEMP8
	DCA DEVNAM+1	/SECOND WORD OF DEVICE NAME
	ISZ PTEMP8	/PTEMP8 POINTS TO DEVICE TYPE
	CIF 10
	JMS I [200
	   INQUIRE	/ASK USR WHAT INTERNAL DEVICE # IT HAS
DEVNAM,	   ZBLOCK 3	/GETS DEVICE NAME
	 JMP PWR5A	/DEVICE DOES NOT EXIST, THAT'S
			/A PITY FOR HIM
	TAD DEVNAM+1	/THIS IS THE INTERNAL DEV NUMBER NOW
	TAD [DVRSTB-1	/INDEX IN DEVICE RESIDENCY TABLE
			/(THE ONE THAT IS IN THE BOOTBUFFER)
	DCA TEMP2
	TAD PTEMP9	/GET NEXT ENTRYPOINT IN FAKEHANDLER
	DCA I TEMP2	/AND DROP IN DEVICE RESIDENCY TABLE.
			/SO OS/8 WILL THINK THE HANDLER IS
	TAD DEVNAM+1	/CORESIDENT WITH SYS:
	TAD [DVTYPT-1
	DCA TEMP2
	TAD I PTEMP8
	DCA I TEMP2	/SET CORRECT DEVICE TYPE
	ISZ PTEMP8	/POINTS TO FAKEHANDLER CODE NUMBER
	TAD I PTEMP8	/GET CODE NUMBER
	DCA I PTEMP0	/AND STORE IN FAKEHANDLER
	AC0003		/ADVANCE POINTERS
	TAD PTEMP9
	DCA PTEMP9
	AC0003
	TAD PTEMP0
	DCA PTEMP0
	SKP
PWR5A,	ISZ PTEMP8
	ISZ PTEMP8
PWR5B,	TAD I PTEMP8
	SZA		/DONE ?
	 JMP PWR5	/NO, CYCLE
	CIF 10
	JMS I [200
	   USROUT	/DISMISS USR
	CIF 0
	JMS I [SYSHND
	   4400+BGFLD	/WRITE THE FAKED BOOTBLOK IN BLOCK 40
	   BOOBUF
	   40		/OS/8 SCRATCH BLOCK
ERR8,	 JMS I [ERROR	/?WRITING BOOBLK.M8?
	CLA		/YES
	JMP I SETFAK	/RETURN

PAGE			/ >
/NOW WE SETUP THE FOREGROUND PAGE 0'S
COPYZ,	0		/SETUP FOREGROUND FIELDS PAGE ZERO
	TAD [-FIELDS+1
	DCA TEMP1	/COUNTER
PWR8,	TAD [-COMPNT
	DCA TEMP2	/COUNTER
	DCA TEMP3	/POINTER STARTS AT ZERO
PWR9,	CDF 00
	TAD I TEMP3	/GET A WORD FROM 00
PWR10,	CDF 00+10
	DCA I TEMP3	/PUT A WORD INTO ANOTHER FIELD
	ISZ TEMP3	/BUMP THE POINTER
	ISZ TEMP2	/200 DONE ?
	 JMP PWR9	/NO, CYCLE
	TAD PWR10
	DCA I [MYCDF
	AC0001
	TAD PWR10
	DCA I [MYCIF
	AC0002
	TAD PWR10
	DCA I [MYCDIF
	TAD PWR10
	TAD [10
	DCA PWR10
	ISZ TEMP1
	 JMP PWR8	/NEXT FIELD
	CDF BGFLD
	JMP I COPYZ	/RETURN

/FILL IN CLRTAB WITH THE ORIGINAL CLEAR-IOT'S FROM THE SKIPCHAIN
COPCLR,	0		/SETUP CLRTAB
	CDF 00
	TAD [-INTDEV+1
	DCA ZTEM2	/WE MAY USE THE ZTEM'S NOW!
	TAD [CLRTAB-1
	DCA AUTO10
	TAD [SKP0-1+4
PWR12,	DCA ZTEM1
	TAD I ZTEM1
	DCA I AUTO10
	TAD ZTEM1
	TAD [4
	ISZ ZTEM2
	 JMP PWR12
	CDF BGFLD
	CLA CLL
	JMP I COPCLR
IFNZRO BGMAX <
/CALL: 	JMS SETLEN
/	   PROG NAME POINTER
/	   BLOCK OFFSET
/	   - TEST VALUE OF 1'ST WORD
/	   ADDRESS OFFSET	/MAY RETURN THRU
/	   TABLE INCREMENT	/THESE TWO

SETLEN,	0		/PATCH PROGRAM DEVICE LENGTH TABLE
	TAD I SETLEN
	DCA PRGBLK	/SET NAME POINTER
	ISZ SETLEN	/NEXT ARG
	AC0001		/PROG.SV IS ON SYS: USUALLY
	CIF 10
	JMS I (USR	/LOOKUP PROG.SV
	   LOOKUP
PRGBLK,	   1234
	   0		/(GETS -LENGTH OF PROG.SV)
	 JMP SETEX1	/SORRY, PROG NOT FOUND
	AC0004		/PROG MUST BE 4 BLOCKS AT LEAST
	TAD PRGBLK+1	/GET -LENGTH OF PROG.SV
	SMA CLA		/OK ?
	 JMP SETEX1	/NO, MAYBE IT'S A SHSAVE FILE
	TAD I SETLEN	/GET BLOCK OFFSET
	ISZ SETLEN
	TAD PRGBLK
	DCA PRGB1
	TAD PRGB1
	DCA PRGB2
	CIF 0
	JMS I (SYSHND
	   200+BGFLD	/READ 1 BLOCK IN THIS FIELD
PRGBUF,	   BUFST	/USE INPUT BUFFER OF TSKBLD
PRGB1,	   0		/GETS BLOCK NUMBER
	 JMP SETEX2	/SORRY, YOUR PROG IS POOH
	TAD I SETLEN	/GET TEST VALUE
	ISZ SETLEN
	TAD I PRGBUF	/TEST FIRST VALUE OF BUFFER
	SZA CLA		/OK?
	 JMP SETEX	/NO, BAD VERSION: FALL THRU ARGS
	TAD (-10
	DCA PRGB1	/FOR A COUNTER
	TAD (LNGLST-1-BGNUMB+BOBOOT
	DCA AUTO10	/RELOCATED IN BOOT BLOCK
	TAD I SETLEN	/GET ADDRESS OFFSET
	ISZ SETLEN
	TAD (BUFST
	DCA PRGBLK
PRGLOP,	TAD I AUTO10
	DCA I PRGBLK
	TAD I SETLEN	/ADD INCREMENT
	TAD PRGBLK
	DCA PRGBLK
	ISZ PRGB1
	 JMP PRGLOP	/ENTER DEVICE LENGTH FOR DEV 50-57
	CIF 0
	JMS I (SYSHND	/AND WRITE IT BACK TO PROG
	   4200+BGFLD
	   BUFST
PRGB2,	   0
	 JMP SETEX	/WRITE ERROR ? PITY
	JMP SETEX
SETEX1,	ISZ SETLEN
SETEX2,	ISZ SETLEN
SETEX,	CLA
	JMP I SETLEN	/RETURN >

PAGE
GO,
IFNZRO BGMAX <JMS I (SETPIP /PATCH PIP DEVICE LENGTH TABLE >
	JMS I (SETDMP	/SETUP TO RUN MONDUM @ 7757
	JMS I (PDPTST	/CHECK THE AVAILABLE HARDWARE
IFNZRO BGMAX <
	JMS I (SETSWP	/CREATE SWAPFILE
	JMS I (SETMEM	/SETUP BSTAB FOR AVAILABLE MEMORY
	JMS I (SETFAK	/SETUP FAKE HANDLER
	JMS I (COPDSK	/SETUP DSKTAB >
	JMS I (SETBLK	/RELOCATE TASK BLOCK NUMBERS
	JMS I (COPCLR	/COPY CLEARIOTS IN CLRTAB
IFNZRO BGMAX <JMS I (SETTRP /SETUP THE MMU >
/NOW COMES A DIRTY PIECE OF CODE, THAT INITIALIZES ALL SORTS
/OF PERIPHERALS; MAYBE YOU HAVE TO EDIT THIS PART FOR YOUR
/SPECIALTIES !
		CAF
		TLS	/THATS AN EASY ONE
IFDEF KL8E2 <	6016+KL8E2	/ >
IFDEF KL8E3 <	6016+KL8E3	/ >
IFDEF KL8E4 <	6016+KL8E4	/ >
IFDEF KL8E5 <	6016+KL8E5	/ >
IFDEF KL8E6 <	6016+KL8E6	/ >
IFDEF KL8E7 <	6016+KL8E7	/ >
		CLA
IFDEF PP8E <	6024	/ >
IFDEF LE8E <
IFZERO LE8E&1 <	6666	/ >
IFNZRO LE8E&1 < 6574	/ >>
IFDEF DR8EA1 <DR8EA1+6000	/DISABLE INTERRUPTS >
IFDEF DR8EA2 <DR8EA2+6000	/DISABLE INTERRUPTS >
IFDEF KL8A1 <
	KL8A1+6010
	TAD (KL8TAB
	KL8A1+6012
	AC0001
	KL8A1+6000	/ >
IFDEF KL8A2 <
	KL8A2+6010
	TAD (KL8TAB+10
	KL8A2+6012
	AC0001
	KL8A2+6000	/ >
/STARTING THE CLOCKS:
IFDEF RFCLOCK <	6601
		TAD (RFINTS
		6615	/ >
IFDEF DK8EA <	DK8EA+6001	/ >
IFDEF DK8EC <	DK8EC+6001	/ >
IFDEF DK8EP < IFNDEF DK8EA < IFNDEF DK8EC < IFNDEF DKC8AA <
		TAD (-1750
		6003+DK8EP	/AC IS NOT CLEARED, BUT ...
		TAD [5410+1750
		6002+DK8EP
		CLA	/ >>>>
IFDEF DKC8AA <	AC0001
		6135
		CLA		/ >
IFDEF AX08 <	6364
		ISZ .-1
		JMP .-1
		6362		/CLEAR ADC DONE FLAG
		CLA		/? >
IFDEF FPP <
		AC2000		/SEE IF M&S FPP INSTALLED
		6144		/SEMO DP AS TRIAL
		SNA CLA		/DID IT CLEAR AC ?
		 JMP .+5	/YES, OK
		TAD (FPICL+2&177+5200	/NO, DO 'JMP FPICL+2' SO THAT
		CDF 10
		DCA I (FPST+2	/FPSTART DOES NOT SKIP, BUT 'JMP EMREDY'
		CDF BGFLD	/ >
/NOW WE WILL SCHEDULE THE AUTO-START TASKS TO GET THE WORLD
/GOING. BECAUSE THIS POWERUP CODE IS NOT IN A
/FOREGROUND FIELD, WE CAN'T SIMULATE IT TO BE A TASK,
/THAT CALLS THE OTHER TASKS. THUS WE MUST STRING THEM
/IN THE SYSTEM'S QUEUE'S AND SET THEIR BACKLINK BUSY
/'BY HAND'.

	TAD [TCBTAB+1	/LOOK FOR EACH TASKS' THREAD IN
	DCA TEMP1	/HIS TCBP. IF NONZERO HE MUST BE STARTED
	TAD [-MAXNAM
	DCA TEMP7	/COUNTER
PWR14,	CDF 0
	TAD I TEMP1
	SNA CLA		/AUTO-START ?
	 JMP PWR15	/NO TRY NEXT ONE
	ACM1
	TAD TEMP1
	DCA TEMP2
	AC0001
	DCA I TEMP2	/SET HIS BACKLINK TO 'RUNNED'
	TAD I [MTAIL	/PUT HIM ON THE MAINQUEUE
	DCA TEMP2
	TAD TEMP1
	DCA I TEMP2
	TAD TEMP1
	DCA I [MTAIL
	DCA I TEMP1
	ISZ TEMP1
	TAD TEMP1
	TAD [5
	DCA TEMP2	/ADDRESS OF PC
	TAD I TEMP1	/GET HIS START ADDRESS
	DCA I TEMP2	/AND DROP IT INTO HIS PC
	ACM1
PWR15,	TAD TEMP1	/GET POINTER AND
	TAD [10
	DCA TEMP1	/ADVANCE TO NEXT THREAD
	ISZ TEMP7	/ALL TASKS DONE ?
	 JMP PWR14	/NO
	CDF CIF 00
	JMP I [DISPATCH	/...............
IFNZRO BGMAX <
SETTRP,	0		/SETUP THE TRAP/UNTRAP RAM
	TAD [-100
	DCA ZTEM1
	TAD [6000
	DCA ZTEM2
	TAD ZTEM2
	6235		/LOAD TRAP REGISTER, CLA
	TAD ZTEM2
	TAD [10
	ISZ ZTEM1
	 JMP .-6
	CLA
	TAD [TRPTAB-1
	DCA AUTO10
	TAD I AUTO10
	SNA
	 JMP .+3
	6235		/LOAD TRAP REGISTER, CLA
	JMP .-4
	6265		/ENABLE MEMORY MANAGEMENT !
	JMP I SETTRP	/RETURN

RBOOT,	0		/READ BOOTSTRAP
	CIF 0
	JMS I [SYSHND
	   200+BGFLD
	   BOOBUF+400
	   0
	 JMP ERR2
	CDF 0
	AC7775
	TAD I P7612	/TEST IF 2 PAGE SYS HANDLER
	CDF BGFLD	
	SZA CLA
	 JMP I RBOOT	/IT WAS'NT
	CIF 0
	JMS I [SYSHND	/IT WAS, READ 17600 PART
	   100+BGFLD
	   BOOBUF+400
	   66		/FROM BLOCK 66
ERR2,	 JMS I [ERROR	/?READING BLOCK 0 (OR 66)?
	JMP I RBOOT
P7612,	7612		>

PAGE
SETDMP,	0		/SETUP .R MONDUM
	AC0001
	CIF 10
	JMS I [USR	/LOOKUP MONDUM.SV
	   LOOKUP
DMPBLK,	   MONDUM
	   0
	 JMP I SETDMP	/MONDUM.SV NOT FOUND
	TAD [CIF CDF BGFLD /RUN MONDUM IN FIRST BG FIELD
	CDF 0
	DCA I [7772	/STARTING FIELD
	TAD [201	/MONDUM CHAIN ADDRESS
	DCA I [7775
	TAD DMPBLK
	IAC
	DCA I [7762	/BLOCK NUMBER
	DCA I [7761
	TAD [1000+BGFLD
	DCA I [7760	/FUNCTION WORD [READ 10 PAGES)
	TAD [5372
	DCA I [7764
	TAD [SYSHND
	DCA I [7756
	CDF BGFLD
	JMP I SETDMP

MONDUM,	FILENAME MONDUM.SV
IFNZRO BGMAX <
/ROUTINE TO ENABLE MEMORY FIELDS THAT SEEM TO BE PRESENT IN
/THIS MACHINE.
SETMEM,	0
	TAD [-BGFLDS+1
	DCA TEMP	/COUNT FIELD BGFLD+1 ... 7
	TAD [CDF BGFLD+10
	DCA SETMM1	/CDF TO FIRST FIELD TO TEST
	TAD [BSTAB+1+1
	DCA TEMP1	/POINTER TO CORRESPONDING BSTAB ENTRY
SETMM1,	CDF
	TAD .		/THERE IT IS AGAIN, LARY
	DCA I [FHEAD	/SOME PAGE ZERO LOCATION
	TAD I [FHEAD
	CDF 10
	SNA CLA
	ACM1		/LOCK BAD FIELDS
	SZA
	DCA I TEMP1	/
	ISZ TEMP1
	TAD SETMM1
	TAD [10
	DCA SETMM1	/NEXT FIELD
	ISZ TEMP	/ALL DONE ?
	 JMP SETMM1	/NO, CONTINUE
	CDF BGFLD	/YES, RETURN
	JMP I SETMEM	/ >

PDPTST,	0		/A SUBROUTINE THAT TESTS IF WE ARE
	CLA CLL		/AT A REASONABLE KIND OF MACHINE.
/TEST IF WE WORK IN THE BACKGROUND. (6254 ONLY FOR MULTI8)
	TCF
	TSF
	SKP
ERR0,	 JMS I [ERROR	/?VIRTUIAL MACHINE?
IFNZRO BGMAX <
	6225		/SKIP IF MEMORY MANAGEMENT INSTALLED
ERR7,	 JMS I [ERROR	/*?MEMORY MANAGEMENT?* >
	JMP I PDPTST
ERROR,	0		/GENERAL ERROR MESSAGE HANDLER
	CLA CLL
	CDF BGFLD	/YOU NEVER KNOW
	TAD [ERRLST-1
	DCA AUTO10
	TAD ERROR
	CIA
	IAC
	DCA ERROR
ERRLOP,	TAD I AUTO10
	SZA		/TEST FOR END OF LIST
	TAD ERROR
	SNA CLA
	 JMP ERRFND	/THIS MUST BE THE ERROR
	ISZ AUTO10
	ISZ AUTO10
	JMP ERRLOP

ERRFND,	TAD I AUTO10
	DCA .+2
	JMS TXTOUT	/PRINT THE MESSAGE
	   0
	JMS CRLF
	TAD I AUTO10
	DCA ERROR
	JMP I ERROR	/GO TO CONTINUATION ADDRESS

TXTOUT,	0
	CLA CLL
	CDF BGFLD
	TAD I TXTOUT	/GET POINTER TO STRING
	DCA TXTPNT
	ISZ TXTOUT
TXT1,	TAD I TXTPNT
	SNL
	 BSW
	AND [77
	SNA		/END OF STRING ?
	 JMP I TXTOUT	/YES, QUIT
	TAD [240
	AND [77
	TAD [240
	JMS OUT
	CML
	SNL
	 ISZ TXTPNT
	JMP TXT1

TXTPNT,	0
OUT,	0
	TLS
	TSF
	JMP .-1
	CLA
	JMP I OUT

CRLF,	0
	TAD [215
	JMS OUT
	TAD [212
	JMS OUT
	JMP I CRLF
	PAGE
IFNZRO BGMAX <
SETPIP,	0
	JMS I PSETL	/SET LENGHTS IN PIP
	   PIPNAM
	   4		/BLOCK 4
	   -770		/TEST
	   50+200	/ADDRESS
	   1		/INCREMENT
	JMS I PSETL	/SET LENGTHS IN RESORC
	   RESNAM
	   7
	   -2424
	   50^4+2
	   4
	JMP I SETPIP
PSETL,	SETLEN
PIPNAM,	FILENAME PIP.SV
RESNAM,	FILENAME RESORC.SV / >
SWPFIL,	FILENAME SWPFIL.M8

E,	CDF CIF 0
	JMP I [7600
ERRLST,	/LIST OF ERROR ADRESSES, STRING POINTERS AND CONTINUATION
	/ADDRESSES:
ERR0;MSG0;E
IFNZRO BGMAX <
ERR2;MSG2;E >
ERR3;MSG3;E
ERR3A;MSG3;E
ERR4;MSG4;E
ERR4A;MSG4;E
IFNZRO BGMAX <
ERR5;MSG5;E
ERR5A;MSG5;E
ERR5B;MSG5;E >
ERR6;MSG6;E
IFNZRO BGMAX <
ERR7;MSG7;E
ERR8;MSG8;E >
ERR9;MSG9;E
ERR10;MSG10;E
ERR21;MSG21;E
ERR21A;MSG21;E
ERR21B;MSG21;E
ERR22;MSG22;E
ERR23;MSG23;E
ERR23A;MSG23;E
ERR25;MSG25;E
ERR26;MSG26;E
ERR27;MSG27;E
ERR28;MSG28;E
ERR29;MSG29;E
/END OF ERROR LIST:
0;MSG99;E
MSG0,	TEXT	*?VIRTUAL MACHINE?*
MSG2,	TEXT	*?READING BLOCK 0 (OR 66)?*
MSG8,
MSG11,
MSG3,	TEXT	*?WRITING SYS:?*
MSG4,	TEXT	*?NO ROOM FOR MULTI8.SV?*
MSG5,	TEXT *?NO ROOM FOR SWPFIL.M8?*
MSG6,
IFNDEF SINGL8 <
	TEXT	*?MULTI8.SV NOT ON SYS:?*	 / >
IFDEF SINGL8 <
	TEXT	*?ZM16.SV NOT ON SYS:?*	/ >

MSG7,	TEXT	*?MEMORY MANAGEMENT?*
MSG9,	TEXT	*?NON-RESIDENT HANDLER?*
MSG10,	TEXT	*?READ ERROR?*
MSG21,	TEXT *?PREAMBLE ERROR?*
MSG22,	TEXT *?BAD BINARY?*
MSG23,	TEXT *?MULTI8.SV TOO SHORT?*
MSG25,	TEXT *?CHECKSUM?*
MSG26,	TEXT *?TASK LENGTH?*
MSG27,	TEXT *?TASK LIBRARY FULL?*
MSG28,	TEXT *?NAME LIST FULL?*
MSG29,	TEXT *?WRITE ERROR?*
MSG99,	TEXT *?UNDEFINED ERROR?*
	FAKVER="M&77
IFNZRO BGMAX <
FAKHND,	RELOC SYSHND
FSYS,	FAKVER		/ENTRY SYSTEM HANDLER
	JMS FGENIO
	   00		/AC-CODE^10+UNIT BITS
	FAKVER
	JMS FGENIO
	   01
	FAKVER
	JMS FGENIO
	   02
	FAKVER
	JMS FGENIO
	   03
FASSGN,	FAKVER
	JMS FGENIO
	   0
	FAKVER
	JMS FGENIO
	   0
	FAKVER
	JMS FGENIO
	   0
	FAKVER
	JMS FGENIO
	   0
	FAKVER
	JMS FGENIO
	   0
	FAKVER
	JMS FGENIO
	   0
	FAKVER
	JMS FGENIO
	   0
	FAKVER
	JMS FGENIO
	   0
	FAKVER
	JMS FGENIO
	   0
	FAKVER
	JMS FGENIO
	   0
	FAKVER
	JMS FGENIO
	   0
	FAKVER
	JMS FGENIO
	   0
M8BITS,	IFNZRO .-7667 <XERROR> /SOME OPTION BITS THAT BG PROGRAMS MAY
				/WANT TO KNOW.
	O=0
IFDEF DKUSED <O=O+4000	/BIT 0 IS DKUSED >
IFDEF SINGL8 <O=O+2000	/BIT 1 SHOWS SINGL8 >
IFDEF UBITS <O=UBITS&77+O /FREE BITS FOR USER APPLICATIONS:
			/EG. SPECIFY ONE OF SEVERAL INSTALLATIONS >
	O		/THERE WE ARE !
FGENIO,	0		/SETUP DTV,ISUE 6000
	ACM2
	TAD FGENIO	/AC POINTS TO ENTRY OF HANDLER
	TAD F1400	/FORM TAD FSYS, TAD FDTA0,...
	DCA FGTMP	/EXECUTE INLINE
FGTMP,	0		/INSTRUCTION OR POINTER
	DCA FGTMP	/FGTMP IS MOVED ENTRY NOW
	TAD I FGTMP	/GET FUNCTION
	ISZ FGTMP
	DCA FUNC	/FIRST WORD OF DTV
	TAD I FGTMP	/GET CORE ADDRESS
	ISZ FGTMP
	DCA FUNC+1
	TAD I FGTMP	/GET BLOCK
	ISZ FGTMP
	DCA FUNC+2
	RDF		/SET RETURN FIELD
	CDF 0
	TAD FCDIF
	DCA FEXIT
	TAD I FGENIO
	AND F0076	/
	SZA CLA		/SYS: OR DSK0: ?
	 KSF		/FLAG UP ?
	 JMP FGNOSYS	/NO, DON'T TEST
	KRS		/YES
	TAD FM203	/TYPED ^C ?
	SNA CLA
	 JMP 7600	/YES, NO TRANSFER
FGNOSYS,TAD I FGENIO	/GET UNIT+FUNCTION
	   6000		/THE REST IS NOT OUR BISNESS
	JMP .+4		/SKIP THE PARAMETER WORDS
FUNC,	   ZBLOCK 3	/THE 3 PARAMETERS
	SNA		/ERROR ?
	 ISZ FGTMP	/NORMAL RETURN
FEXIT,	CDF CIF		/CDF CIF RETURN
	JMP I FGTMP	/RETURN

FCDIF,	CIF CDF 0
F1400,	1400
FM203,	-203
F0076,	0076

FAKLEN=.-SYSHND	/LENGTH OF FAKEHANDLER CODE
IFNZRO 7743-.&4000 <FAKERR,XERROR>

	RELOC
DEVLST,
IFDEF TC08 <TAPEDCB=4160>
IFDEF TD8E <TAPEDCB=4210>
IFDEF TAPE <
	DEVICE DTA0;TAPEDCB;DTACHN+0
	DEVICE DTA1;TAPEDCB;DTACHN+1
	DEVICE DTA2;TAPEDCB;DTACHN+2
	DEVICE DTA3;TAPEDCB;DTACHN+3
	DEVICE DTA4;TAPEDCB;DTACHN+4
	DEVICE DTA5;TAPEDCB;DTACHN+5
	DEVICE DTA6;TAPEDCB;DTACHN+6
	DEVICE DTA7;TAPEDCB;DTACHN+7
	>
IFDEF LPT <
	DEVICE LPT;1040;LPTCHN+0
	>
IFDEF RX01 <RXDCB=4250>
IFDEF RX02 <RXDCB=4320>
IFDEF RXA <
IFNDEF SYRX02 <
	DEVICE RXA0;RXDCB;RXACHN+0
	DEVICE RXA1;RXDCB;RXACHN+1
	>
IFDEF SYRXO2 <
	DEVICE RXA1;RXDCB;SYSCHN+1	/RXA1 IS PUBLIC IN SINGL8
	DEVICE RXA2;RXDCB;RXACHN+0
	DEVICE RXA3;RXDCB;RXACHN+1
	>
	DEVICE RBA0;4410;RXACHN+2
	DEVICE RBA1;4410;RXACHN+3	/BYTE MODE FLOPPY
	>
IFDEF SYRK8E <
	DEVICE RKB0;4230;SYSCHN+1
	DEVICE RKA1;4230;SYSCHN+2
	DEVICE RKB1;4230;SYSCHN+3
	DEVICE RKA2;4230;SYSCHN+4
	DEVICE RKB2;4230;SYSCHN+5
	DEVICE RKA3;4230;SYSCHN+6
	DEVICE RKB3;4230;SYSCHN+7
	>
IFDEF NSRK8E <
	DEVICE RKA0;4230;DSKCHN+0
	DEVICE RKB0;4230;DSKCHN+1
	DEVICE RKA1;4230;DSKCHN+2
	DEVICE RKB1;4230;DSKCHN+3
	DEVICE RKA2;4230;DSKCHN+4
	DEVICE RKB2;4230;DSKCHN+5
	DEVICE RKA3;4230;DSKCHN+6
	DEVICE RKB3;4230;DSKCHN+7
	>
IFDEF SYRL01 <
	DEVICE RL0B;4260;SYSCHN+1
	DEVICE RL1A;4260;SYSCHN+2
	DEVICE RL1B;4260;SYSCHN+3
	DEVICE RL2A;4260;SYSCHN+4
	DEVICE RL2B;4260;SYSCHN+5
	DEVICE RL3A;4260;SYSCHN+6
	DEVICE RL3B;4260;SYSCHN+7

	DEVICE RL0C;4310;RLCCHN+0
	DEVICE RL1C;4310;RLCCHN+1
	DEVICE RL2C;4310;RLCCHN+2
	DEVICE RL3C;4310;RLCCHN+3
	>
IFDEF NSRL01 <
	DEVICE RL0A;4260;DSKCHN+0
	DEVICE RL0B;4260;DSKCHN+1
	DEVICE RL1A;4260;DSKCHN+2
	DEVICE RL1B;4260;DSKCHN+3
	DEVICE RL2A;4260;DSKCHN+4
	DEVICE RL2B;4260;DSKCHN+5
	DEVICE RL3A;4260;DSKCHN+6
	DEVICE RL3B;4260;DSKCHN+7

	DEVICE RL0C;4310;RLCCHN+0
	DEVICE RL1C;4310;RLCCHN+1
	DEVICE RL2C;4310;RLCCHN+2
	DEVICE RL3C;4310;RLCCHN+3
	>
IFDEF CRD <
CDRPAT,	DEVICE CDR;2030;CRDCHN+0	/MUST BE THE LAST IN THE LIST !!!
	>
	0000				/END OF LIST !
BOBOOT,	RELOC 7000
BGNUMB,	0		/GETS DEVICE TYPE ON BOOT OR RESTORE

LNGLST,			/LIST OF DISK LENGTH'S
	-SIZE0		/DSK0: = SYS:
	-SIZE1		/DSK1:
	-SIZE2		/DSK2:
	-SIZE3		/DSK3:
	-SIZE4		/DSK4:
	-SIZE5		/DSK5:
	-SIZE6		/DSK6:
	-SIZE7		/DSK7:

BOTRNS,	0		/LOCAL 'HANDLER' TO KEEP SYS: VIRGIN
	DCA TRTEMP
	TAD I BOTRNS
	ISZ BOTRNS
	DCA BOCALL
	TAD I BOTRNS
	ISZ BOTRNS
	DCA BOCALL+1
	TAD I BOTRNS
	ISZ BOTRNS
	DCA BOCALL+2
	TAD TRTEMP
	6000
	JMP .+4
BOCALL,	ZBLOCK 3
	SZA
	HLT
	JMP I BOTRNS
TRTEMP,	0
ASKDIR,	0		/ASK PERMISSION TO ZERO THE DIRECTORY
	JMS BOTRNS	/READ DIRECTORY FROM THIS SYS:
	   200
	   0
	   1
	TAD 1		/LOOK AT INITIAL BLOCK
	TAD (-70	/IS IT A SYSTEM DIRECTORY?
	SNA CLA
	 JMP I ASKDIR	/YES, GO ON
BTXT1,	TAD ZEROMS	/NO, WRITE MESSAGE FOR OK TO ZERO
	ISZ BTXT1	/
	TLS		/
	SZA CLA		/
	 JMP BTXT1	/
	KCC		/
	KSF		/WAIT FOR ANSWER
	 JMP .-1	/
	KRB		/
	AND (337	/STRIP LOWERCASE BIT
	TAD (-"Y	/
	SZA		/
	 TAD ("Y-"J	/
	SZA CLA		/
	 HLT		/STOP THIS THING ...!!!
	TAD (215	/CRLF
	TLS		/
	TAD (212-215	/
	TLS		/
	ISZ ASKDIR	/'ZERO' RETURN
	JMP I ASKDIR	/AC RANDOM !

ZEROMS,
IFNDEF GERMAN <
"N;"O;" ;"v;"a;"l;"i;"d;" ;"d;"i;"r;"e;"c;"t;"o;"r;"y;" ;"o
	"n;" ;"t;"h;"i;"s;" ;"a;"r;"e;"a;" ;"-;" ;"s;"h;"a;"l
	"l;" ;"I;" ;"Z;"E;"R;"O;" ;"i;"t;" ;"?;" ;0	/ >

IFDEF GERMAN <
"K;"E;"I;"N;" ;"V;"e;"r;"z;"e;"i;"c;"h;"n;"i;"s;" ;"a;"u
	"f;" ;"d;"i;"e;"s;"e;"m;" ;"B;"e;"r;"e;"i;"c;"h;" ;"-
	" ;"s;"o;"l;"l;" ;"i;"c;"h;" ;"Z;"E;"R;"O;" ;"m;"a;"c
	"h;"e;"n;" ;"?;" ;0	/ >

PAGE
	JMP BOOT	/ENTRY FOR NORMAL BOOTSTRAP OPERATION
B0,	JMS I (ASKDIR	/READ DIR AND ASK PERMISSION TO ZERO IF BAD
	 JMP DIROK	/DIRECTORY WAS OK, GO ON
	ACM1		/DIR WAS BAD BUT WE GOT OK, MAKE NEW DIRECTORY
	DCA 0		/ONE EMPTY
	TAD (70
	DCA 1		/FILE STORAGE START
	DCA 2		/NO LINK
	DCA 3		/NO OPEN OUTPUT FILES
	ACM1
	DCA 4		/1 ADD. INFO WORD (DATE)
	DCA 5		/EMPTY ENTRY
	TAD I (BGNUMB	/WHO AM I?
	CLL RTR
	RAR		/045X
	TAD (LNGLST-451	/INDEX INTO BACKGROUND LENGTH LIST
	DCA 10
	TAD I 10	/GET NEGATIVE LENGTH
	TAD (70		/--70 BLOCKS FOR SYSTEM
	DCA 6		/INTO LENGTH OF FIRST ENTRY
	JMS I (BOTRNS	/WRITE IN MY DIRECTORY
	   4200		/HOPE I HAVEN'T KILLED ANYTHING
	   0
	   1
DIROK,	AC0001
	JMS I (BOTRNS	/READ MONITOR FROM DSK0:
	   10
	   0
	   7		/KM-USR-DVHS-ENTER(TM8E)
	 		/7  13  16   26
	TAD I (BGNUMB	/GET OUR DEVICE TYPE
	DCA I (7560	/SET OUR SYS: TYPE
	TAD I (BGNUMB
	DCA I (7561	/SAME FOR DSK:
	TAD (7447+15-1-1
	DCA 10		/SET POINTER TO RESIDENCY TABLE
	TAD (7560+15-1-1
	DCA 11		/SET POINTER TO DEVICE TYPE TABLE
IFDEF SINGL8 <
	TAD (7620	/ENTRY POINT DSK2:
	DCA I 10	/
	TAD (6520	/DEVICE TYPE DSK2:
	DCA I 11	/ >
IFNDEF SINGL8 <
	ISZ 10		/
	ISZ 11		/ >
IFDEF SINGL8 <
	TAD (7615	/ENTRY POINT DSK1:
	DCA I 10	/
	TAD (6510	/DEVICE TYPE DSK1:
	DCA I 11	/ >
IFNDEF SINGL8 <
	ISZ 10		/
	ISZ 11		/ >
	TAD (7612	/ENTRY POINT DSK0:
	DCA I 10	/
	TAD (6500	/DEVICE TYPE DSK0:
	DCA I 11	/
	CDF 10		//
	TAD I (36+2000	//
IFDEF SINGL8 <
	TAD (2000+15-1-1// >
IFNDEF SINGL8 <
	TAD (2000+17-1-1// >
	DCA 10		//SET POINTER TO PERMANENT DEVICE NAME TABLE
IFDEF SINGL8 <
	TAD (6005	//CODE FOR DSK2:
	DCA I 10	//
	TAD (6004	//CODE FOR DSK1:
	DCA I 10	// >
	TAD (6003	//CODE FOR DSK0:
	DCA I 10	//
	TAD I (37+2000	//
	TAD BO2000	//
	DCA 0		//SET POINTER TO DEVICE HANDLER INFO
BRSLP,	CDF 0		/ONCE ONLY CODE
	TAD I RESTEM	/IS THIS DEVICE RESIDENT?
	CDF 10		//
	SZA CLA		//
	DCA I 0		//ZERO DEVICE HANDLER INFO FOR THIS DEVICE
	ISZ RESTEM	//
BO2000,	ISZ 0		//TO NEXT
	ISZ RESCNT	//MORE?
	JMP BRSLP	//YES
	CDF 0
	JMS I (BOTRNS	/WRITE ON SYS:
	   4010
	   0
	   7
	AC0001		/READ NEXT PART OF MONITOR
	JMS I (BOTRNS	/FROM DSK0:
	   3610
	   0000
	   51		/CD-SADA-ERR-CHN-ODT-MRG-REM-BOO-CCL
			/51 54   56  57  60  64  65  66  67
IFZERO OS8-40 <		/MAKE CCL RUN FROM DSK0:
	CDF 10
	TAD (17		/MOVE DSK0: DEV # TO CCL OVERLAY
	DCA I (7205
	TAD (7612	/ALSO DSK0: HANDLER ENTRY POINT
	DCA I (7206
	CDF 0		/ >
	JMS I (BOTRNS	/WRITE IT BACK ON THIS SYS:
	   7610
	   0
	   51
	JMS I (BOTRNS	/WRITE BLOCK 0 ON SYS:
	   4200
	   7400
	   0000
	JMP I (BOOT1

BOOT,	JMS I (BOTRNS	/READ BLOCK 0
	   200		/WHICH HAS OUR SPECIFIC INFO
	   7400
	   0000
	JMP I (BOOT1
RESTEM,	7447		/ONCE ONLY
RESCNT,	-17		/ONCE ONLY
	PAGE
BOOT1,	CDF 10
BOLOOP,	TAD BOOT1+47
	DCA I BOPNT
	ISZ BOLOOP
	ISZ BOPNT
	 JMP BOLOOP
	CDF 0
	JMP I .+1	/SLIP INTO 7600
	7605
BOPNT,	7647
IFDEF SYRX02 <
	NOPUNC		/IT TOOK MORE TIME TO FIGURE OUT
	*.+2		/RX02 LOADS AT 2
	ENPUNC	/ >
IFNDEF SINGL8 <
BOMESS,	207;"M;"8;" ;"D;"A;"T;"A;"-;"D;"I;"S;"K / >
IFDEF SINGL8 <
BOMESS,	207;"Z;"M;" ;"D;"A;"T;"A;"-;"D;"I;"S;"K	/ >

IFDEF SYRK8E <
	NOP
RK0030,	6741		/WAIT TILL RK8E READY
	 JMP .-1	/ >
IFDEF SYRL01 <
	NOP
	NOP
RL0031,	6601		/WAIT TILL RL01 READY
	 JMP .-1	/ >
IFDEF SYRX02 <
	NOP
	NOP
RX0033,	6755		/WAIT TILL RX02 READY, 'LOAD' JUMPS TO HERE
	 JMP RXLOAD+1	/FIGURE 8 WAIT WITH 'LOAD' SUBR >
	CLA
BOMSLP,	TAD BOMESS
	TLS		/TYPE A WARNING MESSAGE IF BOOTED
	TSF		/ON A REAL MACHINE
	 JMP .-1
	ISZ BOMSLP	/SETUP FOR NEXT CHARACTER
	SMA SZA CLA
	 JMP BOMSLP	/GO FOR NEXT CHARACTER
	HLT
IFDEF SYRX02 <
	JMS RXLOAD	/EMPTY SILO
	JMP .-1		/RX02 PRIMARY BOOT JUMPS TO HERE
	NOPUNC
	*.-2		/BACK TO NORMAL (RELOC'D)
	ENPUNC
	RXLOAD=53	/DEF FROM PRIMARY BOOT >
	RELOC
BOBOEND=.-BOBOOT
TRPTAB,
IFDEF UNTRP1 <UNTRP1^10+6001>
IFDEF UNTRP2 <UNTRP2^10+6001>
IFDEF UNTRP3 <UNTRP3^10+6001>
IFDEF UNTRP4 <UNTRP4^10+6001>
IFDEF UNTRP5 <UNTRP5^10+6001>
IFDEF UNTRP6 <UNTRP6^10+6001>
IFDEF UNTRP7 <UNTRP7^10+6001>
IFDEF UNTRP8 <UNTRP8^10+6001>
IFDEF UNTRP9 <UNTRP9^10+6001>
	0000	/END OF LIST

XDSKTAB,"S^100+"Y&3777;0;0;SIZE0
	USYS1;UNIT1;FROM1;FROM1+SIZE1
	USYS2;UNIT2;FROM2;FROM2+SIZE2
	USYS3;UNIT3;FROM3;FROM3+SIZE3
	USYS4;UNIT4;FROM4;FROM4+SIZE4
	USYS5;UNIT5;FROM5;FROM5+SIZE5
	USYS6;UNIT6;FROM6;FROM6+SIZE6
	USYS7;UNIT7;FROM7;FROM7+SIZE7

BOOBUF,	ZBLOCK 1000	/BUFFER IN WHICH THE BOOTBLK IS ASSEMBLED
DVRSTB=BOOBUF+447  /SYS:-ENTRY DEVICE RESIDENCY TABLE
DVTYPT=BOOBUF+560 /SYS:-ENTRY IN DEVICE TYPE TABLE
FAKSYS=BOOBUF+607 /POSITION OF SYS: ENTRYP. IN BLOCK 0
BGCORW=BOOBUF+777 /BACKGROUND CORE-WORD
		/END IFNZRO BGMAX >


PAGE
/***************** TASKBUILDER *************************
/9 FILES CAN BE LOADED IN ONE SINGLE COMMAND LINE.
/ONE SINGLE FILE MAY CONTAIN MORE THAN 1 TASK.

/OPTIONS:

/PAGE 0 VARIABLES
BINPC=TEMP5		/LOAD POINTER
ZNAME=TEMP1	/TASK'S NAME
ZLENG=TEMP2	/LENGTH IN PAGES
ZWC=TEMP3	/LENGTH OF TASK IN WORDS
ZCNT=TEMP4	/TEMPORARY COUNTER
ZBLK=TEMP6	/RELATIVE STARTING BLOCK
ZADDR=TEMP7	/STARTING ADDRESS WITHIN THE TASK
/ACTIVATE THE PRE-ASSEMBLED CORE-RESIDENT TASKS.
SETNAM,	0		/
	TAD [NAMLST-1	/SET UP POINTERS
	DCA AUTO16
	TAD [TCBTAB
	CDF 0		//
SETNM1,	DCA TEMP	//
	TAD I TEMP	//FIRST ITEM IS NAME OR 00
	SNA
	 JMP I SETNAM	//ZERO IS TERMINATOR
	DCA I AUTO16
	DCA I TEMP	//CLEAR THE BACKLINK!!
	TAD TEMP	//MOVE ONE BLOCKLET FURTHER
	TAD [10
	JMP SETNM1	//CYCLE

TSKBLD,	0		/TASKBUILD ROUTINE
RSTRT,	JMS I [OS8IN	/READ CHAR FROM OS8IN
	 JMP I TSKBLD	/NO INPUT, RETURN

/START LOADING ALL FILES, ONE BEHIND THE OTHER
XL4,
	TAD [200-1	/V2
	DCA AUTO10	/V2
	TAD [-4600	/DON'T SPOIL  BATCH (5000 AND UP)
	DCA TEMP	/V2
	CDF BGFLD+10	/V2
	DCA I AUTO10	/V2 CLEAR LOADER AREA
	ISZ TEMP	/V2
	 JMP .-2	/V2
	CDF BGFLD	/V2
	ACM1		/RESET TO LEADER PHASE
XL5,	JMS I [BINL	/READ FIRST FRAME AND SO ON
	  JMP I TSKBLD	/CTRL/Z DETECTED
	  JMP XL6	/CHECKSUM DETECTED
	TAD BINPC	/AC=0;INSPECT BEFORE LOADING
	SNA CLA		/
	 JMP XTABLS	/LOAD PAGE ZERO: PATCH MONITOR TABLES
	TAD BINAC
	CDF BGFLD+10	//THERE WILL THE TASK BE LOADED
	DCA I BINPC	//
	CDF BGFLD	/
	JMP XL5		/READ NEXT FRAME
XTABLS,	TAD BINAC
	AND [7707
	TAD [-6201
	SZA CLA		/MUST BE A CDF
ERR21,	JMS I [ERROR	/PREAMBLE ERROR
	TAD BINAC
	DCA YCDF
	JMS I [BINL	/GET NEXT WORD
	 NOP
ERR21A,	 JMS I [ERROR	/PREABLE ERROR
	TAD BINAC	/POINTER TO WORD TO PATCH
	DCA TEMP	/
	JMS I [BINL	/GET NEXT WORD
	 NOP
ERR21B,	 JMS I [ERROR	/PREABLE ERROR
	TAD BINAC	/THAT'S THE VALUE
YCDF,	HLT		/GETS A CDF
	DCA I TEMP	/AND PATCH IT NOW
	CDF BGFLD	/RESTORE DATAFIELD
	JMP XL5		/AND JUMP BACK TO NORMAL LOADING

XL6,	SZA CLA		/CHECKSUM IN AC
ERR25,	 JMS I [ERROR	/CKECKSUM ERROR
/FETCH NAME AND LENGTH FROM TASK HEADER.
/ALSO COMPUTE THE RELATIVE STARTING ADDRESS
	AC3777
	CDF BGFLD+10
	AND I [200	//
	SNA		//
	 JMP XL4	//EMPTY BINARY, SKIP IT
	DCA ZNAME	//
	TAD I [201	//GET LENGTH WORD
	AND [7600	//MAKE CORRECT WORDCOUNT
	DCA ZWC		//
	TAD I [201	//
	AND [77		//TASK CONNECTED?
	CLL RAL		//# OF WORDS FOR 'CONNECT' IN AC
	TAD [201	//SKIP THEM
	DCA ZADDR	//
	TAD I ZADDR	//NOW SCAN THE RELOCATE POINTERS
	ISZ ZADDR	//
	SZA CLA		//
	 JMP .-3	//
	CDF BGFLD
	TAD ZWC		/SAVE ALSO LENGTH IN # OF PAGES
	CLL RAR
	BSW
	DCA ZLENG	/LOADED BEYOND LENGTH OF TASK?
	TAD ZWC
	TAD [200
	CIA
	CLL
	TAD BINPC	/BINPC FROM 200 UP
	SZL CLA
ERR26,	 JMS I [ERROR	/LOADED BEYOND LENGTH
/MAKE A TASK-CONTROL BLOCKLET
/FIRST OF ALL GET AN ENTRY IN NAMLST.
/SEARCH NAMLST IN CASE THIS IS A REPLACE OPERATION
/THEN CHECK WHETHER THE
/NEW VERSION CAN BE DROPPED INTO THE SAME HOLE.
XL90,	TAD [-MAXNAM	/TEST FOR MAX NUMBER OF ENTRIES
	DCA ZCNT
	TAD [NAMLST
	DCA TEMP
	CDF 0		//
XL9,	TAD I TEMP
	CIA
	TAD ZNAME	//SAME NAME?
	SNA CLA
	 JMP I [XL91	//Y
	ISZ TEMP	//NEXT ENTRY
	ISZ ZCNT	//ALL DONE ?
	 JMP XL9	//NO, CYCLE
	TAD I [FHEAD	//MUST BE A NEW NAME, ALLOCATE NEW TCB
	SNA		//ANY SPARE TCB'S ?
ERR28,	 JMS I [ERROR	//NAMELIST EXHAUSTED
	DCA TEMP	//POINTER TO NEW TCB
	TAD I TEMP	//GET NEXT FREE TCB ADDRESS
	DCA I [FHEAD	//AND STORE IN FHEAD
	CDF BGFLD	/

/SEARCH A HOLE IN DISKMAP.
XL75,	TAD [DSKMAP
	DCA AUTO10
LOOP,	TAD I AUTO10
	SZA CLA
	 JMP .-2	/LOOP
	TAD AUTO10
	TAD [-ENDMAP	/COMPARE WITH END OF MAP
	SNA CLA		/IS THIS THE END ?
ERR27,	 JMS I [ERROR	/DISKMAP FULL
	TAD ZLENG
	STL CIA RAR	/CONVERT TO - # BLOCKS
	DCA ZCNT	/SETUP COUNTER
	JMP LOOP2	/JUMP IN LOOP TO CHECK LENGTH
LOOP1,	TAD I AUTO10	/GET NEXT WORD
	SZA CLA		/ALSO FREE ?
	 JMP LOOP	/NO, LOOK FOR NEXT HOLE
LOOP2,	ISZ ZCNT	/LONG ENOUGH ?
	 JMP LOOP1	/NO, SEE IF THERE IS MORE ROOM
/OK, FOUND HOLE THAT'S LARGE ENOUGH
	TAD ZLENG
	STL CIA RAR	/- # BLOCKS
	TAD AUTO10	/SAVE POSITION IN DISKMAP
	TAD [-DSKMAP	/RELATIVE BLOCK#
	TAD I [DSKMAP	/ADD OFFSET IN SAVE FILE
	DCA ZBLK
/FILL IN THE DISKMAP
	TAD ZLENG	/COUNTS # OF PAGES
	STL CIA RAR	/V3 CONVERT TO -# OF BLOCKS
	DCA ZCNT
	TAD ZLENG	/SET POINTER TO BEGIN OF HOLE
	STL CIA RAR	/
	TAD AUTO10
	DCA AUTO10
	TAD ZNAME	/NAME MUST BE UNEQ 0
	DCA I AUTO10
	ISZ ZCNT
	 JMP .-3
	JMP XL10

/NAME DOES ALREADY EXIST IN THE SYSTEM, DELETE THE OLD
/TASK FIRST
XL91,	DCA I TEMP	/ZERO THE NAME ENTRY
	TAD TEMP
	TAD [-NAMLST
	CLL RAL		/^10
	RTL		/FIND PLACE IN TCBTAB
	TAD [TCBTAB
	DCA TEMP
	TAD I [FHEAD
	DCA I TEMP
	TAD TEMP
	DCA I [FHEAD
	ISZ TEMP
	ISZ TEMP
	ISZ TEMP
	TAD I TEMP	/GET BLOCKNUMBER OFFSET

	CIA
	CDF BGFLD
	TAD I [DSKMAP	/SUBSTRACT OFFSET IN SAVEFILE
	CMA		/CIA: BUG, CORRECTED 13-JAN-80
	TAD [DSKMAP
	DCA AUTO10
	TAD AUTO10
	DCA AUTO11
DELETE,	TAD I AUTO10
	CIA
	TAD ZNAME
	SZA CLA		/STILL THE SAME NAME ?
	 JMP ENDDEL	/NO, ENTRY IS DELETED
	DCA I AUTO11	/DELETE THIS ENTRY
	JMP DELETE
ENDDEL,	CDF 10
	TAD I [7643
	CDF BGFLD
	AND [400
	SZA CLA		/DELETE OPTION SWITCH (/D) ?
	 JMP I [XL4	/YES, DON'T INSTALL THIS TASK
	JMP I [XL90	/NO, GO INSTALL THIS TASK
/START FILLING IN THE PARAMETERS:
XL10,	TAD TEMP	/POINTER IN TCBTAB
	DCA AUTO11
	CDF 0		//
	DCA I TEMP	//ZERO BACKLINK
	CDF BGFLD+10
	AC0100		/EXTRACT AUTO-START BIT
	AND I [201
	CDF 0
	DCA I AUTO11	/SET 0 OR 100 IN THREAD WORD
	TAD ZADDR	/STARTING ADDRESS FROM *200 ON
	AND [177	/V3 MAKE IT PAGE ZERO
	DCA I AUTO11	/RELATIVE STARTING ADDRESS
	TAD ZBLK
	DCA I AUTO11	/RELATIVE BLOCK NUMBER
	TAD ZWC		/LENGTH,FIELD AND ONDISK BIT
	CLL RAR		/V7A BREAK-FLAG=0
	TAD [FIELDS^10+1 /V3 SET ONDISK BIT,
	DCA I AUTO11	/RELATE TO HIGHEST+1 FG-FIELD
	TAD [CDF%2
	DCA I AUTO11

/UPDATE NAMLST.
/POSITION IN NAMLST.
	TAD TEMP
	TAD [-TCBTAB
	CLL RAR
	CLL RAR
	CLL RAR
	TAD [NAMLST
	DCA TEMP
	TAD ZNAME
	DCA I TEMP

/WRITE TASK ONTO DISK
	CDF BGFLD
	TAD ZLENG
	CLL IAC RAR	/# OF BLOCKS
	TAD ZBLK	/+ RELATIVE BLOCK #
	TAD I (ACTLEN	/-ACTUAL FILE LENGTH
	SMA CLA
ERR23,	 JMS I [ERROR	/?MULTI8.SV TOO SHORT?
	TAD ZWC		/MAKE FUNCTIONWORD
	STL RAR		/WRITE; WLL.LLL.FFF.000
	TAD [BGFLD+10
	DCA XLDTV
	TAD I [OFSET	/BLOCK# ON DISK
	TAD ZBLK
	DCA XLBLK
	CIF 0
	JMS I [SYSHND
XLDTV,	  0		/FUNCTION WORD
	  200		/ADDRESS IN CORE
XLBLK,	  0		/BLOCK # ON DISK
ERR29,	 JMS I [ERROR	/WRITE ERROR
	DCA CHANGD	/SET SAVE FLAG
	JMP I [XL4

PAGE
/BINARY LOADER SUBROUTINE READ A BINAIRY FILE AND
/PRODUCES TWO PARAMETERS OF 
/INTEREST:THE LOAD POINTER 'BINPC', AND THE CONTENTS
/OF THE DATA 'BINAC'. THE USER CAN TEST FORMATS AND
/BOUNDARIES, AND HAS TO DEPOSIT THE DATA HIMSELF.
/DURING LEADER PHASE THE ROUTINE IGNORES LEADER
/CODE. A JMS TO BINL WITH AC UNEQ 0 ALSO
/RESETS ALL PARAMETERS AND RETURNS TO LEADER MODE.

/HOW TO USE THE ROUTINE AS A STANDARD BINARY LOADER
/START,	JMS BINL
/	   HLT	/EOT RETURN;AC=0
/	   HLT	/READY RETURN;AC=DIFFERENCE IN CHECKSUMS
/	TAD BINAC	/AC=0;NORMAL RETURN
/	CDF DATAFIELD
/	DCA I BINPC
/	JMP START

BINL,	.-.		/AC UNEQ 0 =RESET PARAMETERS
	SZA CLA
	 JMP BINIT	/RESET
	ISZ BINPC	/V4 UPDATE POINTER
BINCHX,	TAD BINW1	/V4 UPDATE CHECKSUM
	TAD BINW2	/V4
	TAD BINSUM	/V4
BINGO,	DCA BINSUM	/CLEAR OR ADD TO CHECKSUM
	TAD BINCHR
	DCA BINW1
	JMS I [OS8IN	/V4 LOOK AHEAD
	 JMP I BINL	/END OF TAPE
	DCA BINW2
	JMS BINGG	/READ NEXT
	 JMP BINEND	/TRAILER= END
	JMS BINASS	/ASSEMBLE WORD1 AND WORD2
	SZL		/ORIGIN ?
	 JMP BINNPC	/V4 YES:SET ORIGIN
	DCA BINAC	/SAVE DATA
	ISZ BINL	/NORMAL RETURN
BINOUT,	ISZ BINL	/V4 CHECKSUM RETURN
	JMP I BINL	/V4

BINNPC,	DCA BINPC	/V4 SET ORIGIN
	JMP BINCHX	/V4 DON'T UPDATE POINTER
BINGG,	.-.		/READ AND TEST FRAMES
	JMS I [OS8IN	/V4
	 JMP I BINL	/END OF TAPE
	DCA BINCHR	/SAVE FRAME
	TAD BINCHR
	TAD [-200	/200 ?
	SPA		/YES
	 ISZ BINGG	/DATA OR ORIGIN
	SPA SNA CLA
	 JMP I BINGG	/DATA, ORIGIN OR L/T
	TAD BINCHR
	TAD [-300
	SMA		/IS IT REALLY A BINARY FILE ?
	 AND [7
	SNA CLA		/V4
	 JMP BINGG+1	/V4 IGNORE FIELD SETTING
ERR22,	JMS I [ERROR	/?BAD BINARY?

BINASS,	.-.		/ASSEMBLE 2 FRAMES
	TAD BINW1
	CLL RTL		/SWAP BYTES
	RTL
	RTL		/NO BSW!, ORIGIN SETTING MAKES LINK=1
	TAD BINW2
	JMP I BINASS	/RETURN

BINIT,	DCA BINW1	/V4
	DCA BINW2	/V4
	TAD [200	/V4
	DCA BINPC	/V4
	JMS BINGG
	 JMP .-1	/IGNORE LEADER
	JMP BINGO

BINEND,	ACM1
	TAD BINPC
	DCA BINPC	/BACKUP BINPC
	JMS BINASS	/FOR CHECKSUM
	CIA
	TAD BINSUM
	JMP BINOUT	/CHECKSUM RETURN

BINCHR,	0		/LAST READ CHAR.
BINW1,	0		/FIRST FRAME
BINW2,	0		/SECOND FRAME
BINSUM,	0		/CHECKSUM

PAGE
/USER EQUATES
IBUFLG=1		/LENGTH OF INPUT BUFFER
/PROGRAM EQUATES
	OSIFLD=BGFLD	/FIELD OF PROGRAM IS 
	IBUFLD=BGFLD	/FIELD OF INPUTBUFFER
	IPRFLD=BGFLD	/FIELD OF CALLING PROGRAM

/	DATAFIELD:
/0 FIELD 0
/1 FIELD 10
/Z FIELD ZERO

OS8IN,	0
	JMP I OSIPCH	/Z COROUTINES
OSIFRST,
OSINXT,	CDF 10		/1
	ISZ OSIFILP	/1
	TAD I OSIFILP	/1
	CDF OSIFLD	/
	SNA		/Z
	 JMP OSIRST	/Z NO NEXT ONE, MAKE RESTARTABLE
	CIF 10		/
	JMS I OSIUSR	/Z
	   INQUIRE		/Z FETCH HANDLER
OSIHND,	   0		/Z INIT VALUE
	 JMP ERR9	/VERY STRANGE INDEED
	TAD OSIHND	/GET HANDLER ADDRESS
	TAD (200
	AND (7600
	SZA CLA		/ADDRESS IN PAGE 7600 ?
ERR9,	 JMS I (ERROR	/?NON-RESIDENT HANDLER?
	CDF 10		/1
	ISZ OSIFILP	/1
	TAD I OSIFILP	/1
	DCA OSIBLK	/1
	CDF OSIFLD	/

OSIREAD,		/Z
	TAD (7600	/Z
	DCA OSICNT	/Z
	TAD (200+IBUFLD	/Z
	DCA OSIFUNC	/Z
	CIF 0		/
	JMS I OSIHND	/
OSITEM,
OSIFUNC,   200+IBUFLD	/Z
OSIBUF,	   BUFST	/Z
OSIBLK,	   7746		/Z INIT VALUE
ERR10,	 JMS I (ERROR	/?READ ERROR?
	ISZ OSIBLK	/Z
	TAD OSIBUF	/Z
	DCA OSIPNT	/Z
OSILP,	TAD I OSIPNT	/Z FAST BUFFER UNPACK
	JMS OSIPCH	/Z
	TAD I OSIPNT	/Z
	ISZ OSIPNT	/Z
	AND (7400	/Z
	DCA OSITEM	/Z
	TAD I OSIPNT	/Z
	JMS OSIPCH	/Z
	TAD I OSIPNT	/Z
	ISZ OSIPNT	/Z
	AND (7400	/Z
	CLL RTR		/Z
	RTR		/Z
	TAD OSITEM	/Z
	RTR		/Z
	RTR		/Z
	JMS OSIPCH	/Z
	ISZ OSICNT	/Z
	 JMP OSILP	/Z
	ISZ OSINUM	/Z
	 JMP OSIREAD	/Z
	JMP OSINXT	/Z
OSIPCH,	OSIFRST		/Z COROUTINES
	AND (377	/Z
	TAD (-232	/Z
	SNA		/Z
	 JMP OSINXT	/Z
	ISZ OS8IN
	TAD (232	/Z
	JMP I OS8IN	/Z

OSIRST,	TAD (OSIFRST	/Z
	DCA OSIPCH	/Z
	TAD (7617-1	/Z
	DCA OSIFILP	/Z
	JMP I OS8IN	/Z

OSIFILP,7617-1
OSIUSR,	7700
OSIPNT,	0
OSINUM,	0
OSICNT,	0

PAGE

BUFST,	ZBLOCK 400	/INPUT BUFFER

	ENDPWR=.+400&7400
/PAGE ZERO LITERALS:
$