DataMuseum.dk

Presents historical artifacts from the history of:

Philips Data Systems

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Philips Data Systems

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦81920d7f7⟧

    Length: 42770 (0xa712)
    Notes: pts_type(SC)
    Names: »COPVOL.SC«

Derivation

└─⟦48601905a⟧ Bits:30009668 Philips computer tape "600121"
    └─⟦this⟧ »S:DU/COPVOL.SC« 
└─⟦79fbed147⟧ Bits:30009697 Philips computer tape "600414"
    └─⟦this⟧ »S:DU/COPVOL.SC« 
└─⟦d2a299635⟧ Bits:30009698 Philips computer tape "600415"
    └─⟦this⟧ »S:DU/COPVOL.SC« 

PTS(SC)

	IDENT COPVOL 	PRR 9.1 79-04-06  870136640910 

* 
***************************************** 
* 
*   PHILIPS TERMINAL SYSTEM PTS         * 
* 
*   *****TOSS UTILITIES*****
* 
*   COPVOL = COPY VOLUME                * 
* 
* 
* 
* 
* 
* 
***************************************** 
* 
* 
*	********
*	*COPVOL*
*	********
* 
* 
*	COPVOL WILL COPY A VOLUME TO A DISC FORMATTED WITH
*	THE CREATE VOLUME UTILITY.
*	OLD DISC CALLED DISC1 AND NEW DISC CALLED DISC2 
* 
* 
	EJECT			COPVOL			CRVOL 
* 
* 
*	********* 
*	*ENTRIES* 
*	********* 
* 
* 
	ENTRY	COPVOL 



* 
* 
*	*********** 
*	*EXTERNALS* 
*	*********** 
* 
* 
	EXTRN	BIDACR 
	EXTRN	BINACR 
	EXTRN	ADDMOD	DOUBLE PRECISION ADDITION 
	EXTRN	VOLNAM 
	EJECT			COPVOL			CRVOL 
* 
* 
*	*********** 
*	*KONSTANTS* 
*	*********** 
* 
* 
QVRECL	EQU	41	VTOC RECORD LENGTH
QVTBLF 	EQU	9	VTOC BLOCK FACTOR 
QBUF1L	EQU	4	BUF1 LENGTH IN SECTORS 
QBUF2	EQU	2	BUFFER 2
QPRFC	EQU	5	PRINTER FC
QFCIN	EQU	6	INPUT FC
QFCOUT	EQU	7	OUTPUT FC
QVOL1	EQU	8	INPUT VOLUME
QVOL2	EQU	14	OUTPUT VOLUME
QREORG	EQU	21	DISC REORGANIZE PARAMETER 
* 
FDFC	EQU	/F800	FIRST FLEX DISC FC 
* 
	EJECT			COPVOL			CRVOL 
* 
*	******
*	*DATA*
*	******
* 
BADNO2	DATA	0 
COUNTR	DATA	0	COUNTER IN READ11 
ENTRY2	DATA	0 
EXTNO	DATA	0
FEN2	DATA	0	FILE EXTENT NO DISC2
FILBAS	DATA	0	FILE EXTENT BASE
FILBLF	DATA	0	FILE BLOCKING FACTOR
FILLEN	DATA	0	FILE EXTENT LENGTH
FILRCL	DATA	0	FILE RECORD LENGTH
FILORG	DATA	0	FILE ORG
FILSEC	DATA	0	FILE LENGTH IN SECTORS
FEXB2	DATA	0	NEW FILE EXTENT BASE 
FEXL2	DATA	0	NEW FILE EXTENT LENGTH 
FILEXT	DATA	0 
FREBAS	DATA	0	FREE EXTENT BASE
FRELEN	DATA	0	FREE EXTENT LENGTH
LSTRN1	DATA	0,0	LAST RECORD NUMBER
NOCC	DATA	0 
NOSEC	DATA	0	NUMBERS OF SECTORS IN FILE 
REC1	DATA	0	RECORD NO IN VTOC SECTOR
SECNO	DATA	0	OFFSET IN SECREC TABLE 
SECTOR	DATA	0	SECTOR NO 
STACKP	DATA	0	STACK POINTER A14 VALUE 
TFILEN	DATA	0	TOTAL NUMBER OF SECTORS IN FILE TO COPY 
TOTFRE	DATA	0	TOTAL FREE LENGTH ON DISC 
* 
	EJECT			COPVOL 
* 
* 
VBAS1	DATA	0	VTOC1 BASE 
VBAS2	DATA	0	VTOC2 BASE 
VLEN1	DATA	0	VTOC1 LENGTH 
VLEN2	DATA	0	VTOC2 LENGTH 
VTSEC1	DATA	0	VTOC1 SECTOR WITH REC1
VLAST1	DATA	0	LAST SECTOR IN VTOC1
VLAST2	DATA	0	LAST SECTOR IN VTOC2
* 
ECB1	DATA	0,0 
	DATA	410	ECB FOR OLD DISC BUF1 
	DATA	0,0,0 
* 
ECB2	DATA	0,0	ECB FOR NEW DISC BUF2 
	DATA	410 
	DATA	0,0,0 
* 
ECB3	DATA	0,0	ECB FOR OLD DISC1 BUF2
	DATA	410 
	DATA	0,0,0 
* 
ECB4	DATA	0,0	ECB FOR NEW DISC2 BUF1
	DATA	410 
	DATA	0,0,0 
EXTSTP	DATA	EXTSTP
	DATA	0,0,0,0 
SECREC	DATA	SECREC
	DATA	0,0,0,0 
	EJECT			COPVOL			CRVOL 
* 
* 
READER	DATA	' 0READ ERROR'
QREADE	EQU	*-READER 
	DATA	0 
SECER	DATA	'  SECTOR NO: '
SEC	DATA	'      ' 
QSECER	EQU	*-SECER
	DATA	0 
FILER	DATA	'  FILE NAME: '
FILNAM	DATA	0,0,0,0 
QFILNM	EQU	*-FILER
	DATA	0 
DESREC	DATA	'  '
	DATA	'DESTROYED RECORDS:'
RECFR	DATA	'        ' 
	DATA	' TO '
RECTO	DATA	'        ' 
QDESR	EQU	*-DESREC
	DATA	0 
	EJECT			COPVOL 
* 
* 
INERR	DATA	/2030
	DATA	'INPUT DISC'
QINERR	EQU	*-INERR
* 
OUTERR	DATA	/2030 
	DATA	'OUTPUT DISC' 
QUOTER	EQU	*-OUTERR 
* 
PRECB	DATA	0,0,0,0,0,0
* 
	EJECT			COPVOL			CRVOL 
* 
*	********
*	*FFINCC*
*	********
* 
*	WRITE 'FF' IN ALL STATUS BITS IN VTOC1 WITH 'CC'
* 
FFINCC	EQU	*
* 
END010	LD	A4,VBAS1	VTOC1 BASE 
	LD	A10,VLEN1	VTOC1 LENGTH
	SUK	A4,1 
	ADR	A10,A4 
	ADK	A4,2 
	LDKL	A8,QVTBLF	GET VTOC BLOCK FACTOR 
	LDR	A9,A4
* 
END015	LDK	A7,/CC 
	CF	A14,SEFFE1
	CWR	A6,A7
	RF(NE)	COMRTN
	LDK	A7,/FF 
	SCR	A7,A1
	CF	A14,WRITE1
	RB	END010
* 
	EJECT			COPVOL			CRVOL 
* 
*	********
*	*FRENT2*
*	********
* 
*	TAKE FIRST FREE FILE ENTRY ON DISC2 TO BUF2 
*	INPUT   A9 = VBAS2+1
*	        A4 = FIRST SECTOR AFTER VTOC2 
*	OUTPUT  A2 POINT TO FIRST WORD IN RECORD
* 
FRENT2	EQU	*
CP1	EQU	* 
	LD	A2,QBUF2,A12	LOAD BUF2 ADDRESS
	LDKL	A3,400
	ADK	A2,2	SKIP CYLINDER ID
