Google
 

Trailing-Edge - PDP-10 Archives - k20v7a - utilities/copyfe.mac
There is 1 other file named copyfe.mac in the archive. Click here to see a list.
	SALL
	TITLE COPYFE
	SEARCH MONSYM,MACSYM
	.REQUIRE SYS:MACREL
;
;	THIS PROGRAM TRIES TO RESTORE A FRONT-END SYSTEM IN PLACE
;
;	IT NEEDS A FILE , WRITTEN BY 'FEREAD' , WHICH HOLDS:
;	PAGE 0 == COPIES OF ORIGINAL BLOCKS 0 TO 4
;		BLOCK 0 BEING USED AS THE BOOTS-BLOCK
;	PAGE 1 == LENGTH-WORD OF FDB OF ORIGINAL FE-FILE
;	PAGE 2 == COPY OF FIRST INDEX-BLOCK OF ORIGINAL FILE
;		USED TO CHECK BEGINNING LOCATION
;
;	THE FILE TO BE COPIED IS READ PAGE BY PAGE VIA DSKOP'S
;	USING ADRESSES OBTAINED FROM SUPER-INDEX-BLOCK ,WHICH
;	IN TURN POINT TO INDEX-BLOCKS , AND THEIR ENTRIES POINT
;	TO THE 'REAL' PAGES.
;
;	THE FILE IS READ WITHOUT ERROR-RECOVERY , TO BE ABLE TO
;	DETECT HARD- OR SOFT-ERRORS. IN CASE OF HARD ERRORS , THE
;	COPYING PROCESS IS ABOLISHED.
;
;	THE SO FILLED PAGES ARE DSKOPED INTO THE FE-FILE INTO
;	SUCCESSIVE PAGES UNDER THE ASSUMPTION THAT THIS FILE
;	IS CONTIGUOUS.
;
;	IN CASE OF NO HARD-ERRORS THE BOOT-BLOCK IS COPIED AS
;	THE LAST OPERATION.
;
;	FLOW AND GENERAL HINTS:
;
;	STARTING POINT IS 'START' WHICH ASKS FOR STRUCTURE-FILE
;	OF ORIGINAL FE-SYSTEM AND BUILDS PARAMETERS FOR DSKOP.
;	HERE WE ALSO LOOK FOR THE 'OTHER' FILE 'FRONT-END-BOOT.BIN'
;	WHICH IS EXPECTED IN THE LOGGED-IN AREA.
;
;	LABEL CHECK1: COMPARES LENGTH OF ORIGINAL AND 'EMPTY' FILE
;	LABEL DOPT:   ROLLS SUCCESSIVE INDEX-BLOCKS INTO IDXPAG
;	LABEL DOPAG:  ROLLS IN SUCCESSIVE DATA-PAGES INTO DATPAG
;	LABEL BOOT:   WRITES THE BOOT-BLOCK
;	SETUP:	      SUB FOR DSKOP
;	LABEL DSKOUT:	WRITES TIMES-PAGES OUT TO FE-FILE
;	TIMES	      CLUSTER-COUNT FOR MAPPING
;
A==1			;JSYS-AC'S
B==2
C==3
D==4			;3 WORDS OUT OF FDB
W==5
W1==6
W2==7			;STR-DESIGNATOR FOR DSKOP
PTT==10			;HOLDS AOBJN POINTER INTO SUPER-INDEX-BLOCK
PT==11			;HOLDS AOBJN POINTER INTO INDEX-BLOCK
JFN==12			;WHERE TO SAVE THE JFN
JFN0==13		;HERE TO SAVE JFN OF COPY-FILE
COUNT==14		;READ/WRITE AOBJN COUNTER
MAPCNT==15		;PMAP COUNTER
DSKCNT==16		;COUNTER FOR SUCCESSIVE DSKOP-WRITES
P==17			;PDL

