|
|
DataMuseum.dkPresents historical artifacts from the history of: Philips Data Systems |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Philips Data Systems Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 42770 (0xa712)
Notes: pts_type(SC)
Names: »COPVOL.SC«
└─⟦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«
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