CP2	ADK	A2,QVRECL 
	SUK	A3,QVRECL
	LCR	A7,A2
	ANK	A7,/FF 
	RF(Z)	CP4
	ADK	A2,1	NEXT ENTRY
	SUK	A3,1 
	RB(P)	CP2	END OF SECTOR? 
CP3	ADKL	A9,1	NEXT SECTOR 
	CWR	A9,A4	LAST VTOC SECTOR 
	ABL(E)	RTN04	ERROR MESSAGE 
	CF	A14,READ2	READ NEXT VTOC SECTOR TO BUF2 
	RB	CP1 
CP4	SUK	A2,QVRECL 
* 
COMRTN	RTN	A14
* 
	EJECT			COPVOL			CRVOL 
* 
*	******* 
*	*FSAT2* 
*	******* 
* 
*	TAKE FIRST FREE EXTENT IN VTOC2 BUF2
*	OUTPUT A2 POINT TO FIRST FREE EXTENT LENGTH 
*	       A3 CONTAIN FRELEN
* 
FSAT2	EQU	* 
	LD	A2,QBUF2,A12	A2 POINTER IN BUF2 
	LDK	A4,50	50 ENTRIES IN FSAT 
	ADK	A2,4	POINT TO EXTENT LENGTH
* 
F1	LDR*	A3,A2	FREE EXTENT LENGTH
	RB(NZ)	COMRTN	FIRST FREE LENGTH? 
	ADK	A2,8	NEXT LENGTH 
	SUK	A4,1 
	RB(P)	F1	END OF SECTOR?
	ABL	RTN05	DISC OVERFLOW
* 
	EJECT			COPVOL			CRVOL 
* 
*	********
*	*MOVE12*
*	********
* 
*	MOVE FROM BUF1 TO BUF2
*INPUT	A1 POINT TO FIRST WORD IN BUF1 TO MOVE 
*	A2 POINT IN BUF2
*	A4 LENGTH IN WORDS
* 
MOVE12	EQU	*
* 
M1	LDR*	A3,A1 
	STR	A3,A2	STORE IN BUF2
	ADK	A1,2	NEXT WORD 
	ADK	A2,2 
	SUK	A4,1	A4 COUNTER OF WORDS 
	RB(P)	M1 
	RTN	A14
* 
	EJECT			COPVOL			CRVOL 
* 
*	********
*	*MOVERE*
*	********
* 
*	STORE NEW FILE EXTENT N0,  LENGTH,  BASE IN BUF2
*	LAST RECORD NO FROM EXTENT 1 TO BUF2
*OUTPUT  A1 RESP A2 POINT TO RECORD LENGTH
*INPUT   A1,A2 POINT TO FILE EXTENT NO
* 
*INPUT A3=NEW FILE EXTENT LENGTH
*      A4= "    "   "     BASE
*      A5= "    "   "     NO
*      A7=OLD LAST RECORD NO
* 
MOVERE	EQU	*
	STR	A5,A2	FILE EXTENT NO 
	ADK	A2,2 
	CMR	A2 
	ADK	A2,2 
	STR	A3,A2	FILE EXTENT LENGTH 
	ADK	A2,2 
	CMR	A2 
	ADK	A2,2 
	STR	A4,A2	FILE EXTENT BASE 
	ADK	A2,2 
	STR	A7,A2	LAST RECORD NO PART 1
	ADK	A2,2 
	LD	A7,LSTRN1+2	LAST RECORD NO PART 2 
	STR	A7,A2
	ADK	A2,2 
	ADK	A1,14
	RTN	A14
* 
	EJECT			COPVOL			CRVOL 
* 
*	********
*	*NXTFRE*
*	********
* 
*	TAKE NEXT FREE SECTOR ON VTOC2
* 
NXTFRE	EQU	*
	LDK	A4,50
*	TAKE NEXT FREE EXTENT 
NXT01	ADK	A2,4	NEXT EXTENT
	SUK	A4,1 
	ABL(N)	RTN05	END OF SECTOR?
	LDR*	A3,A2 
	ST	A3,FRELEN 
	ADK	A2,4 
	LDR*	A6,A2 
	ST	A6,FREBAS 
	CWR	A3,A7	FRELEN AND TFILEN
	RB(L)	NXT01
	LDR	A4,A6
	RTN	A14
* 
	EJECT			COPVOL			CRVOL 
* 
*	******* 
*	*PRINT* 
*	******* 
*	
*	INPUT A5=TEXT START ADDRESS 
*	      A6=TEXT LENGTH
* 
PRINT	EQU	* 
	LDKL	A8,PRECB
	ST	A5,PRECB+2
	ST	A6,PRECB+4
	LDK	A7,/86 
	LKM
	DATA	1 
	RTN	A14
* 
	EJECT			COPVOL			CRVOL 
* 
*	********
*	*READ11*
*	********
* 
*	READ FROM DISC1 TO BUF1 
*	BUF1 WILL CONTAIN QBUF1L SECTORS
*	INPUT A9=SECTOR NO
* 
READ11	EQU	*
	ST	A10,FILSEC
	LDK	A5,QBUF1L
* 
RD02	LDKL	A8,ECB1 
	LDK	A7,/91 
	ST	A9,ECB1+10	SECTOR NO
	LKM
	DATA	1 
	LDK	A7,/80 
	LD	A8,ECB1+8 
	TM	A7,A8 
	RB(NZ)	RD02	NEW VOLUME LOADED? 
	LDKL	A7,/8201
	TM	A7,A8 
	ABL(NZ)	RTNIE	ERROR MESSAGE
	LDK	A7,/E
	TM	A7,A8 
	RF(Z)	RD10 
* 
	EJECT			COPVOL			CRVOL 
* 
*	ERROR IN SECTOR 
* 
	ST	A9,SECTOR 
	ST	A5,COUNTR 
	LD	A8,NOSEC	NUMBER OF SECTORS IN FILE
	SU	A8,TFILEN	NO OF COPIED SECTORS
	ADKL	A8,QBUF1L 
	SUR	A8,A5	CORRECTION FOR LAST COPIED SECTORS 
	LD	A5,FILBLF 
	STR	A2,A14	SAVE A2-A4 ON STACK 
	SUKL	A14,6 
	ST	A3,2,A14
	ST	A4,4,A14
* 
*	COMPUTE RECORD NUMBERS OF DESTROYED RECORDS 
* 
	LDK	A1,0 
	LDR	A2,A8	GET NO OF COPIED SECTORS 
* 
RD05	SUK	A5,1 
	RF(Z)	RD06	FINISHED? 
	LDK	A6,0 
	LDR	A7,A8
	CF	A14,ADDMOD	DOUBLE PRECISION ADDITION
	RB	RD05
* 
	EJECT			COPVOL 
* 
* 
RD06	ADK	A2,1	RECORD NUMBER OF FIRST DESTROYED RECORD 
	RF(O)	RD30	JUMP IF OVERFLOW
* 
RD07	LDR	A7,A1	SAVE A1-A2 
	LDR	A9,A2
	LDKL	A3,RECFR	TO ADR 
	LDK	A4,7	LENGTH
	CF	A14,BINACR
	LDR	A1,A7	RESTORE A1-A2
	LDR	A2,A9
	LDK	A6,0 
	LD	A7,FILBLF	GET BLOCK FACTOR
	SUK	A7,1 
	CF	A14,ADDMOD	RECORD NUMBER OF LAST DESTROYED RECORD 
	LDKL	A3,RECTO	TO ADR 
	LDK	A4,7	LENGTH
	CF	A14,BINACR
* 
	EJECT			COPVOL			CRVOL 