PDL:	BLOCK 10
FDBNEW: BLOCK 3		;FOR COMPARISON
CORDAT:	BLOCK 1		;DSKOP-WRITE CORE-ADRESS
DSKADR:	BLOCK 1		 ;DSK-ADRESS TO WRITE INTO (CONTIGUOUS)
LSTDSK:	BLOCK 1		;LAST DISK ADRESS FOR DSKOP
ERRTYP:	BLOCK 1		;LAST ERROR INDICATION FROM DSKOP
HRDERR:	BLOCK 1		;HARD ERROR INDICATOR
BUFFER:	BLOCK 11	;STR-NAME FOR ORIGINAL FILE
BUFF1:	BLOCK 11	;STR-NAME FOR COPY-DISK
BOOTPG==10000		;3 PAGES OF 'FRONT-END-BOOT.BIN'
BOOTNR==BOOTPG/PAGLEN
ORGPTR==13000		;FOR COMPARISON
IDXPAG==14000		;PAGE OF SUPER-INDEX-BLOCK
PTPAGE==15000		;PAGE FOR INDEX-BLOCK
DATPAG==16000		;WHERE FILE DATA GOES
PAGNR==DATPAG/PAGLEN	;THE PAGE-NR
PAGLEN==1000
TIMES==^D5		;THE REPEAT COUNT FOR DSKOP'S

	RELOC 1000-140



FILOUT:	TXNN JFN,GJ%DEV!GJ%DIR!GJ%NAM!GJ%EXT!GJ%VER
	RET			;NO. DON'T DO NAME THEN
	MOVEI A,.PRIOU
	MOVEI B,0(JFN)
	SETZ C,			;OUTPUT THE NAME
	JFNS			;DO IT
	HRROI A,[ASCIZ /
/]
	PSOUT
	RET

;	SUBROUTINE TO DSKOP PAGES TO FE-FILE

DSKOUT:MOVEI A,DATPAG-PAGLEN	;RESET CORE ADRESS
	MOVEM A,CORDAT		;AND STORE
	MOVSI DSKCNT,-TIMES	; X-TIMES OVER
DSKLOP:MOVE A,DSKADR		;ADRESS TO WRITE INTO
	ADDI A,4		;(CONTIGUOUS)!!
	MOVEM A,DSKADR		;
	MOVEI B,.DOPSR		;STR-RELATIVE ADRESSING
	STOR B,DOP%AT,A		;STORE IT
	SETONE DOP%SN,A		;DEVICE DESIGNATOR IN D
	MOVX B,DOP%WR!1000B35	;WRITE ONE PAGE
	MOVE D,DESIG		;STRUCTURE
	MOVE C,CORDAT		;FROM WHERE
	ADDI C,PAGLEN		;OUT OF OUR CORE
	MOVEM C,CORDAT		;FOR NEXT GO-AROUND
	DSKOP			;DO IT
	AOBJN DSKCNT,DSKLOP	; X-TIMES OVER
	RET

;	SUBROUTINE FOR DSKOP OUT OF ORIGINAL FILE

;	A == DISK-ADRESS
;	C == TARGET (MEMORY) ADRESS
;	W2 == STRUCTURE NUMBER

SETUP:	MOVEM A,LSTDSK		;SAVE DISK ADDRESS
	MOVEI B,.DOPSR		;STR RELATIVE ADDRESSING
	STOR B,DOP%AT,A		;STORE IT
	SETONE DOP%SN,A		;SAY DEVICE DESIGNATOR IN D
	MOVEI B,PAGLEN
	TXO B,DOP%IR		;INHIBIT ERROR RECOVERY
	MOVE D,W2		;DEVICE DESIGNATOR
	SETZM ERRTYP		;ASSUME NO ERROR
	DSKOP			;DO IT
	JUMPN A,[ MOVE A,LSTDSK	;GET LAST DISK ADDRESS AGAIN
		SETONE DOP%SN,A
		MOVEI W,.DOPSR
		STOR W,DOP%AT,A	;SET UP NEW ARGS
		TXZ B,DOP%IR	;ALLOW ERROR RECOVERY THIS TIME
		DSKOP		;TRY IT AGAIN
		MOVEM A,ERRTYP	;REMEMBER THE ERROR
		RET]		;RETURN WITH CODE IN A
	RETSKP			;NO

