File F1128.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/SYSSWP-SYSTEM SWAPPER

/THE PURPOSE OF THIS SYSTEM PROGRAM IS FOR SAVING AND
/RESTORING OF SYSTEM AREAS IN AN INTELLEGENT MANNER.
/THIS SHOULD REPLACE THE "/Y" OPTION IN "PIP" WITH A MORE
/COMPREHENSIVE SET OF OPERATIONS FOR QUICK SYSTEM SWITCHING.
/NOTE THAT THE FILES PRODUCED BY THIS PROGRAM ARE
/****NOT COMPATIBLE**** WITH FILES PRODUCED BY THE /Y
/OPTION OF PIP.

/OPTIONS:

/	/B	SWITCH THE BOOTSTRAP
/	/H	SWITCH HANDLERS
/	/P	INPUT FILE IS "PIP /Y" FILE
/	/S	SWITCH SYSTEM PORTION
/	/Y	SWITCH ALL OF THE ABOVE

/ANY COMBINATION OF THE ABOVE MAY BE SPECIFIED.
/THE INPUT IS THROUGH THE COMMAND DECODER WITH THE
/FOLLOWING RULES:

/  1.	IF OUTPUT IS TO A FILE AND THE "/Y" OPTION IS
/	NOT SPECIFIED THEN THE FILE MUST ALREADY EXIST.
/  2.	DEFAULT INPUT EXTENSION IS ".SY".  FOR OUTPUT
/	INTO A FILE THE .SY EXTENSION IS FORCED IF NONE
/	IS SPECIFIED.


/MAP OF SAVED AND RESTORED BLOCKS

/BLOCK	 BLOCK		DESCRIPTION
/ SYS	 FILE

/  0	  0	SYSTEM BOOTSTRAP RECORD
/  6	  1	PARAMETER BLOCK
/  7-12   2-5	KEYBOARD MONITOR
/ 13-15   6-10	USER SERVICE ROUTINE
/ 16-25  11-20	DEVICE HANDLERS
/ 26	 21	ENTER PROCESSOR FOR USR
/ 51-53  22-24	COMMAND DECODER
/ 54-55  25-26	SAVE AND DATE OVERLAYS
/ 56	 27	MONITOR ERROR ROUTINE
/ 57	 30	CHAIN PROCESSOR FOR USR
/ 60-63  31-34	SYSTEM ODT
/ 64-END 35-END RESERVED FOR EXPANSION AND MISC.

/THIS PROGRAM DEPENDS ON CERTAIN TABLES IN THE USR
/AND SYSTEM BOOTSTRAP BE IN FIXED LOCATIONS.
/THEY ARE:

	TDCB=	0160	/DEVICE CONTROL WORD TABLE
			/IN BOOTSTRAP
	UDNAME= 0141	/USER DEVICE NAME TABLE
			/IN BOOTSTRAP
	DHRES=	0047	/DEVICE HANDLER RESIDENCY
			/IN BOOTSTRAP
	SDNAME= 0164	/PERM DEVICE NAMES
			/BLOCK 2 USR
	SDVHND= 0366	/BLOCK 2 USR
			/OVERFLOWS THRU BLOCK 3

/EACH TABLE IS 17 LONG.  SOME FUNNY BUSINESS MUST
/HAPPEN TO TAKE CARE OF DSK.

/LOADING INFORMATION:
/	.R ABSLDR
/	*SYSSAV=13000(89)
	FIELD 1
	*3000

	ODEV=6600	/OUT HANDLER LOADS HERE
	INDEV=7200	/IN HANDLER LOADS HERE
	MPARAM=7643	/CD PARAMETER TABLE
	USR=0200
	/THE FOLLOWING ARE USED AFTER WE ARE THROUGH
	/WITH THE USR.
	INHAND=20
	OUHAND=21
	SLASHS=22
	SLASHB=23
	SLASHH=24

SYSSWP, CLA CLL 	/JUST IN CASE
	JMS I (7700	/LOCK USR IN
	  10		/USRIN
	JMS I (USR	/COMMAND DECODE
	  5
DEFEX,	  "S 100+"Y-300 /"SY" DEFAULT EXT.
	CLA CLL 	/LET'S NOT PRESERVE TENATIVES

/FIRST SOME INPUT FILE SETUP

	TAD I (7617	/DEVICE NUMBER INPUT FILE
	AND (17 	/MASK NUMBER
	DCA INDEVN	/SAVE
	TAD INDEVN
	SNA		/SKIP IF SPECIFIDE
	JMP BADCD
	JMS GDCB	/GET DCB WORD
	SMA CLA 	/MUST BE FILE STRUCTURED
	JMP BADFIL	/NOT DIRECTORY DEVICE
	TAD (INDEV+1	/WHERE INHANDLER GOES
	DCA IENTRY	/STASH FOR HANDLER LOAD
	TAD INDEVN	/GET NUMBER
	JMS I (USR	/LOAD HANDLER
	  1
IENTRY,   INDEV+1	/CHANGED TO ENTRY POINT
	 HLT		/HUH!!!
	TAD I (7620	/GET START BLOCK
	DCA IBOOT	/INPUT BOOTSTRAP BLOCK
	JMS I (SLSHP	/CHECK /P OPTION
	TAD IBOOT	/GET AGAIN
	SNA		/SKIP IF A FILE
	TAD (5		/IS SYSTEM AREA
	IAC		/CALC START OF PARAM BLOCK
	DCA IPARAM	/BLOCK FOR PARAMETER BLOCK
	TAD IBOOT	/AND AREA PAST SCRATCH BLOCKS
	SNA		/SKIP IF A FILE
	TAD (5+22	/EXTRAS FOR DIRECTORY AND SCRATCH
	TAD (22 	/CALC START COMMAND DECODER
	DCA IDECOD	/STASH BLOCK NUMBER
	TAD I (7617	/NOW TO CALC SIZE
	AND (7760	/MASK SIZE BITS
	CIA		/MAKE POSITIVE
	RTR CLL;RTR	/SHIFT OVER
	SZA		/SKIP IF NOT FROM A FILE
	JMP CDL2	/SKIP OVER THIS STUFF
	CIF 0		/WAS A SYSTEM AREA
	JMS I IENTRY	/SO READ DIRECTORY BLOCK
	 0100		/TO DETERMINE LENGTH
	 0		/INTO PAGE 0 FIELD 0
	 1		/BLOCK 1
	HLT		/HUH!!!
	JMS GSIZE	/GET SIZE FROM DIRECTORY
	JMP NOSYS	/NO SYSTEM AREA
	NOP		/MAY BE BAD WITH ZERO DIRECTORY
	SNA		/SKIP IF SYSTEM PRESENT.
	JMP NOSYS	/NO SYSTEM AREA
CDL2,	DCA INSIZE	/SIZE OF SYSTEM

/NOW SOME OUTPUT FILE SETUP
/WHILE WE ARE NEAR THE SYSTEMS AREA

	TAD I (7600	/FOR DEVICE NUMBER
	AND (17 	/JUST IN CASE HE GAVE A LENGTH
	DCA ODEVN	/SAVE NUMBER
	TAD ODEVN
	SNA		/SKIP IF ONE SPECIFIED
	JMP BADCD
	JMS GDCB	/GET DCB WORD
	SMA CLA 	/SKIP IF FILE STRUCTURED
	JMP BADFIL	/NOT A DIRECTORY DEVICE
	TAD (ODEV+1	/WHERE WE PUT THE HANDLER
	DCA OENTRY
	TAD ODEVN	/GET DEVICE NUMBER
	JMS I (USR	/GO GET THE DEVICE
	  1		/HANDLER
OENTRY,   ODEV+1	/WHERE IT GOES
	HLT		/HUH!!!!
	TAD I (7601	/NOW TO SEE IF FILE SPECIFIED
	SNA CLA 	/SKIP IF WRITING INTO FILE
	JMP CDSYS	/INTO A SYSTEM AREA
	TAD I (7604	/CHECK EXTENSION
	SNA
	TAD DEFEX	/GET DEFAULT EXTENSION
	DCA I (7604	/AND FORCE "SY" IF ZERO
	TAD I (MPARAM+2 /GET OPTIONS WORD
	SMA CLA 	/SKIP IF /Y SPECIFIED
	JMP CDL1	/NO: FILE MUST ALREADY EXIST
	TAD (7601	/NAME POINTER
	DCA CDL3
	TAD (7601
	DCA CDL4	/AND COPY ALL OVER
	TAD (7601
	DCA CDL5
	JMP I (CDCON1	/GO CONTINUE NEXT PAGE

INDEVN, 0		/IN DEVICE NUMBER
IBOOT,	0		/IN BLOCK NUMBER BOOTSTRAP
IPARAM, 0		/IN BLOCK # PARAM BLOCK
IDECOD, 0		/IN BLOCK # C.DECODER
INSIZE, 0		/TOTAL SIZE OF SYSTEM AREA
			/DOES NOT INCLUED DIRECTORY OR SCRATCH
ODEVN,	0		/OUT DEVICE NUMBER

	PAGE
CDSYS,	TAD OENTRY	/OUTPUT IS INTO SYSTEM AREA
	DCA CDOSTRT	/HANDLER ENTRY TO THIS PAGE
	CIF 0		/CALL HANDLER
	JMS I CDOSTRT	/READ DIRECTORY SETMENT 1
	 0100
P0,	 0
P1,	 1
	HLT		/HUH!!!
	JMS GSIZE	/GET SIZE OF SYS
	JMP BADSIZ	/NO SYSTEM AREA
	SKP		/HAVE SIZE BUT DIRECTORY ALSO ZERO
	JMP CDLX
	CIA		/-LENGTH
	DCA OSTRT+1	/SAVE SIZE
	TAD OSTRT+1	/GET BACK
	TAD INSIZE	/AND CHECK AGAINST DESIRED
	SPA SNA CLA	/SKIP IF TOO SMALL
	JMP CDL8	/IS O.K.
CDL7,	TAD INSIZE	/COPY INSIZE TO THIS PAGE
	TAD (22+5	/ADD BACK IN SCRATCH+DIRECTORY
	DCA OSTRT+1
	CDF 0		/TO FIELD OF DIR SEG.
	TAD I P1	/GET OLD START
	CIA		/NEGATE
	TAD OSTRT+1	/DIFFERENCE IN SIZES
	TAD I (6	/ADJUST LAST EMPTY
	DCA I (6	/TO CORRECT VALUE
	TAD OSTRT+1	/SINCE CHANGING START OF FILES
	DCA I P1	/UPDATE START OF FILES
	CDF 10		/BACK TO THIS FIELD
	CIF 0		/WRITE ZERO DIRECTORY BACK OUT
	JMS I CDOSTRT
	 4100
	 0
	 1
	HLT		/HUH
	TAD INSIZE	/AND SET SIZE
CDLX,	CIA
	DCA OSTRT+1
CDL8,	DCA OSTRT	/START AT BLOCK 0
	JMP CDL6	/CONTINUE

CDCON1, TAD ODEVN
	JMS I (USR	/DELETE ANYTHING WITH THIS NAME
	  4
CDL3,	  7601
	  0		/JUST DELETE
	CLA CLL 	/MIGHT NOT BE ONE
	TAD INSIZE	/GET SIZE OF SYSTEM
	CLL RTL;RTL	/SHIFT OVER TO CORRECT PLACE
	TAD ODEVN	/AND OUT DEVICE NUMBER
	JMS I (USR	/MAKE TENATIVE
	  3		/ENTER
CDL4,	  7601		/THE NAME NOW
	  0		/AVAILABLE SIZE NOT USED
	JMP NOROOM	/ROOM NOT AVAILABLE
	TAD INSIZE	/GET SYSTEM SIZE
	DCA CDL5+1	/STASH FOR CLOSE
	TAD ODEVN	/GET DEVICE NUMBER
	JMS I (USR	/AND MAKE PERMANENT
	 4
CDL5,	 7601		/NAME
	 0		/SIZE
	HLT		/HUH!

CDL1,	TAD (7601	/POINTER TO NAME
	DCA OSTRT	/FOR CALL
	TAD ODEVN	/GET OUT DEV NUMBER
	JMS I (USR	/AND LOOKUP FILE
	  2
OSTRT,	  7601		/CHANGED TO FILE START
	  0		/CHANGED TO -LENGTH
	JMP NOFILE	/MUST WORK OR ILLEGAL

/NOW WE CAN CHECK FOR APPROPRIATE SIZE.

CDL6,	TAD OSTRT+1	/GET -FILE LENGTH
	TAD INSIZE	/OUT FILE >= IN SIZE
	SMA SZA CLA	/SKIP IF SIZE O.K.
	JMP BADSIZ	/OUT FILE TOO SMALL
	TAD OSTRT	/GET START OF FILE
	DCA OBOOT	/START FOR BOOTSTRAP
	TAD OBOOT
	SNA		/SKIP IF A FILE
	TAD (5		/PAST DIRECTORY
	IAC		/NEXT BLOCK
	DCA OPARAM	/WHERE PARAMETER BLOCK STARTS
	TAD OBOOT	/AGAIN
	SNA		/SKIP IF FILE
	TAD (5+22	/PAST DIRECTORY AND SCRATCH
	TAD (22 	/CALC START COMMAND DECODER
	DCA ODECOD
	TAD INSIZE	/A PRELIMINARY CHECK
	TAD (-41	/FOR VALIDITY OF INPUT
	SPA CLA 	/MUST BE AT LEAST 41 BLOCKS
	JMP NOSYS	/NOT A SYSTEM
	JMP DOIT	/GO START OPERATION

CDOSTR, 0
OBOOT,	0
OPARAM, 0
ODECOD, 0

	PAGE
/SUB TO GET DCB WORD

GDCB,	0
	TAD (7600+TDCB-1 /CALC INDEX INTO DCB TABLE
	DCA GDCBTM
	TAD I GDCBTM	/FETCH DCB WORD
	JMP I GDCB

GDCBTM, 0

/SUBROUTINE TO DETERMINE SIZE OF SYSTEM AREA.
/DIRECTORY SEGMENT 1 MUST BE LOADED INTO PAGE 0 FIELD 0
/CALL:	JMS GSIZE
/	 XXXX	/NO SYSTEM AREA
/	 XXXX	/ZERO DIRECTORY: AC=SIZE  (0 IF BAD)
/	 XXXX	/SYSTEM PRESENT AC=SIZE
		/SIZE IN AC0-7

GSIZE,	0
	CDF 0
	IAC
	TAD I (0	/GET -#ENTRIES+1
	SNA CLA 	/SKIP IF NON-ZERO DIRECTORY
	JMP GSIZE1	/IS ZERO DIRECTORY
	TAD I (1	/GET STARTING BLOCK
	CDF 10		/BACK TO THIS FIELD
	TAD (-5-22	/DON'T SAVE THESE
	SMA		/SKIP IF ILLEGAL
	JMP GSIZEE	/HAVE CORRECT SIZE
	CLA		/GET RID OF BAD ACC
	JMP I GSIZE	/ERROR RETURN

GSIZE1, TAD I (1	/A ZERO DIRECTORY
	CDF 10		/BUT GET SIZE ANYWAY
	TAD (-5-22	/DON'T COUNT THOSE
	SPA		/SKIP IF A GOOD ONE
	CLA CLL 	/RETURN AC=0 FOR BAD SIZE
	SKP		/TAKE SECOND RETURN
GSIZEE, ISZ GSIZE	/TAKE 3RD RETURN
	ISZ GSIZE
	JMP I GSIZE	/AND RETURN

/SIMI-GENERALIZED MOVE ROTINE
/CALLED ONLY FROM FIELD 1
/CALL:	JMS MOVE
/	 FUNCTION	/6-8 FROM FIELD
/			/9-11 TO FIELD
/	 FROM ADDRESS
/	 TO ADDRESS
/	 WORD COUNT	/A NEGATIVE NUMBER

MOVE,	0
	TAD I MOVE	/GET FUNCTION WORD
	AND (70 	/MASK FROM ADDRESS
	TAD (CDF
	DCA MOVE1	/STASH
	TAD I MOVE	/GET AGAIN
	RTL;RAL 	/TO FIELD
	AND (70 	/MASK BITS
	TAD (CDF	/FIX FIELD
	DCA MOVE2	/STASH
	ISZ MOVE	/TO FROM ADDRESS
	TAD I MOVE	/FETCH IT
	DCA MOVEFR	/STASH IN POINTER
	ISZ MOVE	/TO DESTINATION ADDRESS
	TAD I MOVE
	DCA MOVETO	/STASH IN POINTER
	ISZ MOVE	/TO WORD COUNT
	TAD I MOVE	/FETCH WORD COUNT
	ISZ MOVE
	SNA		/DON'T ALLOW 0
	JMP I MOVE	/FAST RETURN
	DCA MOVEWC	/STASH
MOVE1,	CDF		/SOURCE FIELD
	TAD I MOVEFR
MOVE2,	CDF		/DESTINATION FIELD
	DCA I MOVETO
	ISZ MOVEFR	/NOT EXPECTED TO SKIP
	ISZ MOVETO	/NOR THIS
	ISZ MOVEWC	/DONE?
	JMP MOVE1	/NOT YET: LOOP
	CDF 10		/TO THIS FIELD
	JMP I MOVE	/AND RETURN

MOVEFR, 0
MOVETO, 0
MOVEWC, 0

/PRINT A MESSAGE ROUTINE

PRMSG,	0
	CDF 10		/JUST IN CASE
	TAD I PRMSG	/GET ADDRESS OF MESSAGE
	DCA PRMST	/SAVE POINTER
	ISZ PRMSG	/POINT TO RETURN
	JMS CRLF	/START WITH NEW LINE
PRMSL,	TAD I PRMST	/GET A WORD
	CLL RTR;RTR;RTR /LEFT HALF OVER
	JMS PRCHR	/PRINT THE CHAR
	TAD I PRMST	/GET AGAIN
	JMS PRCHR	/PRINT RIGHT HALF
	ISZ PRMST	/NEXT WORD
	JMP PRMSL

PRMST,	0

/PRINT A CHARACTER

PRCHR,	0
	AND (77 	/MASK BITE
	SNA		/SKIP IF ONE THERE
	JMP I PRMSG	/NOPE=DONE
	TAD (-40	/FOR EXTENSION
	SPA		/SKIP IF 200 CODE
	TAD (100	/IS 300 CODE
	TAD (240	/PARITY AND 40 BACK IN
	JMS PCH 	/PRINT THE CHARACTER
	6031		/CHECK FOR  O
	JMP I PRCHR	/DONE
	6036		/GET IT
	TAD (-"O+100	/ O
	SNA
	JMP I PRMSG
	TAD (-"C+"O	/OR  C
	SZA CLA
	JMP I PRCHR
	CDF CIF 0
	JMP I (7600

/PRINT CR/LF

CRLF,	0
	TAD (215
	JMS PCH
	TAD (212
	JMS PCH
	JMP I CRLF

/PRINT CHAR IN AC

PCH,	0
	6046		/PRINT IT
	6041		/WAIT FOR FLAG
	JMP .-1
	CLA CLL 	/GET RID OF CHAR
	JMP I PCH


	PAGE
/NOW IT IS TIME TO DO SOME TRANSFERS

DOIT,	TAD I (OENTRY	/WE ARE THRU WITH THE USR
	DCA OUHAND	/SO USE SOME PAGE ZERO'S
	TAD I (IENTRY
	DCA INHAND
	TAD I (MPARAM+2
	SPA CLA 	/SKIP IF NOT /Y
	IAC
	DCA SLASHS	/INIT OPTIONS
	TAD SLASHS	/BY TURNING ON OR OFF
	DCA SLASHH	/DEPENDING ON /Y
	TAD SLASHS	/OPTION. /Y=(BHS)
	DCA SLASHB
	TAD I (MPARAM+1 /OPTIONS 2
	AND (40 	/MASK /S BIT
	TAD SLASHS
	DCA SLASHS
	TAD I (MPARAM
	AND (20 	/MASK /H BIT
	TAD SLASHH
	DCA SLASHH
	TAD I (MPARAM
	AND (2000	/MASK /B BIT
	TAD SLASHB
	DCA SLASHB
	TAD SLASHB	/NOW SEE IF ANY OPTIONS SPECIFIED
	TAD SLASHS
	TAD SLASHH
	SNA CLA 	/SKIP IF SOME OPTION
	JMP NOOPT	/NO OPTIONS SPECIFIED

/INITIALIZATION DONE: NOW READ IN GROUP1

	TAD I (OBOOT	/AND OLD INFO (ODEV)
	DCA DOIT3
	TAD I (OPARAM
	DCA DOIT4
	TAD I (OPARAM
	TAD (6		/TABLES IN 2ND BLOCK USR
	DCA DOIT5
	JMS DOITS1	/READ INPUT FILE STUFF
	CIF 0
	JMS I OUHAND	/NOW INTO FIELD 1
	 0210		/THE BOOTSTRAP
	 0200		/NOT INTO PAGE 0
DOIT3,	 0		/200-600
	HLT		/HUH
	CIF 0
	JMS I OUHAND
	 0211		/AND PARAMETER BLOCK
	 0600		/600-1200
DOIT4,	 1
	HLT		/HUH!!!
	CIF 0
	JMS I OUHAND	/AND BLOCKS 2-3 OF USR
	 0411		/2 BLOCKS
	 1200		/1200-2200
DOIT5,	 6
	HLT		/HUH

	CDF 10		/BACK TO THIS FIELD
	TAD SLASHB	/CHECK IF /B OPTION
	SZA CLA 	/SKIP IF NOT REQUESTED
	JMP BOOREQ	/IS REQUESTED.
	JMS I (MOVE	/MOVE OLD BOOTSTRAP DOWN
	 0010		/SRCFLD=1;DSTFLD=0
	 0200		/SRC START=200
	 0000		/DST START=000
	 -47		/WORDS ABOVE HND RES TBL
	JMS I (MOVE	/BETW HND RES AND USER NAME
	 0010
	 0266
	 0066
	 -52		/THRU 137
	JMS I (MOVE	/THE HANDLER ITSELF
	 0010		/AND ALL THE FIELD 0 STUFF
	 0400
	 0200
	 -200
	TAD I (360	/SYSTEM DCB WORD
	CDF 0
	DCA I (160	/SWITCH IT
	CDF 10		/BACK TO THIS FIELD
	JMP BOOREQ	/NEXT PAGE

	/THE DCB WORD IS THE ONLY ONE
	/WE NEED TO SWITCH FOR SYS SINCE
	/RESIDENCY DOESN'T CHANGE.


/SUBROUTINE TO READ INDEV STUFF

DOITS1, 0
	TAD I (IBOOT	/BOOTSTRAP BLOCK
	DCA DOIT1
	TAD I (IPARAM	/STARTING WITH PARAMETER BLOCK
	DCA DOIT2
	CIF 0		/READ INDEV FIRST
	JMS I INHAND
	 0200		/BOOTSTRAP
	 0		/LOWEST PAGE FIELD 0
DOIT1,	 0		/BOOSTRAP BLOCK
	HLT		/HUH
	CIF 0
	JMS I INHAND	/AND PARAM BLOCK ON
	 2001		/UP TO HANDLERS
	 0400		/0400-4400
DOIT2,	 1
	HLT		/HUH
	JMS INVALID	/CHECK INPUT FOR VALIDITY
	JMP I DOITS1

	PAGE
BOOREQ, TAD SLASHH
	SZA CLA 	/SKIP IF NO HANDLERS REQUESTED
	JMP HNDREQ	/YES REQESTED
	JMS I (MOVE	/SINCE NOT REQUESTED
	 0010		/KEEP OLD TABLES
	 0250		/HANDLR RESIDENCY
	 0050
	 -16
	JMS I (MOVE	/AND DCB
	 0010
	 0361
	 0161
	 -16
	JMS I (MOVE	/AND NAME TABLE
	 0010
	 1200+SDNAME+1
	 3400+SDNAME+1
	 -16
	JMS I (MOVE	/NOW FOR INFORMATION TABLE
	 0010
	 1200+SDVHND+1
	 3400+SDVHND+1
	 -16
HNDREQ, CDF 0		/NOW TO CHECK ON DSK
	TAD I (50	/FROM RESIDENCY TABLE
	TAD (-7607	/CHECK IF SYS
	SZA CLA 	/SKIP IF DSK=SYS
	JMP CHKSLS	/NO-LEAVE AS IS
	TAD I (160	/CHANGE DCB FOR DSK
	DCA I (161
	TAD I (3400+SDVHND /AND INFORMATION TABLE
	DCA I (3400+SDVHND+1
CHKSLS, CDF 10
	JMS I (CHKRES	/FOR PATHOLOGICAL CASE
	TAD SLASHS	/HOW ABOUT SYSTEM ITSELF
	SZA CLA 	/SKIP IF NOT
	JMP SYSREQ	/YES=LEAVE AS IS
	JMS MOVE	/NO:SO PUT OLD BACK IN
	 0010
	 1200		/USR
	 3400
	 -164		/THRU SDNAME
	JMS MOVE	/FROM SDNAME TO SDVHND
	 0010
	 1200+SDNAME+17
	 3400+SDNAME+17
	 SDNAME+17-SDVHND
	JMS MOVE	/AND SDVHND TO END BLOCK 3 USR
	 0010
	 1200+SDVHND+17
	 3400+SDVHND+17
	 SDVHND+16-1000
SYSREQ, TAD OBOOT	/SET UP FOR WRITEING OUT
	DCA SYSR1	/WHERE BOOTSTRAP GOES
	TAD OPARAM	/WHERE NEXT GROUP GOES
	IAC
	DCA SYSR2
	TAD OPARAM
	DCA SYSR2B
	TAD OPARAM
	TAD (6		/WHERE USR BLK 2-3 GOES
	DCA SYSR3
	JMS PARAM	/FIX UP PARAMETER BLOCK
			/IF REQUIRED AND SET WRPARAM

	/NOW COPY BLOCK BACK TO OUTDEV

	CIF 0
	JMS I OUHAND	/THE BOOTSTRAP
	 4200
	 0
SYSR1,	 0
	HLT		/HUH
	TAD SLASHS
	SNA CLA 	/NEXT ONLY IF /S
	JMP SYSR4
	ISZ I (WRPARAM	/SHOULD WE WRITE THE PARMETER BLOCK
	JMP SYSR2B+2	/NO
	CIF 0		/YES.
	JMS I OUHAND
	 4201
	 0400
SYSR2B,  1
	HLT		/HUH
	CIF 0
	JMS I OUHAND	/PARAM,KEYBOARD, AND 1 BLK USR
	 5201
	 1000
SYSR2,	 2
	HLT		/HUH
SYSR4,	CIF 0
	JMS I OUHAND	/AND REST OF USR
	 4401
	 3400
SYSR3,	 7
	HLT		/HUH!!!

/NOW - IF OUTDEV=SYSDEV LETS CHANGE THE
/IN CORE TABLES

	TAD OUHAND
	TAD (-7607
	SZA CLA 	/SKIP IF OUDEV=SYSDEV
	JMP SYSR5	/NO: SKIP THIS STUFF
	JMS I (MOVE	/MOVE THE HND RES TABLE
	 0001		/TO FIELD 1
	 DHRES
	 7600+DHRES
	 -17
	JMS I (MOVE	/ZERO THE USER NAME TABLE
	 0001		/AND FIX THE DCB
	 UDNAME
	 7600+UDNAME
	 -17 2
	JMP SYSR5	/CONTINUE NEXT PAGE

	PAGE
/NOW FOR THE HANDLERS

SYSR5,	TAD SLASHH	/HANDLER CHANGE???
	SNA CLA 	/SKIP IF REQUESTED
	JMP SYSR6	/NOPE: GO CHECK REST
	TAD IPARAM	/START OF PARAMETER
	TAD (10 	/TO START OF HANDLERS
	DCA SYSR7
	CIF 0
	JMS I INHAND
	 2000		/10(8) BLOCKS
	 0
SYSR7,	 11
	HLT		/HUH
	TAD OPARAM	/CALC START ON OUTDEV
	TAD (10
	DCA SYSR8
	CIF 0
	JMS I OUHAND
	 6000
	 0
SYSR8,	 11
	HLT		/HUH!!!

SYSR6,	TAD SLASHS
	SNA CLA 	/SKIP IF NEED TO DO REST
	JMP SYSSWP
	TAD IPARAM	/CALC START OF ENTER OVERLAY
	TAD (20
	DCA SYSR9	/SAVE START
	TAD OPARAM
	TAD (20
	DCA SYSR10	/WHERE TO PUT IT
	TAD IDECODE	/START OF CD
	DCA SYSR9B
	TAD ODECODE
	DCA SYSR9C
	TAD INSIZE
	TAD (-35	/LAST COPY
	CLL RTR;RTR;RTR /BLOCKS LAST READ
	DCA SYSR11
	TAD SYSR11
	TAD (4000-600+1 /LESS 3 FOR LAST WRITE
	DCA SYSR14
	TAD SYSR9B	/GET READ
	TAD (13 	/BLOCK # FIRST RES FOR EXPANSION
	DCA SYSR11+2
	TAD SYSR9C
	TAD (13 	/BLOCK # FIRST RES FOR EXPANSION
	DCA SYSR12
	TAD SYSR12	/NOW TO POSSIBLE TD8E-RES
	TAD (2		/TWO DOWN
	DCA SYSR13
	TAD SYSR13	/AND ONE MORE FOR LAST WRITE
	IAC
	DCA SYSR14+2	/SET UP COMPLETE
	CIF 0
	JMS I INHAND	/READ ENTER PROCESSOR
	 0200
	 0
SYSR9,	 21
	HLT		/HUH!
	CIF 0
	JMS I INHAND
	 2601		/CD AND JUNK
	 400
SYSR9B,  22
	HLT		/HUH
	CIF 0
	JMS I OUHAND	/AND WRITE IT
	 4200
	 0
SYSR10,  21
	HLT		/HUH
	CIF 0
	JMS I OUHAND
	 6601
	 0400
SYSR9C,  22
	HLT		/HUH
	CIF 0
	JMS I INHAND	/AND RESERVED FOR EXP, ETC.
SYSR11,  0;0;35
	HLT		/HUH
	CIF 0
	JMS I OUHAND	/WRITE FIRST 2
	 4400		/RESERVED FOR EXPANSION
	 0
SYSR12,  35
	HLT		/HUH!
	TAD SLASHB	/NOW IF NO BOOTSTRAP
	SNA CLA 	/REQUEST LEAVE TD8E NON-ROM
	JMP .+7 	/RESIDENT ALONE
	CIF 0		/IF REQUESTED THEN CHANGE IT
	JMS I OUHAND	/TO NEW BLOCK
	 4201		/ONE BLOCK
	 1000		/3RD BLOCK
SYSR13,  37
	HLT		/HUH!!!
	CIF 0
	JMS I OUHAND	/AND FINAL WRITE
SYSR14,  4201
	 1400
	 40
	HLT		/WHAT
	JMP SYSSWP

	PAGE
	/NOW CHECK FOR VALIDITY OF INDEV STUFF

INVALI, 0
	CDF 0		/LOOK AT INPUT STUFF IN BOOTSTRAP
	TAD I (200	/SHOULD BE 7600 OF MONITOR
	TAD (-4207	/JMS SYSHND
	SZA CLA
	JMP NOSYS	/NO SYSTEM
	TAD I (205	/DOUBLE CHECK
	TAD (-6213	/BEFORE MONITOR SAVE
	SZA CLA
	JMP NOSYS	/NO SYSTEM
	TAD I (3400+SDNAME
	TAD (-4631	/"SYS" COMES FIRST
	SZA CLA 	/SKIP IF O.K.
	JMP NOSYS
	TAD I (3400+SDVHND
	SZA CLA 	/SYS IS CORE RESIDENT
	JMP NOSYS
	CDF 10		/BACK TO THIS FIELD
	JMP I INVALID	/ALL O.K.


/THIS ROUTINE CHECKS AND UPDATES THE PARAMETER BLOCK

PARAM,	0
	DCA WRPARAM	/CLEAR WRITE FLAG
	CDF 0		/FIRST CHECK IF INPUT HAS PARAM
	TAD (400	/WHERE IT STARTS
	JMS CHKPAR	/CHECK FOR PRESENCE OF BLOCK
	JMP I PARAM	/NO PARAMETER BLOCK=CAN'T UPDATE
	TAD SLASHS	/IF NOT CHANGING SYSTEM THEN
	SNA CLA 	/NO CHANGES:
	JMP I PARAM	/SYSTEM NOT BEING CHANGED
	TAD I (OBOOT	/CHECK IF INTO A FILE
	SNA CLA 	/OBOOT=0 IF YES
	JMP PARAM1	/IS INTO A SYSTEM AREA
PARAM2, STA		/IS INTO A FILE SO
	DCA WRPARAM	/JUST COPY INPUT PARAMETER BLOCK
	JMP I PARAM	/AND RETURN
PARAM1, TAD (600	/IS INTO SYSTEM AREA
	JMS CHKPAR	/SO CHECK FOR PARAMETER PRESENCE
	JMP I PARAM	/NO: FORGET IT
	JMS I (MOVE	/MOVE NEW SYSTEM INFO IT
	 01		/FROM FIELD 0
	 505		/SYSTEM ID ETC
	 705		/CORRESPONDING FIELD 1
	 -5
	STA
	DCA I (607	/SET SYSTEM PRESENCE FLAG
	JMS I (MOVE	/THEN COPY WHOLE BLOCK DOWN
	 10
	 600
	 400
	 -400
	JMP PARAM2	/AND INDICATE WRITE

WRPARA, 0		/-1 IF PARAMETER BLOCK TO BE WRITTEN

/SUBROUTINE TO CHECK PARAMETER BLOCK
/ENTER WITH FIELD SET AND AC=STARTING ADDRESS OF BLOCK

CHKPAR, 0
	DCA CHKTMP	/STORE POINTER
	TAD I CHKTMP	/GET FIRST WORD
	TAD (-"D 100-"W+300
	SZA CLA
	JMP CHKEXT	/NO PARAMETER BLOCK
	ISZ CHKTMP	/WORD 2
	TAD I CHKTMP
	TAD (-"J 100-"C+300
	SZA CLA 	/SKIP IF CANDIDATE
	JMP CHKEXT	/NO PARAMETER BLOCK
	ISZ CHKTMP
	TAD I CHKTMP	/LAST SHOULD BE 7777
	IAC
	SNA CLA
	ISZ CHKPAR
CHKEXT, CDF 10
	JMP I CHKPAR

CHKTMP, 0

	PAGE
/CHECK FOR /P OPTION AND SETUP INPUT INFO
/IF SO.

SLSHP,	0
	TAD I (MPARAM+1 /GET CD PARAMETER WORD
	AND (400	/MASK P BIT OUT
	SNA CLA 	/SKIP IF /P SPECIFIED
	JMP I SLSHP	/NOPE: JUST RETURN
	TAD I (7617	/NOW CHECK SIZE FOR 62(8)=50(10)
	AND (7760	/MASK -LENGTH
	TAD (70-6 20
	SZA CLA 	/SKIP IF SIZE O.K.
	JMP I SLSHP	/IS NOT A /P FILE
	TAD I (IBOOT	/IS PROBABLY A /P FILE
	DCA I (IPARAM	/SINCE NO PARAMETER BLOCK PRESENT
	TAD I (IBOOT	/GET AGAIN
	TAD (22+22-1	/CALC START OF CD
	DCA I (IDECODE	/START OF CD BLOCKS
	TAD (70-22-5	/THIS WOULD BE SIZE IF NOT FROM PIP
	JMP I (CDL2	/AND RETURN


/THIS ROUTINE CHECKS FOR A SPECIFIC PATHOLOGICAL CASE.
/NAMELY THE CASE WHERE A HANDLER IS RESIDENT WITH THE
/SYSTEM HANDLER BUT NOT DSK.  THE CASES WHERE THIS IS
/TRUE IS FOR DTA0,LTA0, AND RKA0 WHEN THE SYSTEM DEVICE
/CORRESPONDS, AND FOR DTA1, RKA1, AND PERHAPS OTHERS
/IN THE CASE OF ROM'S OR FANCY NEW HANDLERS.
/SINCE THERE IS NO WAY TO CORRECT FOR THE LATTER CASE-THIS
/ROUTINE MAKES THE PAIR /H/B OCCURR TOGETHER FOR SUCH CASES.

CHKRES, 0
	TAD SLASHB	/WISH TO DO XOR BETWEEN /B AND /H
	SZA CLA 	/SET ALL BITS IF /B ON
	STA		//B ON
	DCA SLASHB	/SAVE
	TAD SLASHH	/NOW MAKE A 1 IF /H ON
	SZA CLA
	IAC		/SO WE CAN DO XOR
	TAD SLASHB	/AC=0 IF /B=/H
	SNA CLA 	/SKIP IF /B XOR /H = TRUE
	JMP I CHKRES
	TAD (-16	/WE HAVE TO CHECK FOR ANYONE ELSE RES
	DCA CKRESC	/CHECK 15 HANDLERS
	TAD (DHRES+1	/PAST DSK
	DCA CKRESP	/SAVE POINTER
	CDF 0		/TO FIELD OF TABLE
CKRES1, ISZ CKRESC	/DONE
	SKP		/NOT YET
	JMP CKRES2	/YEP
	ISZ CKRESP	/POINT TO NEXT
	TAD I CKRESP	/GET RESIDENCY WORD
	SNA		/SKIP IF RESIDENT
	JMP CKRES1	/LOOP
	TAD (-7607	/THESE NON-FATAL
	SZA CLA 	/SKIP IF NON-FATAL
	JMS CKRESF	/CAN'T ALLOW THESE
	DCA I CKRESP	/MAKE IT NON-RESIDENT
			/NOTE THAT THE OTHER TABLES ARE
			/SET UP JUST LIKE IT IS NON-RES.
			/SO THIS WILL FIX FOR MOST CASES.
	JMP CKRES1	/LOOP
		/NOW IT IS TIME TO SEE IF WE HAVE A
		/DTA0,LTA0,OR RKA0
CKRES2, TAD (3400+SDNAME+1
	DCA CKRESP	/POINT TO PERM NAMES
	TAD (-16	/CHK 15 NAMES
	DCA CKRESC
	DCA CKREST	/CLEAR COUNTER
CKRES3, ISZ CKRESC	/SKIP WHEN DONE
	SKP
	JMP CKRESE	/EVERYTHING O.K.
	ISZ CKRESP	/POINT TO NEXT
	ISZ CKREST	/COUNT DEVICES
	TAD I CKRESP	/PICK UP NAME
	XXX="D+"A 100+"T+"0-500&3777+4000
	TAD (-XXX	/CHK AGAINST DTA0
	SNA		/SKIP IF NOT DTA0
	JMP CKRES4	/IS DTA0
	YYY="L+"A 100+"T+"0-500&3777+4000
	TAD (-YYY+XXX	/CHECK FOR LTA0
	SNA		/SKIP IF NOT LTA0
	JMP CKRES4	/IS LTA0
	XXX="R+"A 100+"K+"0-500&3777+4000
	TAD (-XXX+YYY	/CHK FOR RKA0
	SZA CLA 	/SKIP IF RKA0
	JMP CKRES3	/LOOP ON DEVICES
CKRES4, TAD CKREST	/IS DEVICE#-1
	TAD (TDCB+1	/INDEX INTO DCB TABLE
	DCA CKRESX	/STASH POINTER
	TAD I CKRESX	/GET DCB WORD
	CIA		/NEGATE FOR CHECK AGAINST
	TAD I (TDCB	/SYS.
	SZA CLA 	/SKIP IF A MATCH
	JMP CKRES3	/NO: LEAVE NON-RESIDENT
	TAD CKREST	/GET INDEX AGAIN
	TAD (DHRES+1	/POINT TO RESIDENCY TABLE
	DCA CKRESX	/FOR INDIRECT
	TAD (7607	/DEVICE=SYS HANDLER
	DCA I CKRESX
	JMP CKRES3	/AND CONTINUE CHECKING
CKRESE, CDF 10		/BACK TO THIS FIELD
	JMP I CHKRES	/BEFORE RETURNING

/COME HERE WHEN RESIDENT NON-SYSTEM DEVICE FOUND.
/IS PROBABLY TD8E ROM DTA1 - BUT MIGHT BE DEC NON-STANDARD.

CKRESF, 0
	CDF 10		/BACK TO THIS FIELD
	TAD I (MPARAM+1 /CHECK FOR /O OPTION
	AND (1000	/MASK IT
	SNA CLA 	/SKIP IF /O SET
	JMP .+3 	/GIVE HIM THE MESSAGE
	CDF 0		/OVERRIDE ABORT
	JMP I CKRESF	/RETURN
	JMS I (PRMSG	/TELL HIM ABOUT IT
	 MRES1		/A CORE-RESIDENT HANDLER EXISTS WITH
	JMS I (PRMSG
	 MRES2
	JMS I (PRMSG
	 MRES3
	JMS I (PRMSG
	 MRES4
	JMS I (PRMSG
	 MRES5
	JMP I (STOVER

CKRESP, 0
CKRESC, 0
CKREST, 0
CKRESX, 0

	PAGE
/ERROR ROUTINES

NOFILE, JMS I (PRMSG
	 MNOFILE
	JMP STOVER


NOROOM, JMS I (PRMSG
	 MNOROOM
	JMP STOVER


BADFIL, JMS I (PRMSG
	 MBADFIL
	JMP STOVER


BADSIZ, JMS I (PRMSG
	 MBADSIZ
	JMP STOVER


NOSYS,	JMS I (PRMSG
	 MNOSYS
	JMP STOVER


BADCD,	JMS I (PRMSG
	 MBADCD
	JMS I (PRMSG
	 MBADCE
	JMP STOVER

NOOPT,	JMS I (PRMSG
	 MNOOPT
	JMS I (PRMSG
	 MOPTB
	JMS I (PRMSG
	 MOPTH
	JMS I (PRMSG
	 MOPTS
	JMS I (PRMSG
	 MOPTY
	JMS I (PRMSG
	 MOPTC
STOVER, JMS I (CRLF
	JMP I (SYSSWP


	PAGE
/ERROR MESSAGES

MNOROO, TEXT  NO ROOM FOR OUTPUT FILE
MBADFI, TEXT  DEVICE NOT FILE STRUCTURED
MNOSYS, TEXT  INPUT DOES NOT HAVE A SYSTEM
MBADSI, TEXT  OUTPUT SIZE TOO SMALL
MNOFIL, TEXT  OUTPUT FILE MUST EXIST IF NOT  /Y
MBADCD, TEXT  BAD CD LINE - MISSING SPECIFICATIONS
MBADCE, TEXT  BOTH INPUT AND OUTPUTS MUST BE SPCIFIED
MNOOPT, TEXT  NO OPTION SPECIFIED. OPTIONS ARE:
MOPTB,	TEXT   /B CHANGE SYSTEM HANDLER
MOPTH,	TEXT   /H CHANGE HANDLERS
MOPTS,	TEXT   /S CHANGE SYSTEM
MOPTY,	TEXT   /Y = (BHS)
MOPTC,	TEXT   ANY COMBINATION OF ABOVE IS LEGAL
MRES1,	TEXT  A CORE-RESIDENT HANDLER EXISTS WITH ENTRY
MRES2,	TEXT  OTHER THAN 7607.	PROBABLY DTA1 FOR TD8E ROM
MRES3,	TEXT  SYSTEM.  FOR THIS CASE  /H AND /B MUST ACCOMPANY
MRES4,	TEXT  EACH OTHER (OR /O WILL OVERRIDE, MAKING DEVICE
MRES5,	TEXT  NON-RESIDENT).  OPERATION ABORTED THIS TIME.

$$$$$$$



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search