* 
* 
	LD	A2,SECTOR 
	LDKL	A3,SEC
	LDK	A4,5 
	CF	A14,BIDACR
	LD	A4,4,A14	RESTORE A2-A4
	LD	A3,2,A14
	ADKL	A14,6 
	LDR*	A2,A14
	LDKL	A5,READER 
	LDK	A6,QREADE
	CF	A14,PRINT 
	LDKL	A5,SECER
	LDK	A6,QSECER
	CF	A14,PRINT 
	LDKL	A5,FILER
	LDK	A6,QFILNM
	CF	A14,PRINT 
	LDKL	A5,DESREC 
	LDK	A6,QDESR 
	CF	A14,PRINT 
* 
	EJECT			COPVOL			CRVOL 
* 
*	00 IN STATUS BITS IN BUF1 
* 
	LDR*	A1,A12	GET BUF1 ADDRESS 
	ADK	A1,2	SKIP CYLINDER ID
	LD	A7,FILRCL	FILE RECORD LENGTH
	LD	A5,FILBLF 	FILE BLOCKING FACTOR 
	ADR	A1,A7
	LDK	A6,0 
* 
RD08	SCR	A6,A1	00 TO STATUS BIT 
	ADR	A1,A7
	SUK	A5,1 
	RB(P)	RD08 
	LD	A5,COUNTR 
	LD	A9,SECTOR 
* 
RD10	ADKL	A9,1
	SUKL	A10,1 
	RF(Z)	RD15 
	SUK	A5,1 
	RF(Z)	RD20 
	LDKL	A7,410
	ADS	A7,ECB1+2
	ABL	RD02 
* 
RD15	SU	A9,FILSEC	RESET A9
	RF	RD21
* 
	EJECT			COPVOL			COPVOL
* 
* 
RD20	SUKL	A9,QBUF1L	RESET A9
RD21	EQU	*
	LD	A10,FILSEC
* 
RD22	LDR*	A7,A12	GET BUF1 ADDRESS 
	ST	A7,ECB1+2	RESET ECB1
	ST	A7,ECB4+2	RESET ECB4
	RTN	A14
* 
RD30	ADK	A1,1	OVERFLOW CORRECTION 
	ANKL	A2,/7FFF
	RB	RD07
* 
	EJECT			COPVOL			CRVOL 
* 
*	******* 
*	*READ1* 
*	******* 
* 
* 
READ1	EQU	* 
	LDKL	A8,ECB1 
* 
READ12	EQU	*
	LDK	A7,/91	READ WITH WAIT
	ST	A9,10,A8	SECTOR NO
	LKM
	DATA	1 
	LD	A7,8,A8	GET RETURN CODE 
	ANK	A7,/80 
	RB(NZ)	READ12	NEW VOLUME LOADED? 
	LD	A8,8,A8	GET RETURN CODE 
	ANKL	A8,/820F
	ABL(NZ)	RTNIE	ERROR MESSAGE
	RTN	A14
* 
* 
*	******* 
*	*READ2* 
*	******* 
* 
* 
READ2	EQU	* 
	LDKL	A8,ECB2 
	RB	READ12
* 
	EJECT			COPVOL			CRVOL 
* 
********
*SEFFE1*
********
* 
*	SEEK FIRST FILE ENTRY ON DISC1 WITH STATUS BIT=<A7> 
*	READ SECTOR TO BUF1 
*INPUT	A7=BIT TO COMPARE STATUS WITH
*	A8=BLOCKFACTOR IN VTOC
*	A9=FIRST SECTOR  TO READ
*	A10=LAST SECTOR  TO READ
*OUTPUT	A6 CONTAIN STATUS BIT 
*	A1 POINT TO STATUS BIT
* 
SEFFE1	EQU	*
* 
SE005	LDR	A1,A7	SAVE A7 
	LDR	A3,A8	SAVE A8
	CF	A14,READ1 
	LDR	A7,A1	SAVED VALUE TO A7
	LDR	A8,A3	SAVED VALUE TO A8
	LDR*	A1,A12	GET BUF1 ADDRESS 
	ADK	A1,QVRECL+2
* 
SE010	LDK	A6,0
	LCR	A6,A1	STATUS BIT TO A6 
	CWR	A6,A7
	RF(NE)	SE020	NOT EQUAL. NEXT 
	SUKL	A8,1
	RTN 	A14 
* 
	EJECT			COPVOL			CRVOL 
* 
* 
SE020	ADK	A1,QVRECL+1 
	SUKL	A8,1
	RB(P)	SE010	NEXT RECORD
* 
*	END OF SECTOR. NEXT SECTOR
* 
	ADKL	A9,1
	LDR	A8,A3	RESET RECORD COUNTER 
	CWR	A9,A10 
	RB(NG)	SE005	READ NEXT SECTOR
* 
*	END OF VTOC. NO MORE SECTORS LEFT 
* 
	RTN	A14
* 
	EJECT			COPVOL			CRVOL 
* 
*	********
*	*SEFFE2*
*	********
* 
*	SEEK FIRST FILE ENTRY DISC2 WITH STATUS=<A7>
*INPUT	SAME AS SEFFE1 
* 
SEFFE2	EQU	*
* 
FE005	LDR	A2,A7	SAVE A7 
	LDR	A3,A8	SAVE A8
	CF	A14,READ2 
	LDR	A7,A2	SAVED VALUE TO A7
	LDR	A8,A3	SAVED VALUE TO A8
	LD	A2,QBUF2,A12	A2 POINTER IN BUF2 
	ADK	A2,2	SKIP CYLINDER ID
* 
FE010	ADK	A2,QVRECL	POINT TO STATUS 
	LDK	A6,0 
	LCR	A6,A2	STATUS BIT TO A6 
	CWR	A6,A7
	RF(E)	FE020
*	STATUS NOT EQU
	ADK	A2,1 
	SUKL	A8,1
	RB(P)	FE010	NEXT RECORD
*	NEXT VTOC SECTOR
	ADKL	A9,1
	LDR	A8,A3	RESET RECORD COUNTER 
	CWR	A9,A10	END OF SECTORS? 
	RB(NG)	FE005	NO
* 
FE020	RTN	A14 
* 
	EJECT			COPVOL			CRVOL 
* 
*	********
*	*WRITE1*
*	********
* 
*	WRITE BUF1 ON DISC 1
*INPUT	A9=SEC TO WRITE
* 
WRITE1	EQU	*
	LDKL	A8,ECB1 
	LDK	A7,/95 
	ST	A9,ECB1+10
	LKM
	DATA	1 
*	TEST OF RETURN CODE 
	LD	A7,ECB1+8	RETURN CODE TO A7 
	ANK	A7,/80 
	RB(NZ)	WRITE1	NEW VOLUME LOADED? 
	LD	A8,ECB1+8	RETURN CODE TO A8 
	ANKL	A8,/820F
	ABL(NZ)	RTNIE	ERROR MESSAGE
	RTN	A14
* 
	EJECT			COPVOL			CRVOL 
* 
*	********
*	*WRITE2*
*	********
* 
* 
WRITE2	EQU	*
	LDKL	A8,ECB2 
* 
WRIT22	EQU	*
	LDK	A7,/95 
	ST	A9,10,A8	SECTOR NO
	LKM
	DATA	1 
*	TEST OF RETURN CODE 
	LD	A7,8,A8	GET RETURN CODE 
	ANK	A7,/80 
	RB(NZ)	WRIT22	NEW VOLUME LOADED? 
	LD	A8,8,A8	GET RETURN CODE 
	ANKL	A8,/820F
	ABL(NZ)	RTNOE1	ERROR MESSAGE 
	RTN	A14
* 
* 
*	********
*	*WRITE4*
*	********
* 
* 
WRITE4	EQU	*
	LDKL	A8,ECB4 
	RB	WRIT22
* 
	EJECT			COPVOL			CRVOL 