PRTDSC:	HRROI A,[ASCIZ / DISK ADDRESS /]
	PSOUT
	MOVEI A,.PRIOU
	MOVE B,LSTDSK
	MOVEI C,10
	NOUT
	 JFCL
	HRROI A,[ASCIZ /
/]
	PSOUT
	RET



START:	RESET			;GET A CLEAN SLATE
	SETZB MAPCNT,COUNTM
	SETZM HRDERR
	MOVE P,[IOWD 10,PDL]
	HRROI A,[ASCIZ /
COPY  AND VERIFY (FROM) : /]
	PSOUT
	MOVX A,GJ%OLD!GJ%FNS!GJ%SHT!GJ%CFM!GJ%IFG
	MOVE B,[.PRIIN,,.PRIOU]
	GTJFN			;GET THE FILE
	JRST [	JSERR
		JRST START]	
	MOVE JFN,A		;SAVE SOURCE JFN
FILLOP:	CALL FILOUT		;PRINT NAME IF APPROPRIATE
START2:	HRROI A,[ASCIZ /
(TO) FILE : /]
	PSOUT
	MOVX A,GJ%OLD!GJ%FNS!GJ%SHT!GJ%CFM!GJ%IFG
	MOVE B,[.PRIIN,,.PRIOU]
	GTJFN
	  JRST [JSERR
		 JRST START2]
	MOVE JFN0,A		;SAVE DEST-JFN
	MOVE B,A		;MOVE JFN
	HRROI A,BUFF1		;WHERE STR-NAME GOES
	MOVX C,1B2		;DEVICE NAME ONLY
	JFNS
	HRROI A,BUFF1		;GET STR-NAME
	STDEV			;DEST-FILE
	 JRST [JSERR
		  JRST START]
	MOVEM B,DESIG#		;SAVE DESIGNATOR DEST-FILE
	MOVEI A,0(JFN0)
	MOVX B,^D36B5!OF%WR!OF%RD
	OPENF			;OPEN DEST FILE
	 JRST [JSERR
		 JRST START2]
	MOVEI A,0(JFN)		;GET THE JFN
	MOVE B,[3,,.FBCTL]	;READ 3 FDB WORDS
	MOVEI C,D		;INTO THE REGS
	GTFDB			;FROM SOURCE-FILE

;GET STRUCTURE NAME FOR DSKOP

	MOVE B,A		;MOVE THE JFN
	HRROI A,BUFFER		;WHERE TO PUT STRUCTURE NAME
	MOVX C,1B2		;DEVICE NAME ONLY
	JFNS			;DO IT
	HRROI A,BUFFER		;GET STR NAME
	STDEV			;GET DEVICE DESIGNATOR SOURCE FILE
	 JRST [	JSERR
		JRST START]	;
	MOVE W2,B		;SAVE DESIGNATOR SOURCE FILE
	MOVX A,GJ%OLD!GJ%SHT
	HRROI B,[ASCIZ /DSK:FRONT-END-BOOT.BIN
/]
	GTJFN
	 JRST [	JSERR
		JRST START]
	MOVEM A,INJFN#		;SAVE JFN COMPARE JFN
	MOVX B,^D36B5!OF%RD
	OPENF
	 JRST [	JSERR
		JRST START]
	HRLZ A,INJFN
	HRLZI B,.FHSLF
	HRRI	B,BOOTNR
	MOVX C,PM%CNT!PM%RD!3B35
	PMAP
	MOVEI A,0(JFN0)
	MOVE B,[1,,.FBBYV]
	MOVEI C,FDBNEW
	GTFDB
	MOVE A,FDBNEW		;GET LENGTH DEST-FILE
	TLZ A,777777
	HRRZ B,BOOTPG+PAGLEN