* 
*	********
*	*VTOSEC*
*	********
* 
*	TAKE SECTOR AND RECORD FROM TABLE SECREC. READ SECTOR  TO BUF1. 
*OUTPUT	A1 POINT TO FIRST WORD IN RECORD
*INPUT	A7=OFFSET IN SECREC
*	A6=RECORD LENGTH
* 
VTOSEC	EQU	*
	SUR	A9,A9
	LC	A9,SECREC,A7	SECTOR NO TO A9
	ST	A9,VTSEC1 
	LDK	A5,0 
	ADK	A7,1 
	LC	A5,SECREC,A7	REC TO A5
	ST	A5,REC1 
	CF	A14,READ1	READ SECTOR  TO BUF1
	LDR*	A1,A12	GET BUF1 ADDRESS 
	ADK	A1,2	SKIP CYLINDER ID
* 
L1	SUK	A5,1 
	RF(Z)	L2	RECORD FOUND
	ADK	A1,QVRECL+1
	RB	L1	NEXT 
* 
L2	RTN	A14
* 
	EJECT			COPVOL			CRVOL 
* 
*   ******
*   *LOCK*
*   ******
* 
*   LOCK INPUT,OUTPUT FLEXIBLE DISCS
* 
LOCK	EQU	*
	CM	ENTRY2	FLEX. DISC FLAG FOR BACK-UP VERSION
	LDK	A3,0	INPUT/OUTPUT DISC FLAG
	LDKL	A8,ECB1 
* 
LOC:10	LDR*	A1,A8	FC
	CCK	A1,FDFC
	RF(L)	LOC:50	NOT FLEX DISC 
	LDK	A7,/80	TEST STATUS 
	LKM
	DATA	1 
	LD	A2,8,A8	RET. CODE 
	RF(N)	LOC:20	NOT LOCKED
	LDR	A1,A2	SAVE RET. CODE 
	LDR	A3,A3
	RF(NZ)	LOC:15	OUTPUT DISC? 
	ANK	A2,/21 
	RF(NZ)	LOC:80	FATAL ERROR
	RF	LOC:20
* 
LOC:15	ANK	A2,1 
	RF(NZ)	LOC:80	NOT OPERABLE?
	ANKL	A1,/0200
	ABL(NZ)	RTN08	FD WRITE PROTECTED 
* 
	EJECT			COPVOL			COPVOL
* 
* 
LOC:20	LDK	A7,/A6	LOCK
	LKM
	DATA	1 
	LD	A2,8,A8	RET. CODE 
	ANK	A2,/7
	RF(NZ)	LOC:80	FATAL ERROR
	IM	ENTRY2	INDICATE FLEXIBLE DISC 
* 
LOC:50	LDR	A3,A3
	RF(NZ)	LOC:EN	OUTPUT DISC
	LDKL	A8,ECB2	OUTPUT DISC ECB 
	LDK	A3,1	INDICATE OUTPUT DISC
	RB	LOC:10
* 
LOC:80	LDR	A8,A2
	LDR	A3,A3
	ABL(Z)	RTNIE	INPUT I/O ERROR 
	ABL	RTNOE	OUTPUT I/O ERROR 
* 
LOC:EN	EQU	*
	RTN	A14
* 
	EJECT			COPVOL 
* 
* 
********
*PHREAD*
********
* 
* 
PHREAD	EQU	*	ROUTINE FOR PHYSICAL READ
	LDK	A1,QBUF1L	BUFFER SIZE IN NO OF SECTORS 
	LDR*	A4,A12	GET BUFFER ADDRESS 
	ST	A4,ECB1+2 
	LDK	A7,/91	PHYSICAL READ 
	LDKL	A8,ECB1	GET ECB1 ADDRESS
* 
PHR:05	CW	A11,ECB1+10	CHECK SECTOR NUMBER 
	RF(E)	PHR:15	COPYING FINISHED? 
	IM	ECB1+10	NO, INCREMENT SECTOR NUMBER 
	LKM
	DATA	1 
	LD	A2,ECB1+8	GET RETURN CODE 
	RF(Z)	PHR:10	READ OK?
	CF	A14,PHR:20	NO, CHECK OUT WHY
	LDKL	A8,ECB1	GET ECB1 ADDRESS
* 
PHR:10	ADS	A10,ECB1+2	GET NEXT BUFFER ADDRESS 
	SUK	A1,1 
	RB(P)	PHR:05	BUFFER NOT FILLED UP? 
	RTN	A14	BUFFER FILLED UP, RETURN 
* 
	EJECT			COPVOL 
* 
* 
PHR:15	NGR	A1,A1	INDICATE <= 8 SECTORS LEFT TO COPY 
	RTN	A14
* 
PHR:20	EQU	*	WRITE ON OPERATORS PRINT DEVICE
	LC	A3,1,A8	GET FILE CODE 
	CC	A3,ECB2+1	CHECK IF INPUT/OUTPUT 
	RF(E)	PHR:25	OUTPUT READ ERROR?
	LDK	A3,0	NO, INDICATE ERROR ON INPUT 
* 
PHR:25	ANKL	A2,/808B
	RB(NZ)	LOC:80	RETURN IF SERIOUS ERROR
	LD	A2,8,A8	GET RETURN CODE 
	ANKL	A2,/204 
	RF(Z)	PHR:35	ONLY RETRY BIT SET? 
	LD	A2,10,A8	GET SECTOR NUMBER
	LDR	A3,A3	NO 
	RF(Z)	PHR:40	INPUT ERROR?
	LDKL	A5,OUTERR 
	LDK	A6,QUOTER
* 
PHR:30	CF	A14,PRINT	PRINT 'INPUT' OR 'OUTPUT DISC'
	LDKL	A5,READER 
	LDK	A6,QREADE
	CF	A14,PRINT	PRINT 'READ ERROR'
	ST	A1,SAVEA1	SAVE A1 
* 
	EJECT			COPVOL 
* 
* 
	LDKL	A3,SEC
	LDK	A4,5 
	CF	A14,BIDACR	CONVERT SECTOR NO TO DECIMAL 
	LDKL	A5,SECER
	LDK	A6,QSECER
	CF	A14,PRINT	PRINT 'SECTOR NO: XXXXX'
	LDKL	A1,0	RESTORE A1 
SAVEA1	EQU	*-2	SAVE AREA A1 
	LDK	A7,/91	PHYSICAL READ 
* 
PHR:35	RTN	A14
* 
PHR:40	LDKL	A5,INERR
	LDK	A6,QINERR
	RB	PHR:30
* 
	EJECT			COPVOL 
* 
* 
********
*BASWRT*
********
* 
* 
BASWRT	EQU	*	ROUTINE FOR WRITE
	LDK	A1,QBUF1L	BUFFER SIZE IN NO OF SECTORS 
* 
BAS:05	LDKL	A8,ECB2	GET ECB ADDRESS 
	LDR	A9,A1	SAVE A1
	LDK	A7,/85	BASIC WRITE 
	LDR*	A4,A12	GET BUFFER ADDRESS 
	ST	A4,ECB2+2 
* 
BAS:10	IM	ECB2+10	INCREMENT SECTOR NUMBER 
	LKM
	DATA	1 
	ADS	A10,ECB2+2	GET NEXT BUFFER ADDRESS 
	SUK	A1,1 
	RB(P)	BAS:10	MORE SECTORS IN BUFFER? 
* 
	LDR	A1,A9	RESTORE A1 
	NGR	A9,A9
	ADS	A9,ECB2+10 
	LDR*	A4,A12	GET BUFFER ADDRESS 
	ST	A4,ECB2+2 
	LDK	A7,/91	PHYSICAL READ 
* 
	EJECT			COPVOL 
* 
* 
BAS:20	IM	ECB2+10	INCREMENT SECTOR NUMBER 
	LKM
	DATA	1 
	LD	A2,ECB2+8	GET RETURN CODE 
	RF(Z)	BAS:30	OK? 
	CF	A14,PHR:20	NO, CHECK OUT WHY
	LDKL	A8,ECB2	GET ECB2 ADDRESS
* 
BAS:30	SUK	A1,1 
	RB(P)	BAS:20	MORE SECTORS IN BUFFER TO CHECK?
	RTN	A14	NO, RETURN 
* 
	EJECT			COPVOL 
* 
* 
***** 
*IBM* 
***** 
* 
* 
IBM	EQU	*	OUTPUT DISC IS IBM FORMATTED
	LDK	A1,128 
	ST	A1,4,A8	SET IBM SECTOR LENGTH 
	LDKL	A9,6	SECTOR 7 
	CF	A14,READ2	READ VOLUME NAME
	LDKL	A8,ECB2	GET ECB2 ADDRESS
	LDK	A1,2 
	ADS	A1,2,A8	UPDATE BUFFER ADDRESS FOR VOLNAM 
	CF	A14,VOLNAM	ASK OPERATOR IF VOLUME OK
	ADK	A1,0	SET CR
	ABL(N)	RTN99	ABORT IF WRONG VOLUME 
	LDKL	A8,ECB2	GET ECB2 ADDRESS
	LD	A2,QBUF2,A12	GET BUF2 ADDRESS 
	ST	A2,2,A8	RESET BUFFER ADDRESS
	LDKL	A1,/8081	WRITE 'TOSS' IN VOLUME LABEL 
	ST	A1,34,A2
	LDKL	A1,/8283
	ST	A1,36,A2
	CM	10,A8	SECTOR 0
	LDK	A7,/95	WRITE 
	LKM
	DATA	1 
* 
	EJECT			COPVOL 
* 
* 
	LDK	A7,/B8	UNLOAD
	LKM
	DATA	1 
	LDK	A7,/A6	LOCK
	LKM
	DATA	1 
	LDKL	A1,410
	ST	A1,4,A8	SET TOSS SECTOR LENGTH
	RF	BACK00
* 
	EJECT			COPVOL 
* 
* 
********
*BACKUP*
********
* 
*	COPVOL, WITH NO REORGANIZING OF DISC
* 
BACKUP	EQU	*
* 
*	CHECK OUTPUT VOLUME 
* 
	LDKL	A8,ECB2	GET ECB2 ADDRESS
	LDK	A7,/80	TEST STATUS 
	LKM
	DATA	1 
	LD	A2,8,A8	RET. CODE 
	ANK	A2,/20 
	RB(NZ)	IBM	OUTPUT DISC IBM FORMATTED?
	CF	A14,READ2	READ OUTPUT VOLUME LABEL
	LDKL	A8,ECB2	GET ECB2 ADDRESS
	CF	A14,VOLNAM	ASK OPERATOR IF VOLUME OK
	ADK	A1,0	SET CR
	ABL(N)	RTN99	ABORT IF WRONG VOLUME 
* 
BACK00	EQU	*
	LDKL	A8,ECB1	GET ECB1 ADDRESS
	LD	A1,2,A8	GET BUFFER ADDRESS
	ADK	A1,2	SKIP CYLINDER ID
	LDR	A3,A12	GET PBLK ADDRESS
	ADK	A3,14	POINT TO NEW OUTPUT VOLUME NAME
	LDK	A5,3 
* 
	EJECT			COPVOL 
* 
* 
BACK05	LDR*	A4,A3	GET NEW VOLUME NAME 
	STR	A4,A1	STORE NEW VOLUME NAME
	ADK	A1,2 
	ADK	A3,2 
	SUK	A5,1 
	RB(P)	BACK05 
* 
	LD	A11,ENTRY2	GET FLEXIBLE DISC FLAG 
	RF(Z)	BACK07	NOT FLEXIBLE DISC?
	LDKL	A11,499	NO OF SECTORS ON FLEXIBLE DISC
	RF	BACK12
* 
BACK07	EQU	*
	ADK	A1,20
	LDR*	A11,A1	GET NO OF CYLINDERS
	LDK	A2,31
* 
BACK10	ADR*	A11,A1	COMPUTE NO OF SECTORS TO COPY
	SUK	A2,1 
	RB(P)	BACK10 
	SUKL	A11,1	LAST SECTOR NUMBER TO COPY
* 
BACK12	EQU	*
	LDKL	A10,410	SECTOR SIZE IN BYTES
	LDK	A1,QBUF1L	BUFFER SIZE IN NO OF SECTORS 
	LDK	A7,/91	PHYSICAL READ 
	LDKL	A8,ECB1	GET ECB1 ADDRESS
	CF	A14,PHR:10	READ 7 SECTORS 
	SUK	A1,1 
	ST	A1,ECB2+10
* 
	EJECT			COPVOL 
* 
* 
BACK15	CF	A14,BASWRT	WRITE 8 SECTORS
	CF	A14,PHREAD	READ 8 SECTORS 
	LDR	A1,A1
	RB(Z)	BACK15	REMAINING NO OF SECTORS >= 8? 
	ADK	A1,QBUF1L	NO 
	RF(Z)	BACK20	NO MORE SECTORS TO COPY?
	CF	A14,BAS:05	YES, WRITE REMAINING SECTORS 
* 
BACK20	LDKL	A8,ECB2	GET ECB2 ADDRESS
	LDK	A7,/80	TEST STATUS 
	LKM
	DATA	1 
	LD	A8,ECB2+8	GET RETURN CODE 
	ABL(NZ)	RTNOE	ERROR? 
	ABL	RTN99
* 
	EJECT			COPVOL			CRVOL 
* 
*	***************** 
*	* ENTRY  COPVOL * 
*	***************** 
* 
COPVOL	EQU	*
	ST	A14,STACKP	SAVE STACKPOINTER VALUE
	LDR*	A1,A12	GET BUF1 ADDRESS 
	ST	A1,ECB1+2	BUF1 ADR TO ECB1
	ST	A1,ECB4+2	BUF1 ADR TO ECB4
	LD	A2,QBUF2,A12	GET BUF2 ADDRESS 
	ST	A2,ECB2+2	BUF2 ADR TO ECB2
	ST	A2,ECB3+2	BUF2 ADR TO ECB3
	LC	A2,QPRFC,A12	LOAD PRINTER FC
	SC	A2,PRECB+1
	LC	A2,QFCIN,A12	INPUT FC 
	SC	A2,ECB1+1	FC3 TO ECB1+1 
	SC	A2,ECB3+1	FC3 TP ECB3+1 
	LC	A2,QFCOUT,A12	OUTPUT FC 
	SC	A2,ECB2+1	FC4 TO ECB2+1 
	SC	A2,ECB4+1	FC4 TO ECB4+1 
	CM	EXTNO 
	CF	A14,LOCK	LOCK IF FLEXIBLE DISCS 
* 
	EJECT			COPVOL			CRVOL 
* 
*	******
*	*TEST*
*	******
* 
*	COMPARE NAMES IN PBLK AND ON DISC 
* 
*	READ VL1 TO BUF1
* 
	SUR	A9,A9	SECTOR 0 
	CF	A14,READ1 
	LDR*	A1,A12	GET BUF1 ADDRESS 
	ADK	A1,2	SKIP CYLINDER ID
	LDR	A3,A12	A3 POINTER IN PBLK
	ADK	A3,8 
	LDK	A5,3	A5 COUNTER
* 
TST010	LDR*	A4,A3 
	CWR*	A4,A1	COMPARE ONE WORD
	ABL(NE)	RTN02	ERROR MESSAGE
	ADK	A3,2 
	ADK	A1,2 
	SUK	A5,1	END?
	RB(P)	TST010	NEXT