CHECK1:	CAMGE A,B		;COMPARE LENGTH OF BOTH FILES
		JRST[HRROI A,[ ASCIZ /
? FRONT-END-FILE-SYSTEM.BIN OF DIFFERENT LENGTH,
  CANNOT RESTORE
/]
			PSOUT
			JRST DONE1]
	MOVEI A,0(JFN0)
	MOVE B,[3,,.FBCTL]
	MOVEI C,FDBNEW
	GTFDB
	TXNN D,FB%LNG		;IS SOURCE A LONG FILE?
	JRST [	MOVEM W1,IDXPAG	;NO. SAVE ONLY XB ADDRESS
		MOVSI PTT,-1	;ONLY LOOK AT ONE ENTRY
		JRST DOPT0]	;AND GO PROCESS THE PTT
	MOVE A,W1		;GET DISK ADDRESS
	MOVEI C,IDXPAG		;WHERE ITS GOING
	CALL SETUP		;GO SET UP ARGS AND DO OPERATION
	 JRST [	HRROI A,[ASCIZ /
?HARD ERROR READING SUPER-INDEX-POINTER/]
		SKIPN ERRTYP	;WAS IT REALLY HARD?
		HRROI A,[ASCIZ /
%RECOVERABLE ERROR READING SUPER-INDEX-POINTER/]
		PSOUT
		SKIPE ERRTYP
		SETOM HRDERR	;MARK HARD ERROR
		CALL PRTDSC
		SKIPN ERRTYP	;HARD ERROR
		JRST .+1	;NO. GO ON
		JRST START]

	MOVSI PTT,-PAGLEN		;DO ALL PTT'S
DOPT0:	MOVEI COUNT,DATPAG-PAGLEN
	MOVEM COUNT,DATA#	;SETUP ORIGINAL DSKOP-POINTER
	MOVSI COUNT,-TIMES	;AND AOBJN POINTER