* 
	LC	A5,QREORG,A12	GET REORGANIZE PARAMETER
	ANK	A5,/FF 
	ABL(Z)	BACKUP	NO REORGANIZE? 
* 
	EJECT			COPVOL			CRVOL 
* 
*	READ VL2 TO BUF2
* 
	CF	A14,READ2 
	LD	A2,QBUF2,A12	LOAD BUF3 ADDRESS
	ADK	A2,2	SKIP CYLINDER ID
	LDK	A5,3	COUNTER 
* 
TST020	LDR*	A4,A3 
	CWR*	A4,A2	COMPARE ONE WORD
	ABL(NE)	RTN02	ERROR MESSAGE
	ADK	A3,2	A3 POINTER IN PBLK
	ADK	A2,2 
	SUK	A5,1 
	RB(P)	TST020	NEXT
* 
	EJECT			COPVOL			CRVOL 
* 
* 
	ADK	A2,26	POINT TO 'TO' ON DISC2 
	LDR*	A4,A2	'TO' TO A4
	CWK	A4,'TO'
	ABL(NE)	RTN06	FAULTY DISC FORMAT 
*DISC1
	LDR*	A3,A1	VTOC LENGTH 
	ST	A3,VLEN1
	ADK	A1,4 
	LDR*	A3,A1	VTOC BASE 
	ST	A3,VBAS1
*DISC2
	SUK	A2,26
	LDR*	A3,A2	VTOC LENGTH 
	ST	A3,VLEN2
	ADK	A2,4 
	LDR*	A4,A2	VTOC BASE 
	ST	A4,VBAS2
* 
	ADR	A3,A4	VTOC LENGTH+BASE 
	SUK	A3,1 
	LDR	A10,A3	LAST VTOC2 SECTOR IN A10
	ST	A10,VLAST2	LAST SECTOR IN VTOC2 
	EJECT			COPVOL			CRVOL 
*	CHECK STATUS BIT IN VTOC2 
	ADK	A4,1	SECTOR AFTER FREE SPACE ADM TAB 
	LDR	A9,A4
	LDKL	A8,QVTBLF	GET VTOC BLOCK FACTOR 
	LDK	A7,/FF 
	CF	A14,SEFFE2
*	ANY ENTRIES WITH /FF IN STATUS BIT? 
	CWR	A6,A7
	RF(NE)	TEST40	END OF VTOC2 
*	TEST FILE ORG. BADSPOT? 
TST30	SUK	A2,14	POINT TO BADSPOT
	LDK	A7,/42	'B' 
	CCR	A7,A2
	ABL(NE)	RTN03	NOT A BADSPOT. DISC NOT EMPTY
*	BADSPOT. END OF VTOC2 
*	WRITE FF IN ALL STATUS BITS WITH CC 
TEST40	CF	A14,FFINCC
* 
	EJECT			COPVOL			CRVOL 
* 
*	******
*	*VTOC*
*	******
* 
*	TAKE FIRST NOT COPIED FILE  ENTRY IN VTOC1. SEEK THROUGH
*	REST OF VTOC FOR ANY MORE FILE EXTENTS. FILE RECORD IS
*	STORED WITH VTOC SECTOR IN SECREC 
* 
VTOC01	LD 	A9,VBAS2	VTOC2 BASE TO A9
	CF	A14,READ2	READ VTOC2 BASE TO BUF2 
	LD	A2,QBUF2,A12	LOAD BUF2 ADDRESS
	LDK	A1,0 
	ADK	A2,4 
	LDK	A4,50	COUNTER OF ENTRIES 
* 
VTOC05	LDR*	A3,A2	FREE LENGTH TO A3 
	ADR	A1,A3
	ADK	A2,8	TAKE NEXT FREE LENGTH 
	SUK	A4,1 
	RB(P)	VTOC05	NEXT ENTRY
	ST	A1,TOTFRE	TOTAL FREE LENGTH ON DISC2
* 
	EJECT			COPVOL 
* 
* 
VTOC10	LD	A10,VLEN1	VTOC1 LENGTH
	CM	EXTNO 
	LD	A4,VBAS1	VTOC1 BASE 
	LDK	A5,QVRECL	VTOC RECORD LENGTH 
	SUK	A4,1 
	ADR	A10,A4 
	ST	A10,VLAST1	LAST VTOC SECTOR DISC1 
	ADK	A4,2	FIRST FILE ENTRY SECTOR 
*	SEEK FIRST FILE ENTRY WITH /FF IN STATUS BIT
	LDKL	A8,QVTBLF	VTOC BLOCK FACTOR 
	LDR	A9,A4
	LDK	A7,/FF	STATUS WORD 
	CF	A14,SEFFE1
	CWR	A6,A7	/FF IN STATUS BIT? 
	ABL(NE)	RTN00	NO MORE SECTORS TO COPY
*	CHECK FILE ORG
	SUK	A1,14
	LDK	A6,0 
	LDK	A7,/42	'B' TO A7 
	LCR	A6,A1	FILE ORG TO A6 
	CWR	A6,A7	'B' ?
	RF(NE)	VTOC20	NOT A BADSPOT
*	BADSPOT. BADSPOT STORED LAST IN VTOC. END OF VTOC 
	ABL	RTN00	NO MORE FILES TO COPY
* 
	EJECT			COPVOL 
*	TAKE BLOCKING FACTOR AND RECORD LENGTH
VTOC20	ST	A6,FILORG 
	SUK	A1,1 
	LDK	A6,0 
	LCR	A6,A1
	ST	A6,FILBLF 
	SUK	A1,2 
	LDR*	A6,A1 
	ST	A6,FILRCL 
	SUK	A1,10
	LDR*	A3,A1 
	ST	A3,TFILEN 
	SUK	A1,4	POINT TO FILE EXTENT NO 
	LDR*	A3,A1 
	ST	A3,EXTSTP+2 
	SC	A9,SECREC+2	SECTOR NO TO SECREC 
	LDK 	A6,QVTBLF 
	SUR	A6,A8	RECORD NO TO A6
	SC	A6,SECREC+3 
	SUK	A1,4 
	LDK	A2,6 
* 
VTOC22	LDR*	A3,A1 
	ST	A3,FILNAM,A2
	SUK	A1,2 
	SUK	A2,2 
	RB(NN)	VTOC22
	ADK	A1,2	START OF RECORD 
*	TAKE NEXT FILE ENTRY AND COMPARE NAMES
	LDR	A11,A8	A11 COUNTER OF RECORDS
	LDR	A2,A1	A2 POINTER IN VTOC 
	EJECT			COPVOL 
* 
* 
VTOC23	ADK	A2,QVRECL	REC LENGTH 
* 
VTOC24	ADK	A2,1	A2 POINT TO NEXT RECORD 
VTOC25	EQU	*
	SUKL	A11,1	COUNTER OF RECORDS
	RF(N)	VTOC30	READ NEXT SECTOR
	ADK	A2,QVRECL	STATUS BIT 
*	CHECK STATUS
	LDK	A7,/FF 
	CCR	A7,A2
	RB(NE)	VTOC24	NEXT 
*	CHECK FILE ORG
	SUK	A2,14
	LDK	A6,0 
	LDK	A7,/42	'B' 
	LCR	A6,A2	FILE ORG TO A6 
	CWR	A6,A7
	RF(E)	VTOC30	BADSPOT. NO MORE SECTOR IN VTOC1
*	COMPARE FILE ORG
	LD	A3,FILORG 
	CWR	A6,A3
	RF(E)	VTOC27 
	ADK	A2,14
	RB	VTOC24
*	COMPARE NAMES 
VTOC27	LDK	A6,4	COUNTER 
	SUK	A2,27
* 
	EJECT			COPVOL 
* 
* 
VTOC28	LDR*	A3,A1	FILE NAME1
	CWR*	A3,A2	FILE NAME2
	RF(NE)	VTOC50	NAMES NOT EQUAL
	ADK	A1,2 
	ADK	A2,2 
	SUK	A6,1 
	RB(P)	VTOC28 
	RF	STR010	NAMES EQUAL. STORE SECTOR  RECORD
*	NEXT SECTOR 
VTOC30	ADKL	A9,1	NEXT SECTOR
	LD	A10,VLAST1	LAST VTOC1 SECTOR
	CWR	A9,A10	LAST SECTOR?
	RF(G)	COPY10	LAST SECTOR 
*	READ NEXT SECTOR TO BUF2
	LDR	A3,A8	SAVE A8
* 
VTOC40	LDKL	A8,ECB3 
	LDK	A7,/91 
	ST	A9,ECB3+10	SECTOR NO
	LKM
	DATA	1 
	LD	A8,ECB3+8	RETURN CODE TO A8 
	ANKL	A8,/80
	RB(NZ)	VTOC40	NEW VOLUME LOADED? 
	LD	A8,ECB3+8	RETURN CODE TO A8 
	ANKL	A8,/820F
	ABL(NZ)	RTNOE1	ERROR MESSAGE 
	LDR	A8,A3	SAVED VALUE TO A8
	LDKL	A11,QVTBLF
	LD	A2,QBUF2,A12
	ADK	A2,2 
	RB	VTOC25
*	NAMES NOT EQUAL. RESET POINTERS TO RECORD START 
VTOC50	LDK	A3,4 
	CWR	A3,A6
	RF(E)	VTOC52 
* 
VTOC51	SUK	A1,2 
	SUK	A2,2 
	SUK	A3,1 
	CWR	A6,A3
	RB(NE)	VTOC51
* 
VTOC52	RB	VTOC23	TAKE NEXT RECORD 
* 
	EJECT			COPVOL			CRVOL 
* 
*	******* 
*	*STORE* 
*	******* 
* 
*	STORE FILE EXTENT NO IN TABLE EXTSTP,VTOC SEC NO AND  REC NO
*	IN TABLE SECREC 
*	TABLES ARE SORTED IN ASCENDING EXTENT NO ORDES
* 
STR010	LDK 	A3,QVTBLF 
	SUR	A3,A11 
	LD	A10,EXTNO 
	LDK	A7,2 
	ADS	A7,EXTNO 
	ADK	A2,6 
	LDR*	A7,A2	GET FILE EXTENT LENGTH
	ADS	A7,TFILEN
	SUK	A2,4	POINT TO FILE EXTENT NO 
	LDR*	A7,A2 
	LDR	A10,A10
	RF(Z)	STR040	TWO EXTENTS 
* 
	LDK	A6,2 
	CWR	A6,A10 
	RF(E)	STR030	THREE EXTENTS 
*	FOUR EXTENTS
	LD	A6,EXTSTP+6 
	CWR	A6,A7
	RF(G)	STR020	A6>A7 
	EJECT			COPVOL			CRVOL 
* 
*	A7>A6	STORE A7 LAST IN TABLE
	ST	A7,EXTSTP+8 
	SC	A9,SECREC+8 
	SC	A3,SECREC+9 
	RF	STR050	FOUR EXTENTS 
*	A6>A7 
STR020	ST	A6,EXTSTP+8 
	LD	A10,SECREC+6
	ST	A10,SECREC+8	MOVE A10 ONE WORD
*	THREE EXTENTS LEFT
STR030	LD	A6,EXTSTP+4 
	CWR	A6,A7
	RF(G)	STR035	A6>A7 
*	A7>A6 
	ST	A7,EXTSTP+6 
	SC	A9,SECREC+6 
	SC	A3,SECREC+7 
	RF	STR050
*	A6>A7 
STR035	ST	A6,EXTSTP+6 
	LD	A10,SECREC+4
	ST	A10,SECREC+6
	EJECT			COPVOL			CRVOL 
* 
*	TWO EXTENTS LEFT
STR040	LD	A6,EXTSTP+2 
	CWR	A6,A7
	RF(G)	STR045	A6>A7 
*	A7>A6 
	ST	A7,EXTSTP+4 
	SC	A9,SECREC+4 
	SC	A3,SECREC+5 
	RF	STR050
*	A6>A7 
STR045	ST	A7,EXTSTP+2 
	ST	A6,EXTSTP+4 
	LD	A10,SECREC+2
	ST	A10,SECREC+4
	SC	A9,SECREC+2 
	SC	A3,SECREC+3 
*	
STR050	SUK	A2,10
	LD	A3,EXTNO
	LDK	A7,6 
	CWR	A3,A7
	RF(E)	COPY10 
	SUK	A1,8	RESET A1
	ABL	VTOC23	NEXT
* 
	EJECT			COPVOL			CRVOL 
* 
*	******
*	*COPY*
*	******
* 
*	COPY THE FILE EXTENTS IN SECREC FROM DISC1 TO DISC2 
* 
COPY10	CM	FEN2	FILE EXTENT ON DISC2 
	CM	FEXL2	FILE EXTENT LENGTH DISC2
	LD	A6,TFILEN 
	ST	A6,NOSEC	NO OF SECTORS IN FILE
	LD	A7,TOTFRE 
	CWR	A6,A7	CHECK FOR DISC OVERFLOW
	ABL(G)	RTN05	ERROR MESSAGE 
	SUR	A7,A6
	ST	A7,TOTFRE 	REMAINING FREE LENGTH ON DISC2 
	LDK	A7,2 
	ST	A7,SECNO	OFFSET IN SECREC TABLE 
	CF	A14,VTOSEC	A1 POINT TO RECORD NO
*	FILE ENTRY:TAKE FILE EXTENT LENGTH,  BASE AND LAST RECORD NO
COPY12	ADK	A1,14
	LDR*	A10,A1	FILE EXTENT LENGTH TO A10
	ST	A10,FILLEN
	ADK	A1,4 
	LDR*	A11,A1
	ST	A11,FILBAS	FILE EXTENT BASE 
	ADK	A1,2 
	LDR*	A3,A1	LAST RECORD NO PART 1 
	ST	A3,LSTRN1 
	ADK	A1,2 
	LDR*	A3,A1	LAST RECORD NO PART 2 
	ST	A3,LSTRN1+2 
*	READ FILE BASE TO BUF1
COPY14	LDR	A9,A11 
* 
COPY15	CF	A14,READ11
* 
COPY16	LD	A9,VBAS2
	CM	NOCC
	CF	A14,READ2 
	CF	A14,FSAT2	FREE EXTENT IN VTOC2
	ST	A3,FRELEN	FREE EXTENT LENGTH
	ADK	A2,4 
	LDR*	A4,A2 
	ST	A4,FREBAS	FREE EXTENT BASE
* 
COPY17	LD	A7,FEN2 
	SUK	A7,2 
	RF(N)	COPY18 
	LD	A7,TFILEN 
	CWR	A3,A7
	RF(NL)	COPY18
	CF	A14,NXTFRE
* 
COPY18	ST	A4,FEXB2
	LDK	A5,QBUF1L
*	WRITE BUF1 ON FREBAS DISC2
COPY20	LDR	A9,A4
	CF	A14,WRITE4
* 
	IM	FEXL2	ONE MORE SECTOR IN FILE EXTENT DISC2
* 
	LD	A7,TFILEN	TOTAL NO OF SECTORS TO COPY 
	SUK	A7,1 
	RF(E)	COPY25	LAST SECTOR TO COPY 
	ABL(N)	VTOC10	END OF SECTORS TO COPY 
	ST	A7,TFILEN 
* 
	EJECT			COPVOL 
* 
* 
*	UPDATE FREE EXTENT LENGTH AND BASE
	ADK	A4,1	FREBAS+1
	SUK	A3,1	FRELEN-1
	RF(Z)	COPY40 