DOPT:	MOVSI PT,-PAGLEN		;DO ALL OF THIS PT
	SKIPN A,IDXPAG(PTT)	;GET PAGE TABLE ADDRESS
	JRST DOPT1		;NONE HERE.
	TLZ A,777000		;IGNORE CHECKSUM
	JUMPE A,DOPT1		;SKIP IT IF NOTHING HERE
	MOVEI C,PTPAGE		;WHERE TO PUT IT
	CALL SETUP		;GET IT
	 JRST [	HRROI A,[ASCIZ /
?HARD ERROR READING INDEX-BLOCK # /]
		SKIPN ERRTYP	;WAS IT REALLY HARD?
		HRROI A,[ASCIZ /
%RECOVERABLE ERROR READING INDEX-BLOCK # /]
		PSOUT
		SKIPE ERRTYP
		SETOM HRDERR	;MARK HARD ERROR
		MOVEI B,0(PTT)
		MOVEI A,.PRIOU
		MOVEI C,10
		NOUT
		 JFCL
		CALL PRTDSC
		SKIPN ERRTYP	;RECOVERABLE?
		JRST .+1	;YES. PROCEED
		JRST DOPT1]
DOPAG:	SKIPN A,PTPAGE(PT)	;DO NEXT DATA PAGE
	JRST DOP3		;NONE HERE
	TLZ A,777000		;IGNORE CHECKSUM
	JUMPE A,DOP3		;IF NOW ZERO, IGNORE IT
	MOVE C,DATA
	ADDI C,PAGLEN
	MOVEM C,DATA		;BUMP DSKOP POINTER
	MOVEM COUNT,COUNTM	;SAVE READ-POINTER
	CALL SETUP		;DO IT
	 JRST [	HRROI A,[ASCIZ /
?HARD ERROR READING PAGE # /]
		SKIPN ERRTYP	;REALLY HARD?
		HRROI A,[ASCIZ /
%RECOVERABLE ERROR READING PAGE # /]
		PSOUT
		SKIPE ERRTYP
		SETOM HRDERR	;MARK HARD ERROR
		MOVEI A,.PRIOU
		MOVEI B,0(PT)
		MOVEI C,10
		NOUT
		 JFCL
		HRROI A,[ASCIZ / OF INDEX-BLOCK # /]
		PSOUT
		MOVEI A,.PRIOU
		MOVEI B,0(PTT)
		NOUT
		 JFCL
		CALL PRTDSC
		PSOUT
		JRST DOP2]	;DO NEXT
DOP2:	AOBJN COUNT,DOP3	;GET PAGES VIA DSKOP
	MOVEM COUNT,COUNTM#	;SAVE COUNT FOR POSTERITY
	CALL DSKOUT		;WRITE BUNCH OF PAGES OUT
	MOVEI COUNT,DATPAG-PAGLEN
	MOVEM COUNT,DATA	;RESTORE ORIGINAL DSKOP-POINTER
	MOVSI COUNT,-TIMES
	SETZM COUNTM
DOP3:	TRNE PTT,-1		;FIRST SUPER-INDEX POINTER ?
	JRST DOP4		;NOPE
	TRNE PT,-1		;AND FIRST INDEX-POINTER ?
	JRST DOP4		;NOPE
	MOVE D,FDBNEW		;IS DEST-FILE LONG ??
	TXNN D,FB%LNG
	  JRST [HRROI A,[ASCIZ /
? DESTINATION FILE NOT A LONG FILE ????
/]
		PSOUT
		JRST DONE1]	;GIVE UP ,THIS IS FISHY !!
	PUSH P,W2		;SAVE W2
	MOVE W2,DESIG
	MOVEI C,ORGPTR		;WHERE WE WANT TO READ TO
	MOVE A,FDBNEW+2		;READ SUPER-INDEX BLOCK
	CALL SETUP
	 JFCL			;FOR THE TIME BEING
	MOVEI C,ORGPTR
	MOVE A,ORGPTR
	CALL SETUP		;AND FIRST INDEX-BLOCK
	 JFCL			;FOR THE TIME BEING
	POP P,W2
	MOVE A,ORGPTR		;GET FIRST PAGE-ADRESS FOR COMPARISON
CHECK2:	CAME A,BOOTPG+PAGLEN+PAGLEN
	JRST [HRROI A,[ ASCIZ /
? FRONT-END-FILE-SYSTEM.BIN DOES NOT START
  AT SAME ADRESS AS ORIGINAL , CANNOT RESTORE
/]
	PSOUT
	JRST DONE1]
	TLZ A,777000		;GET RID OF CHECKSUM
	SUBI A,4		;
	MOVEM A,DSKADR		;AND STORE FOR DSKOUT

; THESE ARE THE LOOPS OVER SUPER-INDEX AND INDEX-BLOCKS !!
;
DOP4:	AOBJN PT,DOPAG		;DO ALL OF THIS INDEX-POINTER
DOPT1:	AOBJN PTT,DOPT		;DO NEXT INDEX-BLOCK
	MOVEI A,DATPAG-PAGLEN	;BUILD CORE-ADRESS
	MOVEM A,CORDAT		;AND STORE
	MOVN DSKCNT,COUNTM	;BUILD REPITITION COUNT
	HRLZS DSKCNT
	CALL DSKLOP		;GET FINAL BUNCH OUT
DONE:	SKIPE HRDERR
	 JRST 	[HRROI A,[ASCIZ /
?COPYING PROCESS UNSUCCESSFUL , HARD ERROR!!
DELETE ORIGINAL AND GET IT BACK WITH DUMPER !!
? BOOTS NOT WRITTEN ,CORRECT PROBLEMS FIST !
/]
			PSOUT
			JRST DONE1]
	HRLZI A,10		;BLOCK 0 GETS BOOTS
	MOVEI B,.DOPSR		;STRUCTURE RELATIVE ADRESSING
	STOR B,DOP%AT,A		;STORE  IT
	SETONE DOP%SN,A		;SAY DEVICE  DESIGNATOR IN D
	MOVX B,DOP%WR!200B35	;ONE BLOCK ONLY,WRITE
	MOVE D, DESIG		;DEVICE DESIGNATOR
	MOVEI C,BOOTPG		;FROM BOOT-PAGE
BOOT:	DSKOP
	JFCL
	HRROI A,[ASCIZ /
BOOT WRITTEN
/]
	PSOUT
	HRROI A,[ASCIZ /

DONE!
/]
	PSOUT
DONE1:	SETO A,
	HRLI B,.FHSLF
	HRRI B,BOOTNR
	MOVX C,PM%CNT!3B35
	PMAP			;UNMAP OUR BOOT-FILE
	SETO A,
	CLOSF
	 JRST [JSERR
		 JRST START]
	HALTF
	JRST START		;START OVER IF CONTINUED
	END START