*	UPDATE FILBAS AND FILLEN
	ADKL	A11,1	NEXT SECTOR  TO COPY
	SUKL	A10,1	REST OF LENGTH
	RF(Z)	COPY30 
*	READ NEXT SECTOR  TO COPY TO BUF1 
	SUK	A5,1 
	RF(Z)	COPY22 
	LDKL	A7,410
	ADS	A7,ECB4+2	UPDATE BUFFER ADDRESSES
	RB	COPY20
* 
	EJECT			COPVOL			CRVOL 
* 
* 
COPY22	LDR*	A7,A12	GET BUF1 ADDRESS 
	ST	A7,ECB4+2	RESET ECB4
* 
COPY23	EQU	*
	LDR	A9,A11 
	CF	A14,READ11
	LDK	A5,QBUF1L
	RB	COPY20
* 
COPY25	ST	A7,TFILEN 
	ADKL	A11,1	FILBAS+1
	SUKL	A10,1	FILLEN-1
	ADK	A4,1	FREBAS+1
	SUK	A3,1	FRELEN-1
	RF(Z)	COP401 
*	UPDATE BUF2 
	STR	A4,A2
	RF	COPY41
*	CC IN STATUS BIT
COPY30	LD	A7,SECNO
	CF	A14,VTOSEC
	ADK	A1,QVRECL
	LDK	A7,/CC 
	SCR	A7,A1
	CF	A14,WRITE1
* 
	EJECT			COPVOL			CRVOL 
* 
*	TAKE NEXT SECTOR NO 
	LD	A7,SECNO
	ADK	A7,2 
	ST	A7,SECNO
	CF	A14,VTOSEC
*	TAKE FILE BASE AND FILE LENGTH
	ADK	A1,14
	LDR*	A10,A1	FILE LENGTH TO A10 
	ADK	A1,4 
	LDR*	A11,A1	FILE EXTENT BASE 
	ST	A10,FILLEN
	ST	A11,FILBAS
*	READ FILBAS TO BUF1 
	RB	COPY23
*	UPDATE BUF2 
COPY40	ADKL	A11,1 
	SUKL	A10,1 
	IM	NOCC	NOT CC IN A1 FILE
* 
COP401	STR	A3,A2	FREBAS=0 
* 
COPY41	SUK	A2,4 
	STR	A3,A2
	EJECT			COPVOL			CRVOL 
*	WRITE BUF2 ON VTOC2 
	LD	A9,VBAS2
	CF	A14,WRITE2
* 
COPY42	IM	FEN2
	LD	A7,TFILEN 
	RF(Z)	COPY45 
	CF	A14,FSAT2	NEXT FREE EXTENT
	ST	A3,FRELEN 
	ADK	A2,4 
	LDR*	A4,A2 
	ST	A4,FREBAS 
	LD	A7,FEN2 
	SUK	A7,2 
	RF(N)	COPY45 
	LD	A7,TFILEN 
* 
COPY44	CWR	A3,A7	COMPARE FRELEN AND TOT SECTOR NO 
	RF(NL)	COPY45
	CF	A14,NXTFRE
* 
COPY45	LD	A7,SECNO
*	TAKE VTOC SECREC (OLD) AND READ SECTOR  TO BUF1 
	CF	A14,VTOSEC
	EJECT			COPVOL			CRVOL 
*	TAKE FIRST FREE FILE ENTRY ON DISC2 TO BUF2 
	LD	A9,VBAS2
	LD	A4,VLEN2
	ADR	A4,A9
	ADKL	A9,1
	CF	A14,READ2 
* 
COPY50	CF	A14,FRENT2
*	UPDATE FILE ENTRY ON DISC2
	LDK	A4,5 
	CF	A14,MOVE12
	LD	A5,FEN2	FREE EXTENT NO ON DISC 2
	SUK	A5,1 
	LD	A3,FEXL2	FREE EXTENT LENGTH 
	LD	A4,FEXB2	FREE EXTENT BASE 
	LD	A7,LSTRN1	LAST RECORD NO
	CF	A14,MOVERE
	LDK	A4,9 
	CF	A14,MOVE12
	SUK	A1,1 
	LD	A7,NOCC 
	RF(NZ)	COPY55	NOT CC TO STATUS BIT 
	LDK	A3,/CC	CHECK STATUS BIT
	SCR	A3,A1	'CC' TO STATUS BIT FILE1 
	EJECT			COPVOL			CRVOL 
COPY55	CF	A14,WRITE2
	LD	A9,VTSEC1 
	CF	A14,WRITE1
	CM	FEXL2	FILE EXTENT 2 LENGTH =0 
*	UPDATE FILBAS AND FILLEN
	LDR	A10,A10
	RF(Z)	COPY60 
*	READ FILBAS TO BUF1 
COPY58	LDR	A9,A11 
	CF	A14,READ11
	LDK	A5,QBUF1L
	LD	A4,FREBAS 
	LD	A3,FRELEN 
	ABL	COPY16 
* 
COPY60	LDK	A7,2 
	ADS	A7,SECNO 
* 
COPY64	LD	A7,TFILEN 
	RF(Z)	COPY90 
	LD	A7,SECNO
	CF	A14,VTOSEC
	EJECT			COPVOL			CRVOL 
*	TAKE FILE BASE AND FILE LENGTH
	ADK	A1,14
	LDR*	A10,A1	FILE LENGTH TO A10 
	ADK	A1,4 
	LDR*	A11,A1	FILE EXTENT BASE 
	ST	A10,FILLEN
	ST	A11,FILBAS
	RB	COPY58
*	END OF SECTORS TO COPY
COPY90	ABL	VTOC10 
*	END OF FILES TO COPY
RTN00	CF	A14,FFINCC	WRITE FF IN ALL STATUS BITS WITH CC 
	LDK	A1,0	NO ERROR MESSAGE
	RF	RTN99 
* 
	EJECT			COPVOL			CRVOL 
* 
*	****************
*	*ERROR MESSAGES*
*	****************
* 
RTNIE	LDK	A1,1	INPUT I/O ERROR
	RF	RTNX
* 
RTNOE	LDK	A1,2	OUTPUT I/O ERROR 
* 
RTNX	LDR	A2,A8
	RF	RTN100
* 
RTNOE1	LDR	A2,A8
	CF	A14,FFINCC
	LDK	A1,2	OUTPUT I/O ERROR
	RF	RTN100
* 
RTN02	LDK	A1,3	VOLUME NAME UNKNOWN
	RF	RTN99 
* 
RTN03	LDK	A1,4	OUTPUT DISC NOT EMPTY
	RF	RTN99 
* 
RTN04	CF	A14,FFINCC 
	LDK	A1,5	VTOC OVERFLOW 
	RF	RTN99 
* 
RTN05	CF	A14,FFINCC 
	LDK	A1,6	DISC OVERFLOW 
	RF	RTN99 
* 
RTN06	LDK	A1,7	FAULTY DISC FORMAT 
	RF	RTN99 
* 
	EJECT			COPVOL			CRVOL 
* 
* 
RTN08	LDK	A1,8	FLEXIBLE DISC WRITE PROTECTED
* 
RTN99	LDK	A2,0
* 
RTN100	LD	A14,STACKP	RESTORE STACKPOINTER 
* 
*  UNLOCK IF FLEX DISC
* 
	LDKL	A8,ECB3 
	LDR*	A6,A8 
	CCK	A6,FDFC
	RF(L)	RTN110	NOT FD
	LDK	A7,/B8	UNLOCK
	LKM
	DATA	1 
* 
RTN110	LDKL	A8,ECB2	ECB OUTPUT DISC 
	LDR*	A6,A8	FC
	CCK	A6,FDFC
	RF(L)	RTN120	NOT FD
	LDK	A7,/B8 
	LKM
	DATA	1 
* 
RTN120	EQU	*
	RTN	A14
* 
	END

Full view