*DECK FFU 
***                     FFU - FR204 FLAW MAINTENANCE UTILITY
**
*                             AUTHOR - A. L. JOHNSON
* 
*                               DATE - MARCH, 1981
* 
*                       COPYRIGHT CONTROL DATA CORP. 1981 
* 
* 
*   1.     INTRODUCTION 
*          ------------ 
* 
*          FFU IS A UTILITY PROGRAM FOR PERFORMING MAINTENANCE FUNCTIONS
*          ON 100, 200, AND 317 MEGABYTE DISK DRIVES CONNECTED TO THE 
*          FR204 FSC ADAPTER.  THESE FUNCTIONS INCLUDE FORMATTING 
*          THE DISK, UPDATING FLAW TABLES, VERIFYING FLAW TABLES, AND 
*          COPYING CONTROLWARE TO DISK. 
* 
* 
*   1.1    RESTRICTIONS 
*          ------------ 
*          1. MA454 CONTROLWARE MUST BE LOADED IN THE FSC ADAPTER 
*             BEFORE RUNNING FFU. 
*          2. FFU ASSUMES THAT HARDWARE IS WORKING CORRECTLY.  IT IS
*             NOT WRITTEN WITH FAULT ISOLATION OR ERROR RECOVERY
*             CAPABILITY.  IF ERRORS OCCUR THE USER SHOULD RUN
*             APPROPRIATE DIAGNOSTIC PROGRAMS AND PERFORM THE NECESSARY 
*             CORRECTIVE MAINTENANCE BEFORE CONTINUING TO RUN FFU.
* 
* 
* 
* 
*   2.     REQUIREMENTS 
*          ------------ 
* 
*   2.1    HARDWARE 
* 
*          NO SPECIAL HARDWARE IS REQUIRED. 
* 
*   2.2    SOFTWARE 
* 
*          NO SPECIAL SOFTWARE IS REQUIRED. 
* 
*   2.3    ACCESSORIES
* 
*          NO SPECIAL ACCESSORIES ARE REQUIRED. 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
*   3.     OPERATIONAL PROCEDURE
*          ----------- ---------
* 
*          1. REFER TO THE MALET REFERENCE MANUAL (PUB. NO. 60456020) 
*             FOR A DETAILED DESCRIPTION OF THE MALET LANGUAGE. 
* 
*          2. REFER TO THE CML REFERENCE MANUAL (PUB. NO. 60455980) TO
*             RUN MALET UNDER THE NOS OR NOS/BE OPERATING SYSTEMS.
* 
*          3. REFER TO THE DEMOT REFERENCE MANUAL (PUB. NO. 60456310) TO
*             RUN DEMOT UNDER THE CMSE OPERATING SYSTEM.
* 
*          4. REFER TO THE MSL100 OFF-LINE MAINTENANCE SYSTEM LIBRARY,
*             VOLUME 1, REFERENCE MANUAL (PUB. NO. 60455770) TO RUN THE 
*             CMSE OFF-LINE SYSTEM. 
* 
*          5. A 317 MEGABYTE DEVICE HAS TWO UNITS PER SPINDLE.  BOTH
*             MUST BE FORMATTED.
* 
*   3.1    LOADING PROCEDURE
* 
*          FFU IS LOADED USING THE STANDARD MALET OR DEMOT LOADING
*          PROCEDURES.
* 
*   3.2    PARAMETERS 
* 
*          THE FOLLOWING PARAMETERS ARE USED BY FFU-- 
* 
*            P0 - 000X - ENABLE REORDERING OF UTILITY MAP DISPLAY 
* 
*                 0000 - DO NOT REORDER UTILITY MAPS
*                 0001 - SORT MAPS INTO ASCENDING ORDER 
* 
*            P0 - 0NNND - PACK SERIAL NUMBER (FIRST 3 DIGITS) 
*            P1 - 0NNND - PACK SERIAL NUMBER (LAST 3 DIGITS)
* 
*            P1 - CCCC - STARTING CYLINDER FOR FORMAT OR SCAN 
*            P2 - CCCC - ENDING CYLINDER FOR FORMAT OR SCAN 
* 
*            P1 - CCCC - CYLINDER 
*            P2 - 00TT - TRACK
*            P3 - 00SS - SECTOR 
* 
*            P2 - 0NNND - DATE CODE (FIRST 3 DIGITS)
*            P3 - 0NNND - DATE CODE (LAST 3 DIGITS) 
* 
*            P4 P5 - 000N NNNN - SKIP DISPLACEMENT 1 (RELATIVE TO INDEX)
*            P6 P7 - 000N NNNN - SKIP DISPLACEMENT 2 (RELATIVE TO SD1)
*            P8 P9 - 000N NNNN - SKIP DISPLACEMENT 3 (RELATIVE TO SD2)
* 
*          NOTE THAT P0, P1, P2, AND P3 HAVE MORE THAN ONE DEFINITION 
*          DEPENDING ON WHICH MODULE IS BEING EXECUTED.  SEE THE MODULE 
*          DESCRIPTIONS (SECTION 5.2) TO DETERMINE APPROPRIATE PARAMETER
*          USAGE. 
* 
*   3.3    SECTION DESCRIPTION INDEX
* 
*          NAME           DESCRIPTION                      PARAMETERS 
*          ------  --------------------------------------  ---------- 
*          FFU01   READ SERIAL NUMBER                         NONE
*          FFU03   READ UTILITY MAPS                           P0 
*          FFU04   LOCATE AND SET SKIP DISPLACEMENT           P1-P3 
*          FFU05   SET OR CLEAR SKIP DISPLACEMENT          P1,P2,P4-P9
*          FFU07   SET TRACK FLAW                             P1,P2 
*          FFU10   CLEAR TRACK FLAW                           P1,P2 
*          FFU11   FORMAT PACK                                NONE
*          FFU12   FORMAT PARTIAL PACK                        P1,P2 
*          FFU13   INITIALIZE PACK                            P0-P3 
*          FFU14   FORMAT MAP TRACK                           P0-P9 
*          FFU15   SCAN AND DISPLAY FLAWS                     P1,P2 
*          FFU16   VERIFY FLAW MAPS                           P1,P2 
*          FFU17   ARCHIVE UTILITY FLAW MAPS                  NONE
*          FFU20   RESTORE UTILITY FLAW MAPS                  NONE
*          FFU21   COPY CONTROLWARE TO DISK                   NONE
*          FFU22   READ CONTROLWARE REVISION                  NONE
*          FFU23   WRITE DIAGNOSTIC TRACKS                    NONE
*          FFU65   DISPLAY FR204 MEMORY                       P0-P5 
*          FFU99   PARAMETER DEFINITIONS                      NONE
*          FFU99A  LIST OF MODULES                            NONE
* 
* 
*   4.     OPERATOR COMMUNICATIONS
*          -------- --------------
* 
*   4.1    MESSAGE FORMATS
* 
*          MESSAGES TO THE OPERATOR ARE IN PLAIN ENGLISH AND DO NOT 
*          MAKE USE OF ERROR CODES.  (AN EXCEPTION TO THIS WOULD BE 
*          ON ABORTED I/O FUNCTIONS.  AN ERROR CODE IS PROVIDED BY
*          DEMOT AND IS DISPLAYED FOR THE OPERATOR TO SEE.  THESE 
*          ERROR CODES ARE DEFINED IN DOCUMENTATION FOR DEMOT.) 
*          THE MESSAGES DO CONTAIN SOME ABBREVIATIONS AND THEY ARE
*          LISTED BELOW --
*               CH  - FR204 CHANNEL NUMBER
*               CY  - CYLINDER
*               EC  - ERROR CODE PROVIDED BY DEMOT
*               EQ  - FR204 EQUIPMENT NUMBER
*               GS  - GENERAL STATUS
*               LF  - LAST FUNCTION 
*               REV - REVISION
*               SD  - SKIP DISPLACEMENT 
*               SE  - SECTOR
*               S/N - SERIAL NUMBER 
*               TR  - TRACK 
*               UN  - UNIT NUMBER 
* 
* 
* 
* 
* 
* 
*   4.2    MESSAGE DICTIONARY 
* 
*   4.2.1  NORMAL RUNNING MESSAGES
* 
*          DURING NORMAL OPERATION A MESSAGE IS SENT TO THE SYSTEM
*          B DISPLAY TO INDICATE WHICH MODULE IS RUNNING.  MODULES
*          THAT HAVE TYPICAL EXECUTION TIMES GREATER THAN 2 SECONDS 
*          ALSO INCLUDE A COUNTER IN THE B DISPLAY SO THAT PROGRESS OF
*          THE MODULE MAY BE MONITORED BY THE OPERATOR.  THE SYSTEM 
*          K DISPLAY IS USED FOR INFORMATION DISPLAYED BY THE MODULE. 
*          (E.G. TRACK FLAW TABLE, OR DRIVE SERIAL NUMBER.) 
*          THE K DISPLAY IS ALSO USED TO INFORM THE OPERATOR THAT THE 
*          MODULE COMPLETED SUCCESSFULLY. 
* 
*   4.2.2  ERROR MESSAGES 
* 
*          ALL ERROR MESSAGES ARE DISPLAYED ON THE SYSTEM K DISPLAY.
*          ERRORS DETECTED BY FFU ARE MENTIONED IN THE MODULE 
*          DESCRIPTIONS (SECTION 5.2).  THE ERROR MESSAGES ARE IN 
*          PLAIN ENGLISH AND DO NOT USE ERROR CODES.  ERRORS ON I/O 
*          FUNCTIONS RESULT IN A DISPLAY OF GENERAL AND DETAIL
*          STATUS ALONG WITH THE LAST FUNCTION CODE AND AN ERROR CODE.
*          DESCRIPTION OF THE STATUS BITS MAY BE FOUND IN THE 
*          MA454 CONTROLWARE EXTERNAL REFERENCE SPECIFICATION.
* 
*   5.     DESCRIPTIONS 
* 
*   5.1    GENERAL
* 
*          EACH MODULE OF FFU IS RUN AS AN INDIVIDUAL UNIT AND HALTS
*          UPON COMPLETION.  EXECUTION DOES NOT CONTINUE FROM ONE 
*          MAIN MODULE TO THE NEXT.  ALL MODULES THAT MAKE CHANGES ON 
*          A DISK WILL DISPLAY THE MODULE NAME, A BRIEF STATEMENT 
*          OF WHAT THAT MODULE WILL DO, AND ANY REVELANT PARAMETERS.
*          THE MODULE WILL THEN PAUSE AND THE OPERATOR SHOULD VERIFY
*          THAT THE INFORMATION DISPLAYED IS CORRECT BEFORE ISSUING 
*          A GO DIRECTIVE TO START EXECUTION.  MODULES THAT DO NOT MAKE 
*          CHANGES ON THE DISK BEGIN EXECUTION WITHOUT A PAUSE. 
* 
*          UPON COMPLETION OF A MODULE THE OPERATOR MUST CHECK THE
*          K DISPLAY TO VERIFY THAT NO ERRORS OCCURRED DURING THE 
*          EXECUTION OF THAT MODULE.
* 
*   5.2    MODULE DESCRIPTIONS
* 
   MODULE FFU01, FMDFT, (10,11,12), LOCK
*** 5.2.1  FFU01 - READ SERIAL NUMBER 
**
*          PURPOSE- 
*          FFU01 DISPLAYS AND PRINTS THE SERIAL NUMBER AND DATE OF
*          FORMATTING FOR THE ASSIGNED DRIVE. 
* 
*          METHOD-
*          FFU01 READS TRACK 0, SECTOR 0 IN THE PROTECTED AREA ON THE 
*          ASSIGNED DRIVE.  THE SERIAL NUMBER AND DATE OF FORMATTING ARE
*          EXTRACTED FROM THE FIRST FOUR WORDS OF THIS SECTOR.
* 
*          ENTRY- 
*          FFU01 DOES NOT REQUIRE SETTING ANY PARAMETERS BEFORE 
*          EXECUTION. 
/ 
*          EXIT-
*          FFU01 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS 
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU01 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU01 ALSO CALLS FFU98A TO DISPLAY DETAILED STATUS IF 
*          AN I/O FUNCTION IS ABORTED.
* 
*          REGISTERS USED-
*          FFU01 USES REGISTERS B1, B2, B3, AND B5.  REGISTERS ARE
*          USED AS FOLLOWS--
*            B1 - DATE OF FORMATTING
*            B2 - DATE OF FORMATTING
*            B3 - DATE OF FORMATTING
*            B5 - K DISPLAY LINE NUMBER 
* 
*          BUFFERS USED-
*          FFU01 USES THE INPUT BUFFER FOR DATA READ FROM THE DISK. 
* 
* 
/  - READ SERIAL NUMBER - 
/ 
1  FORMAT SERIAL NUMBER - CH=*O, EQ=*O, UN=*O 
2  FORMAT S/N = *HE*HE    DATE OF FORMAT = *H/*H/*H 
15 FORMAT MODULE FFU01
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   B5=4                           * SET DISPLAY LINE
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * JUMP IF ERROR 
   RES DRIVE, ABT 74
   GET SERIAL, ABT 74             * READ MFG DATA 
   REL, ABT 74
   B3=IB(3) AND 0377              * EXTRACT DAY/MO/YR 
   B2=IB(3) RS 8
   B1=IB(2) AND 0017
   B1=B1 LS 4 
   B2=B1 XOR B2 
   B1=IB(2) RS 4
   MSG 2 (IB(0),IB(1),B1,B2,B3) TO LINE 4 
44 MSG 16 TO LINE 6 
   PICTURE
   GOTO 77                        * END OF MODULE 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
   MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU03, FMDFT, (10,11,12), LOCK
*** 5.2.2  FFU03 - READ UTILITY MAPS
**
*          PURPOSE- 
*          FFU03 DISPLAYS AND PRINTS THE UTILITY TRACK FLAW MAP AND 
*          THE SKIP DISPLACEMENT MAP (317 MEGABYTE DEVICE ONLY) FOR 
*          THE ASSIGNED DRIVE.
* 
*          METHOD-
*          FFU03 EXITS TO FFU031 TO REORDER FLAW MAPS IF PARAMETER P0 IS
*          EQUAL TO 1.  IF PARAMETER P0 IS ZERO FFU03 READS THE UTILITY 
*          TRACK FLAW MAP FROM TRACK 0, SECTOR 1 OF THE PROTECTED AREA
*          AND DISPLAYS THE MAP WITHOUT REORDERING THE FLAWS.  IF A 
*          317 MEGABYTE DEVICE IS ASSIGNED, FFU03 ALSO READS AND
*          DISPLAYS THE SKIP DISPLACEMENT MAP FROM TRACK 0, SECTORS 3 
*          TO 33 OCTAL. 
* 
*          CYLINDER, TRACK, AND SKIP DISPLACEMENT ARE DISPLAYED AND 
*          PRINTED IN OCTAL.
* 
*          ENTRY- 
*          FFU03 REQUIRES PARAMETER P0 TO BE SET TO INDICATE WHETHER
*          THE TRACK FLAW TABLES ARE TO BE PRINTED WITH OR WITHOUT
*          REORDERING.  PARAMETER USAGE AND ALLOWED VALUES ARE
*          SHOWN BELOW--
*            P0 = 0 - DISPLAY AND PRINT MAPS WITHOUT REORDERING 
*                 1 - SORT MAPS INTO ASCENDING ORDER
*          AN ERROR MESSAGE IS DISPLAYED IF P0 IS GREATER THAN 1. 
/ 
*          EXIT-
*          FFU03 TERMINATES WITH AN END STATEMENT OR BY EXITING 
*          TO MODULE FFU031.  REGISTER B5 CONTAINS THE K DISPLAY
*          LINE NUMBER FOR FFU031.
* 
*          SUBMODULES REFERENCED- 
*          FFU03 CALLS SUBMODULE FFU98B TO DISPLAY THE FLAW TABLES AND
*          SUBMODULE FFU98A TO DISPLAY DETAIL STATUS IF AN I/O
*          FUNCTION IS ABORTED.  FFU03 CALLS FFU97A TO CHECK THE
*          ASSIGNED DEVICE CODE.
* 
*          REGISTERS USED-
*          FFU03 USES REGISTERS B0, B2, B5, B6, B8, AND B9.  REGISTERS
*          ARE USED AS FOLLOWS--
*            B0 - ERROR FLAG
*            B2 - INDEX INCREMENT 
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - DISPLAY SELECT FLAG FOR SUBMODULE FFU98B
*            B8 - FLAW COUNT
*            B9 - SECTOR
* 
*          BUFFERS USED-
*          FFU03 USES THE INPUT BUFFER FOR DATA READ FROM THE DISK. 
*          DATA IS COPIED TO THE OUTPUT BUFFER FOR USE BY SUBMODULE 
*          FFU98B.
* 
* 
/  - READ UTILITY MAP - 
/ 
1  FORMAT UTILITY FLAW MAPS - CH=*O, EQ=*O, UN=*O 
10 FORMAT ILLEGAL PARAMETER P0
15 FORMAT MODULE FFU03
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   B5=4                           * SET DISPLAY LINE
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * ABORT IF ERROR
   B8=1                           * SET FLAW COUNT
   IF (P0 EQ 0) GOTO 30           * IF REORDER DISABLED 
   IF (P0 EQ 1) EXIT TO 031       * IF REORDER ENABLED
   MSG 10 TO LINE 4               * ERROR IF P0 NOT 0 OR 1
   MSG 16 TO LINE 6 
   PICTURE
   GOTO 77                        * ERROR STOP
30 B9=1                           * SET SECTOR
   RES DRIVE, ABT 74
   GET FACTORY SECTOR B9, ABT 74  * READ TRACK FLAWS
   COPY IB TO OB FOR 502
   B6=1 
   B2=2                           * SET INCREMENT 
   CALL 98B                       * DISPLAY TRACK FLAWS 
   IF (DC NE 12) GOTO 77          * IF NOT 317 MEGABYTE DEVICE
   B8=1                           * RESET FLAW COUNT
   B9=3                           * SET SECTOR
50 RES DRIVE, ABT 74
   GET FACTORY SECTOR B9, ABT 74  * READ SKIP DISPLACEMENT
   COPY IB TO OB FOR 502
   B6=2 
   B2=6                           * SET INCREMENT 
   CALL 98B                       * DISPLAY SKIP DISPLACEMENT 
   IF (B3 NE 318D) GOTO 77        * IF END OF MAP (53 X 6)
   B9=B9+1                        * NEXT SECTOR 
   IF (B9 LE 33) GOTO 50          * IF MORE SECTORS 
   GOTO 77                        * END OF MODULE 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
   MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU031, FMDFT, (10,11,12), LOCK 
*** 5.2.3  FFU031 - READ SKIP DISPLACEMENT MAP
**
*          PURPOSE- 
*          FFU031 DISPLAYS AND PRINTS THE UTILITY TRACK FLAW MAP AND
*          THE SKIP DISPLACEMENT MAP (317 MEGABYTE DEVICE ONLY) FOR THE 
*          ASSIGNED DRIVE.  FLAW MAPS ARE REORDERED BEFORE THEY ARE 
*          DISPLAYED AND PRINTED. 
* 
*          METHOD-
*          FFU031 IS ONLY ENTERED FROM FFU03 AND ONLY IF THE FLAW MAPS
*          ARE TO BE REORDERED (P0 EQUAL TO 1).  FFU031 READS THE 
*          UTILITY TRACK FLAW MAP FROM TRACK 0, SECTOR 1 OF THE 
*          PROTECTED AREA.  THE FLAWS ARE SORTED INTO ASCENDING ORDER 
*          BY CYLINDER AND TRACK BEFORE THEY ARE DISPLAYED AND PRINTED. 
*          IF A 317 MEGABYTE DEVICE IS ASSIGNED, FFU031 ALSO READS THE
*          SKIP DISPLACEMENT MAP FROM TRACK 0, SECTORS 3 TO 33 OCTAL. 
*          THE SKIP DISPLACEMENT INFORMATION IS SORTED INTO THE DISPLAY 
*          BUFFER.  WHEN THE END OF THE MAP IS FOUND THE BUFFER IS
*          DISPLAYED AND PRINTED.  BECAUSE THE ENTIRE SKIP DISPLACEMENT 
*          MAP WILL NOT FIT IN THE DISPLAY BUFFER AT ONE TIME, IT IS
*          NECESSARY TO RE-READ SECTORS 3 TO 33, FILL THE BUFFER, AND 
*          DISPLAY AND PRINT ANOTHER SEGMENT OF THE MAP.  THIS PROCESS
*          IS REPEATED UNTIL THE ENTIRE MAP HAS BEEN LISTED.
* 
*          CYLINDER, TRACK, AND SKIP DISPLACEMENT ARE DISPLAYED AND 
*          PRINTED IN OCTAL.
/ 
*          ENTRY- 
*          FFU031 IS ONLY ENTERED FROM MODULE FFU03, AND THEN ONLY IF 
*          PARAMETER P0 IS EQUAL TO 1.
*          FFU031 ASSUMES THAT THE LINE NUMBER FOR THE K DISPLAY
*          IS IN REGISTER B5. 
* 
*          EXIT-
*          FFU031 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU031 CALLS SUBMODULE FFU98B TO DISPLAY THE FLAW MAPS AND 
*          SUBMODULE FFU98A TO DISPLAY DETAILED STATUS IF AN I/O
*          FUNCTION IS ABORTED. 
* 
*          REGISTERS USED-
*          FFU031 USES REGISTERS B0 TO B9.  REGISTERS ARE USED AS 
*          FOLLOWS--
*            B0 - INDEX FOR SHIFTING THE OUTPUT BUFFER
*            B1 - INDEX FOR SHIFTING THE OUTPUT BUFFER
*            B2 - INDEX INCREMENT 
*            B3 - INPUT BUFFER INDEX
*            B4 - INPUT BUFFER INDEX
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - DISPLAY SELECT FLAG FOR SUBMODULE FFU98B
*                 ALSO, OUTPUT BUFFER INDEX 
*            B7 - OUTPUT BUFFER INDEX 
*            B8 - FLAW COUNT
*            B9 - SECTOR
* 
*          BUFFERS USED-
*          FFU031 USES THE INPUT BUFFER FOR FLAW TABLES READ FROM THE 
*          DRIVE.  THE OUTPUT BUFFER IS USED AS THE DISPLAY BUFFER
*          AND FOR SORTING THE TABLES INTO SEQUENTIAL ORDER.
* 
* 
/  - READ UTILITY MAPS (REORDER) -
/ 
15 FORMAT MODULE FFU031 
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 MSG 15 TO DISPLAY
   B9=1                           * SET SECTOR
   B2=2                           * SET INCREMENT 
22 OB(500)=0                      * CLEAR LAST FLAW 
   OB(501)=0
   B8=1                           * SET FLAW COUNT
24 B7=0 
26 OB(B7)=0                       * CLEAR OB(0-317D)
   B7=B7+1
   IF (B7 LT 318D) GOTO 26        * IF NOT DONE CLEARING
35 RES DRIVE, ABT 74
   GET FACTORY SECTOR B9, ABT 74  * READ UTILITY SECTOR 
   B4=0                           * RESET IB INDEX
40 B7=0                           * RESET OB INDEX
   B3=B4+1
   IF (IB(B4) AND 4000 NE 0) GOTO 42   * IF NOT END OF IB 
   IF (B9 EQ 1) GOTO 70           * IF END OF TRACK FLAWS 
   GOTO 46                        * END OF SKIP DISPLACEMENT
42 IF (IB(B4) GT OB(500)) GOTO 50      * FLAW MAP GT LAST FLAW
   IF (IB(B4) LT OB(500)) GOTO 44      * FLAW MAP LT LAST FLAW
   IF (IB(B3) GT OB(501)) GOTO 50      * FLAW MAP GT LAST FLAW
44 B4=B4+B2                       * INCREMENT IB INDEX
   IF (B4 LT 318D) GOTO 40        * IF NOT END OF SECTOR
   B9=B9+1                        * NEXT SECTOR 
   IF (B9 EQ 2) GOTO 70           * IF END OF TRACK FLAWS 
   IF (B9 LE 33) GOTO 35          * IF MORE SECTORS 
46 B9=3                           * RESET SECTOR
   B6=2 
   CALL 98B                       * DISPLAY SKIP DISPLACEMENT 
   B3=318D-B2 
   B4=B3+1
   OB(500)=OB(B3)                 * SAVE LAST FLAW
   OB(501)=OB(B4) 
   IF (OB(500) AND 4000 NE 0) GOTO 24  * IF NOT END OF MAP
   GOTO 77                        * END OF MODULE 
50 B6=B7+1
   IF (OB(B7) EQ 0) GOTO 54       * IF END OF FLAW DISPLAY
   IF (IB(B4) GT OB(B7)) GOTO 52  * FLAW MAP GT FLAW DISPLAY
   IF (IB(B4) LT OB(B7)) GOTO 54  * FLAW MAP LT FLAW DISPLAY
   IF (IB(B3) LT OB(B6)) GOTO 54  * FLAW MAP LT FLAW DISPLAY
52 B7=B7+B2                       * INCREMENT OB INDEX
   IF (B7 LT 318D) GOTO 50        * IF NOT END OF OB
   GOTO 44
54 B1=317D                        * MOVE OB DOWN
55 B0=B1-B2 
   OB(B1)=OB(B0)
   B1=B1-1                        * MOVE NEXT ENTRY 
   IF (B1-B7 GE B2) GOTO 55       * IF MORE TO MOVE 
   OB(B7)=IB(B4)                  * INSERT FLAW 
   OB(B6)=IB(B3)
57 B6=B6+1                        * INCREMENT INDEX 
   B3=B3+1                        * INCREMENT INDEX 
   IF (B6-B7 EQ B2) GOTO 44       * IF FLAW INSERTED
   OB(B6)=IB(B3)                  * INSERT NEXT WORD
   GOTO 57                        * LOOP
70 B9=3                           * SET SECTOR
   B6=1 
   CALL 98B                       * DISPLAY TRACK FLAWS 
   B2=6                           * SET INCREMENT 
   IF (DC EQ 12) GOTO 22          * IF 317 MEGABYTE DEVICE
   GOTO 77                        * END OF MODULE 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
   MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU04, FMDFT, (12), LOCK
*** 5.2.4  FFU04 - LOCATE AND SET SKIP DISPLACEMENT 
**
*          PURPOSE- 
*          FFU04 FINDS THE APPROPRIATE SKIP DISPLACEMENT FOR A FAILING
*          SECTOR ON THE ASSIGNED 317 MEGABYTE DRIVE.  THE SKIP 
*          DISPLACEMENT IS ENTERED IN THE MAP AND THE TRACK IS
*          FORMATTED.  IF NECESSARY THE ENTIRE TRACK IS FLAWED. 
* 
*          METHOD-
*          FFU04 READS THE FLAW MAPS AND IF THE TRACK IS ALREADY FLAWED 
*          FFU04 WILL DISPLAY AN ERROR MESSAGE AND HALT.  IF THE TRACK
*          IS NOT FLAWED FFU04 WILL LOOK FOR SKIP DISPLACEMENT THAT MAY 
*          ALREADY BE SET FOR THAT TRACK.  IF THERE ARE ALREADY THREE 
*          ENTRIES IN THE MAP, FFU04 WILL EXIT TO FFU071 TO SET 
*          A TRACK FLAW.  IF THERE ARE TWO OR LESS ENTRIES, FFU04 WILL
*          DO A SURFACE ANALYSIS ON THE SPECIFIED SECTOR TO LOCATE THE
*          FLAW.  IF THE FLAW CANNOT BE LOCATED FFU04 WILL DISPLAY AN 
*          ERROR MESSAGE AND HALT.  IF THE FLAW IS LOCATED FFU04 WILL 
*          GENERATE THE APPROPRIATE SKIP DISPLACEMENT PARAMETERS AND
*          EXIT TO FFU051 TO SET THE SKIP DISPLACEMENT AND FORMAT 
*          THE TRACK. 
* 
*          ENTRY- 
*          FFU04 IS ONLY FOR USE ON 317 MEGABYTE DRIVES.
*          FFU04 REQUIRES PARAMETERS P1, P2, AND P3 TO BE SET TO
*          INDICATE THE SECTOR TO BE FLAWED.  PARAMETER USAGE AND 
*          ALLOWED OCTAL VALUES ARE SHOWN BELOW-- 
* 
*                  PARAMETERS         317 MBYTE 
*            ----------------------   --------- 
*            P1 - CYLINDER            0 TO 1057 
*            P2 - TRACK                0 TO 35
*            P3 - SECTOR               0 TO 33
* 
*          AN ERROR MESSAGE IS DISPLAYED IF ANY OF THE PARAMETERS 
*          ARE TOO LARGE. 
/ 
*          EXIT-
*          FFU04 EXITS TO FFU041 TO PERFORM SURFACE ANALYSIS AND LOCATE 
*          THE FLAW.  IF THERE ARE ALREADY THREE DEFECTS SKIPPED FFU04
*          EXITS TO FFU071 TO SET A TRACK FLAW.  REGISTERS B5, AND B10
*          TO B15 ARE USED BY FFU042.  REGISTERS B1, B5, AND B15 ARE
*          USED BY FFU071.
* 
*          SUBMODULES REFERENCED- 
*          FFU04 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU04 ALSO CALLS FFU98A TO DISPLAY DETAILED STATUS
*          IF AN I/O FUNCTION IS ABORTED. 
* 
*          REGISTERS USED-
*          FFU04 USES REGISTERS B0 TO B8 AND B10 TO B15.  REGISTERS 
*          ARE USED AS FOLLOWS--
*            B0 - ERROR FLAG (SET BY FFU97A)
*            B1 - MAXIMUM CYLINDER (SET BY FFU97A)
*            B2 - MAXIMUM TRACK (SET BY FFU97A) 
*            B3 - INPUT BUFFER INDEX
*            B4 - INPUT BUFFER INDEX
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - MAP SECTOR
*            B7 - INPUT BUFFER INDEX
*            B8 - INPUT BUFFER INDEX
*            B10 B11 - SKIP DISPLACEMENT 1
*            B12 B13 - SKIP DISPLACEMENT 2
*            B14 B15 - SKIP DISPLACEMENT 3
*            B15 - MESSAGE NUMBER FOR FFU071
* 
*          BUFFERS USED-
*          FFU04 USES THE INPUT BUFFER FOR MAPS READ FROM THE DISK. 
* 
* 
/  - LOCATE AND SET SKIP DISPLACEMENT - 
/ 
1  FORMAT SET SKIP DISPLACEMENT - CH=*O, EQ=*O, UN=*O 
2  FORMAT CY=*OCT  TR=*O  SE=*O 
3  FORMAT THIS TRACK ALREADY HAS 3 SKIPS
7  FORMAT ERROR - TRACK FLAW IS SET 
10 FORMAT ERROR - MAX SE = *O FOR *OC MBYTE DEVICE
11 FORMAT ERROR - ACCESS LEVEL TOO LOW (MINIMUM AL=4) 
12 FORMAT ERROR - MAX CY = *OCT FOR *OC MBYTE DEVICE
13 FORMAT ERROR - MAX TR = *O FOR *OC MBYTE DEVICE
14 FORMAT ERROR - USE FFU14 FOR MAP TRACK 
15 FORMAT MODULE FFU04
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   MSG 2 (P1,P2,P3) TO LINE 3 
   IF (AL GE 4) GOTO 21           * IF VALID ACCESS LEVEL 
   MSG 11 TO LINE 5               * ACCESS LEVEL TOO LOW
   GOTO 22
21 B5=5                           * SET DISPLAY LINE
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * IF ERROR
   IF (P1 LE B1) GOTO 24          * IF VALID CYLINDER 
   MSG 12 (B1,B4) TO LINE 5       * ILLEGAL CYLINDER
22 MSG 16 TO LINE 7 
   PICTURE
   GOTO 77                        * ERROR EXIT
24 IF (P2 LE B2) GOTO 26          * IF VALID TRACK
   MSG 13 (B2,B4) TO LINE 5       * ILLEGAL TRACK 
   GOTO 22
26 IF (P1 LT B1) GOTO 27          * IF NOT MAP CYLINDER 
   IF (P2 NE 0) GOTO 27           * IF NOT MAP TRACK
   MSG 14 TO LINE 5 
   GOTO 22
27 IF (P3 LE 33) GOTO 30          * IF VALID SECTOR 
   MSG 10 TO LINE 5 
   GOTO 22
/ 
/  CHECK TRACK FLAW 
30 B6=1                           * SET MAP SECTOR
   RES DRIVE, ABT 74
   GET FACTORY SECTOR B6, ABT 74  * READ TRACK FLAWS
   B7=0 
32 B8=B7+1
   IF (IB(B7) AND 4000 EQ 0) GOTO 34   * IF NO TRACK FLAW 
   IF (IB(B7) AND 1777 NE P1) GOTO 33  * IF NOT THIS CYLINDER 
   IF (IB(B8) RS 6 NE P2) GOTO 33      * IF NOT THIS TRACK
   MSG 7 TO LINE B5               * TRACK FLAW SET
   B5=B5+2
   GOTO 76
33 B7=B7+2                        * NEXT ENTRY
   IF (B7 LT 318D) GOTO 32        * IF MORE ENTRIES 
/ 
/  CHECK SKIP DISPLACEMENT
34 B10=0                          * CLEAR REGISTERS 
   B11=0
   B12=0
   B13=0
   B14=0
   B15=0
   B6=3                           * SET MAP SECTOR
36 RES DRIVE, ABT 74
   GET FACTORY SECTOR B6, ABT 74  * GET SKIP MAP
   B3=0 
40 B4=B3+1                        * SET IB INDEX
   IF (IB(B3) AND 4000 EQ 0) EXIT TO 041    * IF NO SKIP
   IF (IB(B3) AND 1777 NE P1) GOTO 42  * IF NOT THIS CYLINDER 
   IF (IB(B4) RS 6 EQ P2) GOTO 44      * IF SKIP FOUND
42 B3=B3+6                        * NEXT ENTRY
   IF (B3 LT 318D) GOTO 40        * IF MORE ENTRIES 
   B6=B6+1                        * NEXT SECTOR 
   IF (B6 LE 33) GOTO 36          * IF MORE SECTORS 
   EXIT TO 041                    * NO SKIP 
44 B4=B4+1                        * SET SKIP DISPLACEMENT 
   B14=IB(B4) RS 8
   B15=IB(B4) AND 0377 LS 4 
   B4=B4+1
   B12=IB(B4) RS 8
   B15=B15 XOR B12
   B12=IB(B4) AND 0360 RS 4 
   B13=IB(B4) AND 0017 LS 8 
   B4=B4+1
   B10=IB(B4) RS 4
   B13=B13 XOR B10
   B10=IB(B4) AND 0017
   B4=B4+1
   B11=IB(B4) 
   IF (B14 OR B15 EQ 0) EXIT TO 041    * IF LESS THAN 3 SKIPS 
   MSG 3 TO LINE B5               * ALREADY 3 SKIPS 
   B5=B5+2
   B15=5                          * SET MESSAGE NUMBER
   EXIT TO 071                    * GO SET TRACK FLAW 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU041, FMDFT, (12), LOCK 
*** 5.2.5  FFU041 - LOCATE FLAW 
**
*          PURPOSE- 
*          FFU041 PERFORMS A SURFACE ANALYSIS ON THE SPECIFIED SECTOR 
*          TO LOCATE THE FLAW.
* 
*          METHOD-
*          FFU041 ATTEMPTS TO LOCATE THE DEFECT BY WRITING AND READING
*          THE SPECIFIED SECTOR.  THE HEXADECIMAL FORM OF THE PATTERN 
*          USED IS  E36A AAAA.  THE PATTERN IS REPEATED TO FILL THE 
*          SECTOR.  IF NO ERROR OCCURS ON EITHER THE WRITE OR THE READ
*          THE PATTERN IS LEFT SHIFTED ONE BIT POSITION AND ANOTHER 
*          ATTEMPT IS MADE TO WRITE AND READ THE SECTOR.  THIS PROCESS
*          WILL CONTINUE UNTIL THE SECTOR HAS BEEN WRITTEN AND READ 
*          UP TO 32 TIMES IF NO ERROR OCCURS.  IF NO ERROR IS DETECTED
*          A MESSAGE IS DISPLAYED AND FFU041 HALTS.  IF AN ERROR
*          IS DETECTED SENSE BYTE 7 IS EXAMINED AND THE LOCATION OF THE 
*          DEFECT (NUMBER OF BYTES TO THE END OF THE SECTOR) IS 
*          DETERMINED AS SHOWN IN THE FOLLOWING CHART-- 
* 
*          WRITE ERROR, GENERAL STATUS=5020, NO CONTINUE FUNCTION 
*             SENSE BYTE 7   LOCATION OF DEFECT   ERROR TYPE
*             ------------   ------------------   --------------------
*               41 (HEX)     577 (DECIMAL)        COUNT FIELD 
*               45 (HEX)     601 (DECIMAL)        COUNT FIELD SYNC
* 
*          READ ERROR, GENERAL STATUS=0000, ONE CONTINUE FUNCTION 
*             SENSE BYTE 7   LOCATION OF DEFECT   ERROR TYPE
*             ------------   ------------------   --------------------
*               53 (HEX)     SENSE BYTES 18-19    CORRECTABLE DATA
*                NOT 53      INDETERMINATE        CORRECT DATA AFTER
*                                                       RE-READ 
* 
*          READ ERROR, GENERAL STATUS=5020, NO CONTINUE FUNCTION
*             SENSE BYTE 7   LOCATION OF DEFECT   ERROR TYPE
*             ------------   ------------------   --------------------
*               41 (HEX)     577 (DECIMAL)        COUNT FEILD 
*               43 (HEX)     AT DATA MISCOMPARE   DATA ERROR
*               45 (HEX)     601 (DECIMAL)        COUNT FIELD SYNC
*               47 (HEX)     501 (DECIMAL)        DATA FILED SYNC 
* 
*          IF ANY OTHER ERROR CONDITIONS OCCUR FFU041 DISPLAYS DETAILED 
*          STATUS AND HALTS.  IF THE DEFECT IS LOCATED FFU041 EXITS TO
*          FFU042 TO CONVERT THE LOCATION OF THE DEFECT TO THE SKIP 
*          DISPLACEMENT PARAMETERS REQUIRED BY FFU051.
/ 
*          ENTRY- 
*          FFU041 IS ENTERED FROM FFU04 IF THE SPECIFIED TRACK IS NOT 
*          FLAWED AND HAS LESS THAN THREE SKIPS.  REGISTER B5 IS
*          ASSUMED TO CONTAIN THE K DISPLAY LINE NUMBER.
* 
*          EXIT-
*          FFU041 EXITS TO FFU042 TO CALCULATE THE SKIP DISPLACEMENT
*          PARAMETERS.  IF THE FLAW COULD NOT BE LOCATED FFU041 
*          DISPLAYS AN ERROR MESSAGE AND HALTS.  REGISTERS B5 AND 
*          B9 TO B15 ARE USED BY FFU042.  (SKIP DISPLACEMENT IS SET IN
*          REGISTERS B10 TO B15 BY FFU04.)
* 
*          SUBMODULES REFERENCED- 
*          FFU041 CALLS FFU98A TO DISPLAY DETAILED STATUS IF AN I/O 
*          FUNCTION IS ABORTED. 
* 
*          REGISTERS USED-
*          FFU041 USES REGISTERS B1 TO B9.  REGISTERS ARE USED AS 
*          FOLLOWS--
*            B1 - CYLINDER
*            B2 - TRACK 
*            B3 - SECTOR
*            B4 - NUMBER OF SECTORS TO READ OR WRITE
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - OUTPUT BUFFER INDEX 
*            B7 - PATTERN INDEX 
*            B8 - SENSE BYTE 7
*            B9 - LOCATION OF FLAW
* 
*          BUFFERS USED-
*          FFU041 USES THE OUTPUT BUFFER FOR WRITING A DIAGNOSTIC 
*          PATTERN TO THE DISK.  THE INPUT BUFFER IS USED FOR DATA
*          READ FROM THE DISK.
* 
* 
1  FORMAT UNABLE TO LOCATE FLAW 
15 FORMAT MODULE FFU041 
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
/  - LOCATE FLAW -
20 MSG 15 TO DISPLAY
   OB(0)=7066                     * SET PATTERN 
   OB(1)=5252 
   OB(2)=5256 
   OB(3)=1552 
   OB(4)=5252 
   OB(5)=5343 
   OB(6)=3252 
   OB(7)=5252 
24 B6=10                          * SET OB INDEX
   B7=0                           * SET PATTERN INDEX 
26 OB(B6)=OB(B7)
   B7=B7+1 AND 7                  * NEXT WORD OF PATTERN
   B6=B6+1                        * NEXT OB LOCATION
   IF (B6 LT 502) GOTO 26         * IF BUFFER NOT FULL
/ 
/  WRITE SECTOR 
30 B1=P1                          * CYLINDER
   B2=P2                          * TRACK 
   B3=P3                          * SECTOR
   B4=1                           * COUNT 
   RES DRIVE, ABT 74
   WRITE B4 SECTORS AT CYL B1 TRK B2 SEC B3, ABT 40 
/ 
/  READ SECTOR
   B4=1                           * RESET COUNT 
   READ B4 SECTORS AT CYL B1 TRK B2 SEC B3, ABT 50
/ 
/  SHIFT PATTERN
32 B7=0                           * SET PATTERN INDEX 
   B6=10                          * SET OB INDEX
34 OB(B7)=OB(B6) LS 1 AND 7776    * LEFT SHIFT
   B6=B6+1
   OB(B7)=OB(B6) RS 11D XOR OB(B7)
   B7=B7+1
   IF (B7 LE 7) GOTO 34           * IF PATTERN NOT COMPLETE 
   IF (OB(0) NE 7066) GOTO 24     * IF PATTERN NOT REPEATING
36 MSG 1 TO LINE B5               * CANNOT FIND BAD SPOT
   B5=B5+2
   GOTO 76                        * ERROR EXIT
/ 
/  ANALYZE WRITE ERROR
40 IF (SB NE 5020) GOTO 74        * IF UNEXPECTED STATUS
   IF (SB(52) NE 0) GOTO 74       * IF CONTINUE ISSUED
   B8=SB(5) LS 4 AND 0360 
   B8=SB(6) RS 8 XOR B8           * SENSE BYTE 7
   B9=577D                        * CENTER OF COUNT FIELD 
   IF (B8 EQ 101) EXIT TO 042     * IF COUNT FIELD ERROR
   B9=601D                        * 12 BYTES FROM END OF GAP
   IF (B8 EQ 105) EXIT TO 042     * IF MISS COUNT FIELD SYNC
   GOTO 74                        * IF UNEXPECTED STATUS
/ 
/  ANALYZE READ ERROR 
50 IF (SB NE 0) GOTO 54           * IF GENERAL STATUS NON-ZERO
   IF (SB(52) NE 1) GOTO 74       * IF RETRIES NE 1 
   IF (WT NE 502) GOTO 74         * IF UNEXPECTED BLOCK SIZE
   B8=SB(32) LS 4 AND 0360
   B8=SB(33) RS 8 XOR B8          * SENSE BYTE 7
   IF (B8 NE 123) GOTO 32         * IF GOOD READ AFTER RETRY
   B9=SB(42) LS 4 AND 7760
   B9=SB(43) RS 8 XOR B9          * SENSE BYTES 18 AND 19 
   EXIT TO 042
54 IF (SB NE 5020) GOTO 74        * IF UNEXPECTED STATUS
   IF (SB(52) NE 0) GOTO 74       * IF ERROR ON RETRY 
   B8=SB(5) LS 4 AND 0360 
   B8=SB(6) RS 8 XOR B8           * SENSE BYTE 7
   B9=577D                        * CENTER OF COUNT FIELD 
   IF (B8 EQ 101) EXIT TO 042     * IF COUNT FIELD ERROR
   B9=601D                        * 12 BYTES FROM END OF GAP
   IF (B8 EQ 105) EXIT TO 042     * IF COUNT FIELD SYNC ERROR 
   B9=501D                        * 12 BYTES FROM END OF GAP
   IF (B8 EQ 107) EXIT TO 042     * IF DATA FIELD SYNC ERROR
   IF (B8 NE 103) GOTO 74         * IF NOT DATA ERROR 
   B9=0 
56 IF (OB(B9) NE IB(B9)) GOTO 60  * IF ERROR FOUND
   B9=B9+1
   IF (B9 LE 501) GOTO 56         * IF MORE TO CHECK
   GOTO 74                        * CANNOT FIND ERROR 
60 B9=B9 RS 1 + B9                * CONVERT TO NUMBER OF BYTES
   B9=489D-B9                     * CENTER OF SKIP AT ERROR 
   EXIT TO 042
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU042, FMDFT, (10,11,12), LOCK 
*** 5.2.6  FFU042 - CALCULATE SKIP PARAMETERS - 
**
*          PURPOSE- 
*          FFU042 CALCULATES THE NEW SKIP DISPLACEMENT PARAMETERS.
* 
*          METHOD-
*          FFU042 FIRST CALCULATES THE LOCATION OF THE NEW DEFECT 
*          RELATIVE TO INDEX.  THE HOME ADDRESS FIELD IS 326 BYTES AND
*          EACH SECTOR REQUIRES 668 BYTES SO THE FORMULA FOR THE
*          LOCATION OF THE DEFECT RELATIVE TO INDEX IS
*            326D + 668D(SECTOR NUMBER + 1) - LOCATION FOUND BY FFU041. 
*          IF THERE ARE ALREADY TWO SKIPS, THE FIRST IS ADDED TO THE
*          SECOND TO MAKE IT RELATIVE TO INDEX RATHER THAN RELATIVE TO
*          THE FIRST SKIP.  AT THIS POINT THERE WILL BE ONE NEW SKIP
*          DISPLACEMENT AND ZERO, ONE, OR TWO OLD SKIP DISPLACEMENTS
*          ALL RELATIVE TO INDEX.  THESE SKIP DISPLACEMENT PARAMETERS 
*          ARE THEN SORTED INTO ASCENDING ORDER.  THE LENGTH OF ONE 
*          SKIP (128D) IS ADDED TO THE NEW SKIP PARAMETER FOR EACH OLD
*          SKIP PARAMETER WHICH IS SMALLER THAN THE NEW ONE.  THE SECOND
*          SKIP DISPLACEMENT PARAMETER IS SUBTRACTED FROM THE THIRD AND 
*          THE FIRST IS SUBTRACTED FROM THE SECOND.  THIS MAKES THE 
*          SECOND AND THIRD SKIP DISPLACEMENT PARAMETERS RELATIVE TO
*          THE FIRST AND SECOND SKIP DISPLACEMENT PARAMETERS
*          RESPECTIVELY.  FFU042 THEN EXITS TO FFU051 TO MODIFY THE 
*          SKIP DISPLACEMENT MAP AND FORMAT THE TRACK.
/ 
*          ENTRY- 
*          FFU042 IS ENTERED FROM FFU041.  REGISTERS B5 AND B9 TO B15 
*          ARE ASSUMED TO CONTAIN VALID INFORMATION.
* 
*          EXIT-
*          FFU042 EXITS TO MODULE FFU051 TO SET SKIP DISPLACEMENT.
*          REGISTERS B1, B3, B5, AND B10 TO B15 ARE USED BY FFU051. 
* 
*          SUBMODULES REFERENCED- 
*          FFU042 CALLS SUBMODULE FFU97B TO DISPLAY A WARNING MESSAGE 
*          AND PAUSE. 
* 
*          REGISTERS USED-
*          FFU042 USES REGISTERS B1, B3, AND B5 TO B15.  REGISTERS ARE
*          USED AS FOLLOWS--
*            B1 - MAP CYLINDER
*            B3 - MAXIMUM SECTOR
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - SECTOR COUNT
*            B7 B8 - NEW SKIP DISPLACEMENT
*            B9 - LOCATION OF DEFECT
*            B10 B11 - SKIP DISPLACEMENT 1
*            B12 B13 - SKIP DISPLACEMENT 2
*            B14 B15 - SKIP DISPLACEMENT 3
* 
*          BUFFERS USED-
*          FFU042 DOES NOT USE THE INPUT OR OUTPUT BUFFERS. 
* 
* 
/  - CALCULATE SKIP PARAMETERS -
1  FORMAT CY=*OCT TR=*O SD1=*O*OCT SD2=*O*OCT SD3=*O*OCT
15 FORMAT MODULE FFU042 
20 MSG 15 TO DISPLAY
   B7=1                           * L=326D (256+70) 
   B8=70D 
   B6=P3+1                        * SET SECTOR COUNT
24 B7=B7+2                        * ADD 668D FOR EACH SECTOR
   B8=B8+156D 
   IF (B8 LT 256D) GOTO 25        * IF NO CARRY 
   B8=B8-256D 
   B7=B7+1
25 B6=B6-1                        * DECREMENT COUNT 
   IF (B6 NE 0) GOTO 24           * IF COUNT NOT ZERO 
26 IF (B9 LE B8) GOTO 30          * IF NO BORROW
   B7=B7-1
   B8=B8+256D 
   GOTO 26
30 B8=B8-B9                       * SUBTRACT DEFECT LOCATION
/ 
/  CONVERT TO ABSOLUTE SKIP 
   B10=B10 LS 4 AND 0360
   B12=B12 LS 4 AND 0360
   B10=B11 RS 8 XOR B10 
   B12=B13 RS 8 XOR B12 
   B11=B11 AND 0377 
   B13=B13 AND 0377 
   IF (B12 OR B13 EQ 0) GOTO 46   * IF NOT 2 SKIPS
   B12=B12+B10
   B13=B13+B11
   IF (B13 LT 256D) GOTO 34       * IF NO CARRY 
   B12=B12+1
   B13=B13-256D 
/ 
/  2 SKIPS
34 B8=B8+128D+64D                 * ADD 1.5 SKIPS 
   IF (B8 LT 256D) GOTO 36        * IF NO CARRY 
   B7=B7+1
   B8=B8-256D 
36 IF (B7 GT B12) GOTO 40         * IF NEW IS GT SD2
   IF (B7 LT B12) GOTO 42         * IF NEW IS LT SD2
   IF (B8 LT B13) GOTO 42         * IF NEW IS LT SD2
40 B14=B7                         * SET SD3 
   B15=B8+64D                     * ADD ANOTHER .5 SKIP 
   IF (B15 LT 256D) GOTO 61       * IF NO CARRY 
   B14=B14+1
   B15=B15-256D 
   GOTO 61                        * GO CONVERT SKIP 
42 IF (B8 GE 192D) GOTO 43        * IF NO BORRROW 
   B7=B7-1
   B8=B8+256D 
43 B8=B8-128D-64D                 * REMOVE 1.5 SKIPS
   B14=B12                        * MOVE SD2 TO SD3 
   B15=B13
   GOTO 50                        * NOW SAME AS ONE ERROR 
46 IF (B10 OR B11 EQ 0) GOTO 60   * IF NO SKIPS 
/ 
/  1 SKIP 
50 B8=B8+64D                      * ADD .5 SKIP 
   IF (B8 LT 256D) GOTO 52        * IF NO CARRY 
   B7=B7+1
   B8=B8-256D 
52 IF (B7 GT B10) GOTO 54         * IF NEW GT SD1 
   IF (B7 LT B10) GOTO 56         * IF NEW LT SD1 
   IF (B8 LT B11) GOTO 56         * IF NEW LT SD1 
54 B12=B7                         * SET SD2 
   B13=B8+64D                     * ADD ANOTHER .5 SKIP 
   IF (B13 LT 256D) GOTO 61       * IF NO CARRY 
   B12=B12+1
   B13=B13-256D 
   GOTO 61
56 IF (B8 GE 64D) GOTO 57         * IF NO BORROW
   B7=B7-1
   B8=B8+256D 
57 B8=B8-64D                      * REMOVE .5 SKIP
   B12=B10                        * MOVE SD1 TO SD2 
   B13=B11                        * NOW SAME AS NO SKIPS
/ 
/  NO PREVIOUS SKIP DISPLACEMENT
60 B10=B7 
   B11=B8 
/ 
/  CONVERT TO RELATIVE SKIP DISPLACEMENT
61 IF (B14 OR B15 EQ 0) GOTO 63   * IF NO SD3 
   B14=B14-B12
   IF (B13 LE B15) GOTO 62        * IF NO  BORROW 
   B14=B14-1
   B15=B15+256D 
62 B15=B15-B13
63 IF (B12 OR B13 EQ 0) GOTO 66   * IF NO SD2 
   B12=B12-B10
   IF (B11 LE B13) GOTO 64        * IF NO BORROW
   B12=B12-1
   B13=B13+256D 
64 B13=B13-B11
66 B8=B10 LS 8 AND 7400           * CONVERT TO 4/8 BIT FORMAT 
   B10=B10 RS 4 
   B11=B11 XOR B8 
   B8=B12 LS 8 AND 7400 
   B12=B12 RS 4 
   B13=B13 XOR B8 
   B8=B14 LS 8 AND 7400 
   B14=B14 RS 4 
   B15=B15 XOR B8 
   MSG 1 (P1,P2,B10,B11,B12,B13,B14,B15) TO LINE B5 
   B5=B5+2
   B9=B15                         * SAVE B15
   B15=2                          * SET MESSAGE NUMBER
   CALL 97B                       * PAUSE 
   B15=B9                         * RESET B15 
   B1=1057                        * RESET MAP CYLINDER
   B3=33                          * RESET MAXIMUM SECTOR
   EXIT TO 051                    * GO SET SKIP DISPLACEMENT
77 END 20 
COMPILE 
   MODULE FFU05, FMDFT, (12), LOCK
*** 5.2.7  FFU05 - SET OR CLEAR SKIP DISPLACEMENT 
**
*          PURPOSE- 
*          FFU05 ADDS, DELETES, OR CHANGES AN ENTRY IN THE SKIP 
*          DISPLACEMENT MAP AND FORMATS THE TRACK ON THE ASSIGNED 317 
*          MEGABYTE DRIVE.  IF THE TRACK IS INITIALLY FLAWED, FFU05 WILL
*          CLEAR THE TRACK FLAW.
* 
*          METHOD-
*          FFU05 VERIFIES THAT THE CYLINDER AND TRACK SPECIFIED ARE 
*          VALID.  THE SKIP DISPLACEMENT PARAMETERS ARE THEN COPIED 
*          TO REGISTERS AND FFU05 EXITS TO FFU051.
*          FFU051 READS THE FLAW MAPS AND WILL DELETE THE TRACK FLAW
*          ENTRY AND REWRITE THE TRACK FLAW MAP IF A TRACK FLAW IS
*          SET FOR THE DESIGNATED TRACK.  FFU051 WILL THEN LOOK FOR 
*          AN ENTRY IN THE SKIP DISPLACEMENT MAP FOR THAT TRACK.  IF
*          ONE IS FOUND IT IS REPLACED BY THE NEW ENTRY SPECIFIED.  IF
*          NONE IS FOUND A NEW ENTRY IS ADDED AT THE END OF THE MAP.  IF
*          THE SKIP DISPLACEMENT PARAMETERS ARE ALL ZERO THE OLD ENTRY
*          WILL BE DELETED FROM THE MAP.  AFTER THE MAPS HAVE BEEN
*          REWRITTEN THE TRACK IS FORMATTED.
* 
*          ENTRY- 
*          FFU05 IS ONLY FOR USE ON 317 MEGABYTE DRIVES.
*          FFU05 REQUIRES PARAMETERS P1, P2, AND P4 TO P9 TO BE SET TO
*          SPECIFY THE SKIP DISPLACEMENT MAP ENTRY.  PARAMETER USAGE
*          AND ALLOWED OCTAL VALUES ARE SHOWN BELOW-- 
* 
*                  PARAMETERS                             317 MBYTE 
*            ---------------------------------------   ---------------- 
*            P1 - CYLINDER                                0 TO 1057 
*            P2 - TRACK                                    0 TO 35
*            P4 P5 - SKIP DISPLACEMENT 1               0 0000 TO 4 5175 
*            P6 P7 - SKIP DISPLACEMENT 2 (REL TO SD1)  0 0000 TO 4 5175 
*            P8 P9 - SKIP DISPLACEMENT 3 (REL TO SD2)  0 0000 TO 4 5175 
* 
*          AN ERROR MESSAGE IS DISPLAYED IF P1 OR P2 IS TOO LARGE OR IF 
*          THE MAP TRACK IS SPECIFIED.
/ 
*          EXIT-
*          FFU05 EXITS TO FFU051.  SKIP DISPLACEMENT PARAMETERS ARE 
*          STORED IN REGISTERS B10 TO B15.
* 
*          SUBMODULES REFERENCED- 
*          FFU05 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU05 CALLS FFU98A TO DISPLAY DETAILED STATUS IF AN 
*          I/O FUNCTION IS ABORTED.  FFU05 CALLS FFU97B TO  DISPLAY A 
*          WARNING MESSAGE AND PAUSE. 
* 
*          REGISTERS USED-
*          FFU05 USES REGISTERS B0 TO B2, B4, B5, AND B10 TO B15. 
*          REGISTERS ARE USED AS FOLLOWS--
*            B0 - ERROR FLAG (SET BY FFU97A)
*            B1 - MAXIMUM CYLINDER (SET BY FFU97A)
*            B2 - MAXIMUM TRACK (SET BY FFU97A) 
*            B4 - DEVICE SIZE (SET BY FFU97A) 
*            B5 - K DISPLAY LINE NUMBER 
*            B10 B11 - SKIP DISPLACEMENT 1
*            B12 B13 - SKIP DISPLACEMENT 2
*            B14 B15 - SKIP DISPLACEMENT 3
* 
*          BUFFERS USED-
*          FFU05 DOES NOT USE THE INPUT OR OUTPUT BUFFERS.
* 
* 
/  - SET SKIP DISPLACEMENT -
/ 
1  FORMAT SET SKIP  DISPLACEMENT - CH=*O, EQ=*O, UN=*O
2  FORMAT CY=*OCT TR=*O SD1=*O*OCT SD2=*O*OCT SD3=*O*OCT
11 FORMAT ERROR - ACCESS LEVEL TOO LOW (MINIMUM AL=4) 
12 FORMAT ERROR - MAX CY = *OCT FOR *OC MBYTE DEVICE
13 FORMAT ERROR - MAX TR = *O FOR *OC MBYTE DEVICE
14 FORMAT ERROR - USE FFU14 FOR MAP TRACK 
15 FORMAT MODULE FFU05
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   MSG 2 (P1,P2,P4,P5,P6,P7,P8,P9) TO LINE 3
   IF (AL GE 4) GOTO 21           * IF VALID ACCESS LEVEL 
   MSG 11 TO LINE 5               * ACCESS LEVEL TOO LOW
   GOTO 22
21 B5=5                           * SET DISPLAY LINE
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * IF ERROR
   IF (P1 LE B1) GOTO 24          * IF VALID CYLINDER 
   MSG 12 (B1,B4) TO LINE 5       * ILLEGAL CYLINDER
22 MSG 16 TO LINE 7 
   PICTURE
   GOTO 77                        * ERROR EXIT
24 IF (P2 LE B2) GOTO 26          * IF VALID TRACK
   MSG 13 (B2,B4) TO LINE 5       * ILLEGAL TRACK 
   GOTO 22
26 IF (P1 LT B1) GOTO 30          * IF NOT MAP CYLINDER 
   IF (P2 NE 0) GOTO 30           * IF NOT MAP TRACK
   MSG 14 TO LINE 5 
   GOTO 22
30 B15=2                          * SET MESSAGE NUMBER
   CALL 97B                       * PAUSE 
   B10=P4                         * SET SKIP DISPLACEMENT 
   B11=P5 
   B12=P6 
   B13=P7 
   B14=P8 
   B15=P9 
   EXIT TO 051                    * GO MODIFY MAPS
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
   MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU051, FMDFT, (12), LOCK 
*** 5.2.8  FFU051 - SET OR CLEAR SKIP DISPLACEMENT (CONTINUED)
**
*          PURPOSE- 
*          FFU051 ADDS, DELETES, OR CHANGES AN ENTRY IN THE SKIP
*          DISPLACEMENT MAP AND FORMATS THE SPECIFIED TRACK.
* 
*          METHOD-
*          FFU051 IS ENTERED FROM FFU042 OR FFU05.  FFU051 STARTS BY
*          READING THE TRACK FLAW MAP AND IF AN ENTRY IS FOUND FOR THE
*          SPECIFIED TRACK THE ENTRY IS DELETED AND THE MAP IS
*          REWRITTEN.  FFU051 THEN READS THE SKIP DISPLACEMENT MAP AND
*          LOOKS FOR AN ENTRY FOR THE SPECIFIED TRACK.  IF ONE IS FOUND 
*          IT IS REPLACED BY THE NEW ENTRY.  IF NONE IS FOUND THE NEW 
*          ENTRY IS ADDED AT THE END OF THE MAP.  IF THE NEW ENTRY IS 
*          ALL ZEROS FFU051 EXITS TO FFU052 TO DELETE THE OLD ENTRY 
*          FROM THE MAP.  AFTER THE MAP HAS BEEN REWRITTEN, FFU051
*          FORMATS THE TRACK. 
/ 
*          ENTRY- 
*          FFU051 MAKES USE OF PARAMETERS P1 AND P2 AS DEFINED FOR
*          MODULE FFU05.  REGISTERS B0, B1, B3, B5, AND B10 TO B15 ARE
*          ASSUMED TO CONTAIN VALID INFORMATION.
* 
*          EXIT-
*          FFU051 EXITS TO FFU052 IF THE SKIP DISPLACEMENT IS SPECIFIED 
*          TO BE ALL ZERO (CLEAR SKIP DISPLACEMENT).  FFU051 EXITS TO 
*          FFU053 IF THE SKIP DISPLACEMENT IS TO BE ADDED AT THE END OF 
*          THE MAP.  OTHERWISE FFU051 TERMINATES WITH AN END STATEMENT. 
*          REGISTERS B0, B3, B5, B6, AND B7 ARE USED BY FFU052. 
*          REGISTERS B0, B1, B3, B5 TO B8, AND B10 TO B15 ARE USED BY 
*          FFU053.
* 
*          SUBMODULES REFERENCED- 
*          FFU051 CALLS SUBMODULE FFU98A TO DISPLAY DETAILED STATUS IF
*          AN I/O FUNCTION IS ABORTED.
* 
*          REGISTERS USED-
*          FFU051 USES REGISTERS B0, B1, B3, B5 TO B8, AND B10 TO B15.
*          REGISTERS ARE USED AS FOLLOWS--
*            B0 - MAP TRACK (SET TO ZERO BY FFU97A) 
*            B1 - MAP CYLINDER (SET BY FFU97A OR FFU042)
*            B3 - MAXIMUM SECTOR (SET BY FFU97A OR FFU042)
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - MAP SECTOR
*            B7 - INPUT BUFFER INDEX AND OUTPUT BUFFER INDEX
*            B8 - INPUT BUFFER INDEX AND SCRATCH PAD
*            B10 B11 - SKIP DISPLACEMENT 1
*            B12 B13 - SKIP DISPLACEMENT 2
*            B14 B15 - SKIP DISPLACEMENT 3
* 
*          BUFFERS USED-
*          FFU051 USES THE INPUT BUFFER FOR THE FLAW MAPS READ FROM THE 
*          DISK.  THE OUTPUT BUFFER IS USED FOR WRITING THE FLAW MAPS 
*          BACK TO THE DISK AND FOR PARAMETERS FOR FORMATTING.
* 
* 
/  - SET SKIP DISPLACEMENT (CONTINUED) -
/ 
7  FORMAT ERROR - SKIP DISPLACEMENT MAP FULL
10 FORMAT ERROR - SKIP DISPLACEMENT ALREADY CLEAR 
11 FORMAT TRACK FLAW CLEARED
12 FORMAT SKIP DISPLACEMENT SET 
13 FORMAT TRACK FORMATTING COMPLETE 
15 FORMAT MODULE FFU051 
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 MSG 15 TO DISPLAY
/ 
/  CHECK TRACK FLAWS
   B6=1                           * SET MAP SECTOR
   RES DRIVE, ABT 74
   GET FACTORY SECTOR B6, ABT 74  * READ TRACK FLAW MAP 
   B7=0 
21 OB(B7)=0                       * CLEAR OUTPUT BUFFER 
   B7=B7+1
   IF (B7 LT 502) GOTO 21         * IF MORE TO CLEAR
   B7=0                           * RESET OB INDEX
22 B8=B7+1
   IF (IB(B7) AND 4000 EQ 0) GOTO 30   * IF END OF MAP
   IF (IB(B7) AND 1777 NE P1) GOTO 24  * IF NO CYLINDER MATCH 
   IF (IB(B8) RS 6 EQ P2) GOTO 25      * IF TRACK FOUND 
24 B7=B7+2                        * TRY NEXT ENTRY
   IF (B7 LT 318D) GOTO 22        * IF NOT END OF MAP 
   GOTO 30                        * NO TRACK FLAW 
/ 
/  CLEAR TRACK FLAW 
25 COPY IB TO OB FOR 318D 
26 IF (IB(B7) AND 4000 EQ 0) GOTO 27   * IF END OF MAP
   B8=B7+2
   OB(B7)=IB(B8)                  * DELETE FLAW 
   B7=B7+1
   B8=B7+2
   OB(B7)=IB(B8)
   B7=B7+1                        * INCREMENT INDEX 
   IF (B7 LT 318D) GOTO 26
27 OB(B7)=0                       * CLEAR END OF BUFFER 
   B7=B7+1
   IF (B7 LT 502) GOTO 27         * IF NOT DONE CLEARING
   WRPRO CYL B1 TRK B0 SEC B6, ABT 74  * WRITE TRACK FLAW MAP 
   MSG 11 TO LINE B5              * TRACK FLAW CLEARED
   B5=B5+2
/ 
/  CHECK SKIP DISPLACEMENT
30 B6=3                           * SET MAP SECTOR
31 RES DRIVE, ABT 74
   GET FACTORY SECTOR B6, ABT 74  * READ SKIP DISPLACEMENT
   B7=0 
32 B8=B7+1
   IF (IB(B7) AND 4000 EQ 0) EXIT TO 053    * IF END OF MAP 
   IF (IB(B7) AND 1777 NE P1) GOTO 34  * IF NO CYLINDER MATCH 
   IF (IB(B8) RS 6 EQ P2) GOTO 36      * IF TRACK FOUND 
34 B7=B7+6                        * TRY NEXT ENTRY
   IF (B7 LT 318D) GOTO 32        * IF NOT END OF SECTOR
   B6=B6+1                        * NEXT SECTOR 
   IF (B6 LE B3) GOTO 31          * IF MORE SECTORS 
   MSG 7 TO LINE B5               * MAP FULL
   IF (B10 OR B11 NE 0) GOTO 43   * IF SETTING SKIP 
   IF (B12 OR B13 NE 0) GOTO 43   * IF SETTING SKIP 
   IF (B14 OR B15 NE 0) GOTO 43   * IF SETTING SKIP 
   MSG 10 TO LINE B5              * SKIP ALREADY CLEAR
   GOTO 43                        * ERROR STOP
/ 
/  MODIFY EXISTING SKIP DISPLACEMENT
36 IF (B10 OR B11 NE 0) GOTO 37   * IF SETTING SKIP 
   IF (B12 OR B13 NE 0) GOTO 37   * IF SETTING SKIP 
   IF (B14 OR B15 NE 0) GOTO 37   * IF SETTING SKIP 
   EXIT TO 052                    * GO CLEAR SKIP 
37 B7=B7+2                        * SET INDEX 
   COPY IB TO OB FOR 318D 
   GOSUB 70                       * SET SKIP DISPLACEMENT 
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B0 SEC B6, ABT 74  * WRITE SECTOR 
40 MSG 12 TO LINE B5              * SKIP SET
   B5=B5+2
/ 
/  FORMAT TRACK 
   B7=3 
   OB(0)=P1                       * SET FORMAT PARAMETERS 
   OB(1)=SB(63) AND 0077
   OB(2)=P2 
   GOSUB 70                       * SET SKIP DISPLACEMENT 
   RES DRIVE, ABT 74
   REFORM OB(0), ABT 74           * FORMAT ONE TRACK
42 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 42     * IF BUSY 
   IF (SB NE 0) GOTO 72           * IF ERROR ON FORMAT
   MSG 13 TO LINE B5              * FORMATTING COMPLETE 
43 B5=B5+2
   GOTO 76                        * END OF MODULE 
/ 
/  SET SKIP DISPLACEMENT
70 B8=B14 LS 8 AND 7400 
   OB(B7)=B15 RS 4 XOR B8         * WORD 2
   B7=B7+1
   B8=B15 LS 8 AND 7400 
   OB(B7)=B12 LS 4 AND 0360 
   OB(B7)=B13 RS 8 XOR OB(B7) 
   OB(B7)=OB(B7) XOR B8           * WORD 3
   B7=B7+1
   B8=B13 LS 4 AND 7760 
   OB(B7)=B10 AND 0017 XOR B8     * WORD 4
   B7=B7+1
   OB(B7)=B11                     * WORD 5
   RETURN 
72 STATUS DETAIL, ABT 74          * GET DETAILED STATUS 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU052, FMDFT, (12), LOCK 
*** 5.2.9  FFU052 - CLEAR SKIP DISPLACEMENT (CONTINUED) 
**
*          PURPOSE- 
*          FFU052 DELETES AN ENTRY FROM THE SKIP DISPLACEMENT MAP AND 
*          FORMATS THE SPECIFIED TRACK. 
* 
*          METHOD-
*          FFU052 DELETES THE SPECIFIED ENTRY FROM THE SKIP DISPLACEMENT
*          MAP SECTOR CONTAINED IN THE INPUT BUFFER AND REWRITES THAT 
*          SECTOR AND ALL SUBSEQUENT SECTORS UNTIL THE END OF THE MAP 
*          IS ENCOUNTERED.  FFU052 THEN FORMATS THE TRACK.
/ 
*          ENTRY
*          FFU052 IS ENTERED FROM FFU051.  FFU052 ASSUMES THAT REGISTERS
*          B0, B3, B5, B6, AND B7 CONTAIN VALID INFORMATION.
* 
*          EXIT-
*          FFU052 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU052 CALLS SUBMODULE FFU98A TO DISPLAY DETAILED STATUS IF
*          AN I/O FUNCTION IS ABORTED.
* 
*          REGISTERS USED-
*          FFU052 USES REGISTERS B0, B3, AND B5 TO B8.  REGISTERS ARE 
*          USED AS FOLLOWS--
*            B0 - MAP TRACK (SET TO ZERO BY FFU97A) 
*            B3 - MAXIMUM SECTOR (SET BY FFU97A)
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - MAP SECTOR
*            B7 - OUTPUT BUFFER INDEX 
*            B8 - INPUT BUFFER INDEX
* 
*          BUFFERS USED-
*          FFU052 USES THE INPUT BUFFER FOR THE FLAW MAPS READ FROM THE 
*          DISK.  THE OUTPUT BUFFER IS USED FOR WRITING THE FLAW MAPS 
*          BACK TO THE DISK AND FOR PARAMETERS FOR FORMATTING.
* 
/  - CLEAR SKIP DISPLACEMENT (CONTINUED) -
/ 
12 FORMAT SKIP DISPLACEMENT CLEARED 
13 FORMAT TRACK FORMATTING COMPLETE 
15 FORMAT MODULE FFU052 
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 MSG 15 TO DISPLAY
21 COPY IB TO OB FOR 318D 
22 B8=B7+6
   OB(B7)=IB(B8)                  * SHIFT UP
   B7=B7+1
   IF (B7 LT 312D) GOTO 22        * IF NOT DONE SHIFTING
24 OB(B7)=0                       * CLEAR END OF BUFFER 
   B7=B7+1
   IF (B7 LT 502) GOTO 24         * IF NOT DONE CLEARING
   B7=0 
26 IF (OB(B7) AND 4000 EQ 0) GOTO 40   * IF END OF MAP
   B7=B7+6
   IF (B7 LT 312D) GOTO 26        * IF MORE ENTRIES 
   IF (B6 GE B3) GOTO 40          * IF NO MORE SECTORS
   B6=B6+1
   RES DRIVE, ABT 74
   GET FACTORY SECTOR B6, ABT 74  * READ NEXT SECTOR
   B6=B6-1
   OB(312D)=IB(0) 
   OB(313D)=IB(1) 
   OB(314D)=IB(2) 
   OB(315D)=IB(3) 
   OB(316D)=IB(4) 
   OB(317D)=IB(5) 
32 RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B0 SEC B6, ABT 74  * WRITE SECTOR 
   B6=B6+1
   IF (OB(312D) AND 4000 EQ 0) GOTO 42      * IF END OF MAP 
   B7=0                           * RESET INDEX 
   GOTO 21                        * LOOP UNTIL END OF MAP 
40 OB(B7)=0                       * CLEAR END OF BUFFER 
   B7=B7+1
   IF (B7 LT 502) GOTO 40         * IF NOT DONE CLEARING
   GOTO 32
42 MSG 12 TO LINE B5              * SKIP CLEARED
   B5=B5+2
/ 
/  FORMAT TRACK 
   OB(0)=P1                       * SET FORMAT PARAMETERS 
   OB(1)=SB(63) AND 0077
   OB(2)=P2 
   OB(3)=0
   OB(4)=0
   OB(5)=0
   OB(6)=0
   RES DRIVE, ABT 74
   REFORM OB(0), ABT 74           *  FORMAT ONE TRACK 
44 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 44     * IF BUSY 
   IF (SB NE 0) GOTO 72           * IF ERROR ON FORMAT
   MSG 13 TO LINE B5              * FORMATTING COMPLETE 
   B5=B5+2
   MSG 16 TO LINE B5
   PICTURE
   GOTO 77
72 STATUS DETAIL, ABT 74          * GET DETAILED STATUS 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU053, FMDFT, (12), LOCK 
*** 5.2.10 FFU053 - SET SKIP DISPLACEMENT (CONTINUED) 
**
*          PURPOSE- 
*          FFU053 ADDS AN ENTRY TO THE SKIP DISPLACEMENT MAP AND
*          FORMATS THE SPECIFIED TRACK. 
* 
*          METHOD-
*          FFU053 IS ENTERED FROM FFU051.  FFU053 ADDS A NEW ENTRY AT 
*          THE END OF THE SKIP DISPLACEMENT MAP AND FORMATS THE 
*          TRACK. 
/ 
*          ENTRY- 
*          FFU053 MAKES USE OF PARAMETERS P1 AND P2 AS DEFINED FOR
*          MODULE FFU05.  FFU053 ASSUMES THAT REGISTERS B0, B1, B3, 
*          B5, B6, B7, B8, AND B10 TO B15 CONTAIN VALID INFORMATION.
* 
*          EXIT-
*          FFU053 TERMINATES WITH AN END STATEMENT. REGISTER CONTENTS 
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU053 CALLS SUBMODULE FFU98A TO DISPLAY DETAILED STATUS IF
*          AN I/O FUNCTION IS ABORTED.
* 
*          REGISTERS USED-
*          FFU053 USES REGISTERS B0, B1, B3, B5 TO B8, AND B10 TO B15.
*          REGISTERS ARE USED AS FOLLOWS--
*            B0 - MAP TRACK (SET TO ZERO BY FFU97A) 
*            B1 - MAP CYLINDER (SET BY FFU97A)
*            B3 - MAXIMUM SECTOR (SET BY FFU97A)
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - MAP SECTOR
*            B7 - BUFFER INDEX
*            B8 - BUFFER INDEX AND SCRATCH PAD
*            B10 B11 - SKIP DISPLACEMENT 1
*            B12 B13 - SKIP DISPLACEMENT 2
*            B14 B15 - SKIP DISPLACEMENT 3
* 
*          BUFFERS USED-
*          FFU053 USES THE INPUT BUFFER FOR THE FLAW MAPS READ FROM THE 
*          DISK.  THE OUTPUT BUFFER IS USED FOR WRITING THE FLAW MAPS 
*          BACK TO THE DISK AND FOR PARAMETERS FOR FORMATTING.
* 
* 
/  - SET SKIP DISPLACEMENT (CONTINUED) -
/ 
10 FORMAT ERROR - SKIP DISPLACEMENT ALREADY CLEAR 
12 FORMAT SKIP DISPLACEMENT SET 
13 FORMAT TRACK FORMATTING COMPLETE 
15 FORMAT MODULE FFU053 
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 MSG 15 TO DISPLAY
/ 
/  ADD SKIP DISPLACEMENT
   COPY IB TO OB FOR 318D 
   IF (B10 OR B11 NE 0) GOTO 25   * IF SETTING SKIP 
   IF (B12 OR B13 NE 0) GOTO 25   * IF SETTING SKIP 
   IF (B14 OR B15 NE 0) GOTO 25   * IF SETTING SKIP 
   MSG 10 TO LINE B5              * NO SKIP TO CLEAR
   GOTO 43                        * ERROR STOP
25 OB(B7)=P1 OR 4000              * SET CYLINDER
   OB(B8)=P2 LS 6 AND 7700        * SET TRACK 
   B7=B7+2
   GOSUB 70                       * SET SKIP DISPLACEMENT 
   B8=B7+1
26 OB(B8)=0                       * CLEAR END OF BUFFER 
   B8=B8+1
   IF (B8 LT 502) GOTO 26         * IF NOT DONE CLEARING
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B0 SEC B6, ABT 74  * WRITE SECTOR 
   IF (B7 LT 317D) GOTO 40        * IF MAP SECTOR NOT FULL
   B7=0 
32 OB(B7)=0                       * CLEAR OUTPUT BUFFER 
   B7=B7+1
   IF (B7 LT 502) GOTO 32         * IF NOT DONE CLEARING
   B6=B6+1                        * NEXT SECTOR 
   IF (B6 GT B3) GOTO 40          * IF NO MORE SECTORS
   WRPRO CYL B1 TRK B0 SEC B6, ABT 74  * WRITE SECTOR 
40 MSG 12 TO LINE B5              * SKIP SET
   B5=B5+2
/ 
/  FORMAT TRACK 
   B7=3 
   OB(0)=P1                       * SET FORMAT PARAMETERS 
   OB(1)=SB(63) AND 0077
   OB(2)=P2 
   GOSUB 70                       * SET SKIP DISPLACEMENT 
   RES DRIVE, ABT 74
   REFORM OB(0), ABT 74           * FORMAT ONE TRACK
42 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 42     * IF BUSY 
   IF (SB NE 0) GOTO 72           * IF ERROR ON FORMAT
   MSG 13 TO LINE B5              * FORMATTING COMPLETE 
43 B5=B5+2
   GOTO 76                        * END OF MODULE 
/ 
/  SET SKIP DISPLACEMENT
70 B8=B14 LS 8 AND 7400 
   OB(B7)=B15 RS 4 XOR B8         * WORD 2
   B7=B7+1
   B8=B15 LS 8 AND 7400 
   OB(B7)=B12 LS 4 AND 0360 
   OB(B7)=B13 RS 8 XOR OB(B7) 
   OB(B7)=OB(B7) XOR B8           * WORD 3
   B7=B7+1
   B8=B13 LS 4 AND 7760 
   OB(B7)=B10 AND 0017 XOR B8     * WORD 4
   B7=B7+1
   OB(B7)=B11                     * WORD 5
   RETURN 
72 STATUS DETAIL, ABT 74          * GET DETAILED STATUS 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU07, FMDFT, (10,11,12), LOCK
*** 5.2.11 FFU07 - SET TRACK FLAW 
**
*          PURPOSE- 
*          FFU07 ENTERS A FLAW IN THE UTILITY FLAW MAP AND FORMATS THE
*          SPECIFIED TRACK TO SET A TRACK FLAW. 
* 
*          METHOD-
*          FFU07 CHECKS PARAMETERS AND THEN EXITS TO FFU071 TO MODIFY 
*          THE FLAW MAP AND FORMAT THE TRACK. 
* 
*          ENTRY- 
*          FFU07 REQUIRES PARAMETERS P1 AND P2 SET TO INDICATE THE
*          TRACK TO BE FLAWED.  PARAMETER USAGE AND ALLOWED OCTAL 
*          VALUES FOR EACH DEVICE SIZE ARE SHOWN BELOW--
* 
*               PARAMETERS      317 MBYTE   200 MBYTE   100 MBYTE 
*            ----------------   ---------   ---------   --------- 
*            P1 - CYLINDER      0 TO 1057   0 TO 1456   0 TO 632
*            P2 - TRACK          0 TO 35     0 TO 22     0 TO 22
* 
*          AN ERROR MESSAGE IS DISPLAYED IF EITHER OF THE PARAMETERS
*          IS TOO LARGE OR IF THE MAP TRACK IS SPECIFIED. 
/ 
*          EXIT-
*          FFU07 EXITS TO FFU071.  REGISTERS B1, B5, AND B15 ARE USED BY
*          FFU071.
* 
*          SUBMODULES REFERENCED- 
*          FFU07 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU07 ALSO CALLS FFU98A TO DISPLAY DETAILED STATUS IF 
*          AN I/O FUNCTION IS ABORTED.
* 
*          REGISTERS USED-
*          FFU07 USES REGISTERS B0, B1, B2, B4, B5, AND B15.  REGISTERS 
*          ARE USED AS FOLLOWS--
*            B0 - ERROR FLAG (SET BY FFU97A)
*            B1 - MAXIMUM CYLINDER (SET BY FFU97A)
*            B2 - MAXIMUM TRACK (SET BY FFU97A) 
*            B4 - DEVICE SIZE (SET BY FFU97A) 
*            B5 - K DISPLAY LINE NUMBER 
*           B15 - MESSAGE NUMBER FOR PAUSE
* 
*          BUFFERS USED-
*          FFU07 DOES NOT USE INPUT OR OUTPUT BUFFERS.
* 
* 
/  - SET TRACK FLAW - 
/ 
1  FORMAT SET TRACK FLAW - CH=*O, EQ=*O, UN=*O
2  FORMAT CYLINDER = *OCT,  TRACK = *O
5  FORMAT ERROR - MAP TRACK CANNOT BE FLAWED
11 FORMAT ERROR - ACCESS LEVEL TOO LOW (MINIMUM AL=4) 
12 FORMAT ERROR - MAX CY = *OCT FOR *OC MBYTE DEVICE
13 FORMAT ERROR - MAX TR = *O FOR *OC MBYTE DEVICE
15 FORMAT MODULE FFU07
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   MSG 2 (P1,P2) TO LINE 3
   IF (AL GE 4) GOTO 21           * IF VALID ACCESS LEVEL 
   MSG 11 TO LINE 5               * ACCESS LEVEL TOO LOW
   GOTO 26
21 B5=5                           * SET DISPLAY LINE
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * ABORT IF ERROR
   IF (P1 LE B1) GOTO 22          * IF P1 VALID 
   MSG 12 (B1,B4) TO LINE 5       * P1 TOO LARGE
   GOTO 26
22 IF (P2 LE B2) GOTO 24          * IF P2 VAILD 
   MSG 13 (B2,B4) TO LINE 5       * P2 TOO LARGE
   GOTO 26
24 IF (P1 LT B1) GOTO 27          * IF NOT MAP CYLINDER 
   IF (P2 NE 0) GOTO 27           * IF NOT MAP TRACK
   MSG 5 TO LINE 5                * CANNOT FLAW MAP TRACK 
26 MSG 16 TO LINE 7 
   PICTURE
   GOTO 77                        * ERROR EXIT
27 B15=2                          * SET MESSAGE NUMBER
   EXIT TO 071                    * GO SET FLAW 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU071, FMDFT, (10,11,12), LOCK 
*** 5.2.12 FFU071 - SET TRACK FLAW (CONTINUED)
**
*          PURPOSE- 
*          FFU071 ENTERS A FLAW IN THE UTILITY FLAW MAP AND FORMATS THE 
*          SPECIFIED TRACK TO SET A TRACK FLAW. 
* 
*          METHOD-
*          FFU071 READS THE TRACK FLAW MAP FROM TRACK 0, SECTOR 1 OF
*          THE PROTECTED AREA.  THE SPECIFIED FLAW IS ADDED AT THE END
*          OF THE MAP AND THE MAP IS REWRITTEN.  FFU071 THEN FORMATS
*          THE SPECIFIED TRACK TO SET A TRACK FLAW.  IF THE TRACK FLAW
*          IS ALREADY SET AN ERROR MESSAGE IS DISPLAYED.
/ 
*          ENTRY- 
*          FFU071 IS ENTERED FROM FFU04 OR FROM FFU07.  REGISTERS B1, 
*          B5, AND B15 ARE ASSUMED TO CONTAIN VALID INFORMATION.
* 
*          EXIT-
*          FFU071 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU071 CALLS SUBMODULE FFU97B TO DISPLAY A WARNING MESSAGE 
*          AND PAUSE.  FFU071 ALSO CALLS FFU98A TO DISPLAY DETAILED 
*          STATUS IF AN I/O FUNCTION IS ABORTED.
* 
*          REGISTERS USED-
*          FFU071 USES REGISTERS B1, B3, B5 TO B8, AND B15.  REGISTERS
*          ARE USED AS FOLLOWS--
*            B1 - MAP CYLINDER
*            B3 - MAP SECTOR
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - INPUT BUFFER INDEX
*            B7 - INPUT BUFFER INDEX
*            B8 - MAP TRACK 
*           B15 - MESSAGE NUMBER FOR PAUSE
* 
*          BUFFERS USED-
*          FFU071 USES THE INPUT BUFFER FOR THE TRACK FLAW MAP READ 
*          FROM THE DISK.  THE OUTPUT BUFFER IS USED FOR WRITING THE
*          TRACK FLAW MAP BACK TO THE DISK.  THE OUTPUT BUFFER IS ALSO
*          USED FOR FORMAT PARAMETERS.
* 
* 
/  - SET TRACK FLAW (CONTINUED) - 
3  FORMAT ERROR - TRACK FLAW ALREADY SET
4  FORMAT ERROR - TRACK FLAW MAP FULL 
6  FORMAT TRACK FLAW SET
7  FORMAT TRACK FORMATTING COMPLETE 
15 FORMAT MODULE FFU071 
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 MSG 15 TO DISPLAY
   B3=1                           * SET SECTOR
   RES DRIVE, ABT 74
   GET FACTORY SECTOR B3, ABT 74  * READ TRACK FLAWS
   B6=0                           * SET BUFFER INDEX
30 B7=B6+1
   IF (IB(B6) AND 4000 EQ 0) GOTO 40   * IF END OF MAP
   IF (IB(B6) AND 1777 NE P1) GOTO 32  * NO CYLINDER MATCH
   IF (IB(B7) RS 6 NE P2) GOTO 32      * NO TRACK MATCH 
   MSG 3 TO LINE B5               * FLAW ALREADY SET
   B5=B5+2
   GOTO 76                        * ERROR EXIT
32 B6=B6+2
   IF (B6 LT 318D) GOTO 30        * IF NOT END OF SECTOR
   MSG 4 TO LINE B5               * FLAW MAP FULL 
   B5=B5+2
   GOTO 76                        * ERROR EXIT
40 IB(B6)=P1 XOR 4000             * SET TRACK FLAW
   IB(B7)=P2 LS 6 AND 7700
   B6=B6+2
   COPY IB TO OB FOR 318D 
42 OB(B6)=0                       * CLEAR END OF BUFFER 
   B6=B6+1
   IF (B6 LT 502) GOTO 42         * IF NOT DONE CLEARING
   B8=0                           * SET TRACK 
   CALL 97B                       * PAUSE 
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B8 SEC B3, ABT 74  * WRITE MAP
   MSG 6 TO LINE B5 
   B5=B5+2
   OB(300)=P1                     * SET FORMAT PARAMETERS 
   OB(301)=SB(63) AND 0077 XOR 0100 
   OB(302)=P2 
   OB(303)=0
   OB(304)=0
   OB(305)=0
   OB(306)=0
   IF (DC NE 12) GOTO 60          * IF NOT 317 MBYTE DEVICE 
   B3=3                           * SET SECTOR
50 RES DRIVE, ABT 74
   GET FACTORY SECTOR B3, ABT 74  * READ SKIP DISPLACEMENT
   B6=0 
51 B7=B6+1
   IF (IB(B6) AND 4000 EQ 0) GOTO 60   * IF END OF MAP
   IF (IB(B6) AND 1777 NE P1) GOTO 52  * NO CYLINDER MATCH
   IF (IB(B7) RS 6 EQ P2) GOTO 54      * IF MATCH 
52 B6=B6+6                        * INCREMENT INDEX 
   IF (B6 LT 318D) GOTO 51        * IF NOT END OF SECTOR
   B3=B3+1                        * NEXT SECTOR 
   IF (B3 LE 33) GOTO 50          * IF MORE SECTORS 
   GOTO 60                        * NO SKIP DISPLACEMENT FOUND
54 B7=B7+1
   OB(303)=IB(B7)                 * SET SKIP DISPLACEMENT 
   B7=B7+1
   OB(304)=IB(B7) 
   B7=B7+1
   OB(305)=IB(B7) 
   B7=B7+1
   OB(306)=IB(B7) 
60 RES DRIVE, ABT 74
   REFORM OB(300), ABT 74         * FORMAT TRACK
61 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 61     * IF BUSY 
   IF (SB NE 0) GOTO 72           * IF ERROR ON FORMAT
   MSG 7 TO LINE B5 
   B5=B5+2
   GOTO 76                        * END OF MODULE 
72 STATUS DETAIL, ABT 74          * GET DETAILED STATUS 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU10, FMDFT, (10,11,12), LOCK
*** 5.2.13 FFU10 - CLEAR TRACK FLAW 
**
*          PURPOSE- 
*          FFU10 CLEARS A TRACK FLAW AND REMOVES THE FLAW FROM THE
*          UTILITY FLAW MAP.
* 
*          METHOD-
*          FFU10 READS THE TRACK FLAW MAP FROM TRACK 0, SECTOR 1 OF THE 
*          PROTECTED AREA.  THE SPECIFIED FLAW IS DELETED AND THE MAP IS
*          REWRITTEN.  FFU10 THEN FORMATS THE SPECIFIED TRACK.  IF
*          THERE IS INITIALLY NO ENTRY FOR THE TRACK FLAW IN THE FLAW 
*          MAP AN ERROR MESSAGE IS DISPLAYED AND FFU10 HALTS. 
* 
*          ENTRY- 
*          FFU10 REQUIRES P1 AND P2 SET TO INDICATE THE TRACK FLAW
*          TO BE CLEARED.  PARAMETER USAGE AND ALLOWED OCTAL VALUES 
*          FOR EACH DEVICE SIZE ARE SHOWN BELOW-- 
* 
*               PARAMETERS      317 MBYTE   200 MBYTE   100 MBYTE 
*            ----------------   ---------   ---------   --------- 
*            P1 - CYLINDER      0 TO 1057   0 TO 1456   0 TO 632
*            P2 - TRACK          0 TO 35     0 TO 22     0 TO 22
* 
*          AN ERROR MESSAGE IS DISPLAYED IF EITHER OF THE PARAMETERS
*          IS TOO LARGE.
/ 
*          EXIT-
*          FFU10 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS 
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU10 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU10 CALLS FFU98A TO DISPLAY DETAILED STATUS IF
*          AN I/O FUNCTION IS ABORTED.  FFU10 CALLS FFU97B TO DISPLAY 
*          A WARNING MESSAGE AND PAUSE. 
* 
*          REGISTERS USED-
*          FFU10 USES REGISTERS B0 TO B8.  REGISTERS ARE USED AS
*          FOLLOWS--
*            B0 - ERROR FLAG (SET BY FFU97A)
*            B1 - MAXIMUM CYLINDER (SET BY FFU97A)
*            B2 - MAXIMUM TRACK (SET BY FFU97A) 
*            B3 - MAP SECTOR
*            B4 - DEVICE SIZE (SET BY FFU97A) 
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - BUFFER INDEX
*            B7 - BUFFER INDEX
*            B8 - MAP TRACK 
* 
*          BUFFERS USED-
*          FFU10 USES THE INPUT BUFFER FOR FLAW MAPS READ FROM THE DISK.
*          THE OUTPUT BUFFER IS USED FOR WRITING THE FLAW MAPS BACK TO
*          THE DISK AND FOR PARAMETERS FOR FORMATTING.
* 
* 
/  - CLEAR TRACK FLAW - 
/ 
1  FORMAT CLEAR TRACK FLAW - CH=*O, EQ=*O, UN=*O
2  FORMAT CYLINDER = *OCT,  TRACK = *O
3  FORMAT ERROR - TRACK FLAW ALREADY CLEAR
6  FORMAT TRACK FLAW CLEARED
7  FORMAT TRACK FORMATTING COMPLETE 
11 FORMAT ERROR - ACCESS LEVEL TOO LOW (MINIMUM AL=4) 
12 FORMAT ERROR - MAX CY = *OCT FOR *OC MBYTE DEVICE
13 FORMAT ERROR - MAX TR = *O FOR *OC MBYTE DEVICE
15 FORMAT MODULE FFU10
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   MSG 2 (P1,P2) TO LINE 3
   IF (AL GE 4) GOTO 21           * IF VALID ACCESS LEVEL 
   MSG 11 TO LINE 5               * ACCESS LEVEL TOO LOW
   GOTO 26
21 B5=5                           * SET DISPLAY LINE
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * ABORT IF ERROR
   IF (P1 LE B1) GOTO 22          * IF P1 VALID 
   MSG 12 (B1,B4) TO LINE 5       * P1 TOO LARGE
   GOTO 26
22 IF (P2 LE B2) GOTO 27          * IF P2 VAILD 
   MSG 13 (B2,B4) TO LINE 5       * P2 TOO LARGE
26 MSG 16 TO LINE 7 
   PICTURE
   GOTO 77                        * ERROR EXIT
27 B3=1                           * SET SECTOR
   RES DRIVE, ABT 74
   GET FACTORY SECTOR B3, ABT 74  * READ TRACK FLAWS
   B6=0                           * SET BUFFER INDEX
30 B7=B6+1
   IF (IB(B6) AND 4000 EQ 0) GOTO 34   * IF END OF MAP
   IF (IB(B6) AND 1777 NE P1) GOTO 32  * NO CYLINDER MATCH
   IF (IB(B7) RS 6 EQ P2) GOTO 40      * IF MATCH 
32 B6=B6+2
   IF (B6 LT 318D) GOTO 30        * IF NOT END OF SECTOR
34 MSG 3 TO LINE 5                * FLAW ALREADY CLEAR
   GOTO 26
40 COPY IB TO OB FOR 318D 
41 B7=B6+2                        * SET INDEX 
   IF (OB(B7) AND 4000 EQ 0) GOTO 42   * IF END OF MAP
   OB(B6)=OB(B7)                  * SHIFT MAP UP 2 PLACES 
   B6=B6+1
   B7=B6+2
   OB(B6)=OB(B7)
   B6=B6+1                        * INCREMENT INDEX 
   IF (B6 LT 316D) GOTO 41        * IF MORE TO MOVE 
42 OB(B6)=0                       * CLEAR END OF BUFFER 
   B6=B6+1
   IF (B6 LT 502) GOTO 42         * IF NOT DONE CLEARING
   B8=0                           * SET TRACK 
   B15=2                          * SET MESSAGE NUMBER
   CALL 97B                       * PAUSE 
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B8 SEC B3, ABT 74   * WRITE MAP 
   MSG 6 TO LINE B5 
   B5=B5+2
   OB(300)=P1                     * SET FORMAT PARAMETERS 
   OB(301)=SB(63) AND 0077
   OB(302)=P2 
   OB(303)=0
   OB(304)=0
   OB(305)=0
   OB(306)=0
   IF (DC NE 12) GOTO 60          * IF NOT 317 MBYTE DEVICE 
   B3=3                           * SET SECTOR
50 RES DRIVE, ABT 74
   GET FACTORY SECTOR B3, ABT 74  * READ SKIP DISPLACEMENT
   B6=0 
51 B7=B6+1
   IF (IB(B6) AND 4000 EQ 0) GOTO 60   * IF END OF MAP
   IF (IB(B6) AND 1777 NE P1) GOTO 52  * NO CYLINDER MATCH
   IF (IB(B7) RS 6 EQ P2) GOTO 54      * IF MATCH 
52 B6=B6+6                        * INCREMENT INDEX 
   IF (B6 LT 318D) GOTO 51        * IF NOT END OF SECTOR
   B3=B3+1                        * NEXT SECTOR 
   IF (B3 LE 33) GOTO 50          * IF MORE SECTORS 
   GOTO 60                        * NO SKIP DISPLACEMENT FOUND
54 B7=B7+1
   OB(303)=IB(B7)                 * SET SKIP DISPLACEMENT 
   B7=B7+1
   OB(304)=IB(B7) 
   B7=B7+1
   OB(305)=IB(B7) 
   B7=B7+1
   OB(306)=IB(B7) 
60 REFORM OB(300), ABT 74         * FORMAT TRACK
61 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 61     * IF BUSY 
   IF (SB NE 0) GOTO 72           * IF ERROR ON FORMAT
   MSG 7 TO LINE B5 
   B5=B5+2
   GOTO 76                        * END OF MODULE 
72 STATUS DETAIL, ABT 74          * GET DETAILED STATUS 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU11, FMDFT, (10,11,12), LOCK
*** 5.2.14 FFU11 - FORMAT PACK
**
*          PURPOSE- 
*          FFU11 FORMATS THE ENTIRE DISK PACK EXCEPT THE FLAW MAP 
*          TRACK.  TRACK FLAWS AND SKIP DISPLACEMENT (317 MEGABYTE
*          DEVICE ONLY) ARE SET AS SPECIFIED BY THE FLAW MAPS.
* 
*          METHOD-
*          FFU11 SETS THE STARTING CYLINDER NUMBER AND THE ENDING 
*          CYLINDER NUMBER IN THE OUTPUT BUFFER.  THE STARTING CYLINDER 
*          IS 0000.  THE OCTAL VALUE OF THE ENDING CYLINDER IS SHOWN
*          BELOW--
* 
*                              317 MBYTE   200 MBYTE   100 MBYTE
*            ---------------   ---------   ---------   ---------
*            ENDING CYLINDER     1057        1456         632 
* 
*          FFU11 EXITS TO FFU111 TO PERFORM THE FORMATTING AND TO SET 
*          TRACK FLAWS AND SKIP DISPLACEMENT. 
* 
*          ENTRY- 
*          FFU11 DOES NOT REQUIRE SETTING ANY PARAMETERS BEFORE 
*          EXECUTION. 
/ 
*          EXIT-
*          FFU11 EXITS TO MODULE FFU111.  OUTPUT BUFFER LOCATIONS 
*          502 AND 503 CONTAIN THE STARTING AND ENDING CYLINDERS
*          FOR USE BY FFU111. 
* 
*          SUBMODULES REFERENCED- 
*          FFU11 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU11 CALLS FFU98A TO DISPLAY DETAILED STATUS IF
*          AN I/O FUNCTION IS ABORTED.  FFU11 CALLS FFU97B TO DISPLAY 
*          A WARNING MESSAGE AND PAUSE. 
* 
*          REGISTERS USED-
*          FFU11 USES REGISTERS B0, B1, AND B5.  REGISTERS ARE USED AS
*          FOLLOWS--
*            B0 - ERROR FLAG (SET BY FFU97A)
*            B1 - MAXIMUM CYLINDER (SET BY FFU97A)
*            B5 - K DISPLAY LINE NUMBER 
* 
*          BUFFERS USED-
*          FFU11 USES TWO LOCATIONS IN THE OUTPUT BUFFER FOR THE
*          STARTING AND ENDING CYLINDERS TO BE FORMATTED.  THEY ARE 
*          THE FOLLOWING LOCATIONS--
*            OB(502) - STARTING CYLINDER
*            OB(503) - ENDING CYLINDER
* 
* 
/  - FORMAT PACK -
/ 
1  FORMAT FORMAT PACK - CH=*O, EQ=*O, UN=*O 
2  FORMAT CYLINDER 0000 TO *OCT 
15 FORMAT MODULE FFU11
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   B5=5                           * SET DISPLAY LINE
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * IF ERROR
   MSG 2 (B1) TO LINE 3 
   B15=2                          * SET MESSAGE NUMBER
   CALL 97B                       * PAUSE 
   OB(502)=0                      * START CYLINDER
   OB(503)=B1                     * END CYLINDER
   EXIT TO 111
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
   MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU111, FMDFT, (10,11,12), LOCK 
*** 5.2.15 FFU111 - FORMAT PACK (CONTINUED) 
**
*          PURPOSE- 
*          FFU111 FORMATS THE DISK PACK FROM THE INDICATED STARTING 
*          CYLINDER TO THE INDICATED ENDING CYLINDER.  TRACK FLAWS
*          AND SKIP DISPLACEMENT (317 MEGABYTE DEVICE ONLY) ARE SET 
*          AS SPECIFIED BY THE FLAW MAPS. 
* 
*          METHOD-
*          FFU111 IS ENTERED FROM FFU11, FFU12, OR FFU132.
*          THESE MODULES SET UP THE STARTING AND ENDING CYLINDERS 
*          IN THE OUTPUT BUFFER.  FFU111 SCANS THE FLAW MAPS AND SAVES
*          A LIST OF FLAWS FOR THE STARTING CYLINDER IN THE OUTPUT
*          BUFFER.  THIS LIST HAS SEVEN WORDS PER ENTRY IN THE SAME 
*          FORMAT AS THE PARAMETERS FOR THE FORMAT COMMAND.  THE
*          LIST INCLUDES ONE ENTRY FOR FORMATTING TRACKS WITH NO FLAWS
*          AND ONE ENTRY FOR EACH TRACK THAT IS FLAWED OR HAS SKIP
*          DISPLACEMENT.  AFTER BUILDING THE LIST IN THE BUFFER, FFU111 
*          FORMATS ONE TRACK AT A TIME USING THE APPROPRIATE FORMAT 
*          PARAMETERS.  AFTER FORMATTING THE ENTIRE CYLINDER THE
*          CYLINDER NUMBER IS INCREMENTED AND THE PROCESS IS REPEATED 
*          UNTIL THE ENDING CYLINDER HAS BEEN FORMATTED.  FFU111 WILL 
*          NOT FORMAT THE MAP TRACK.
/ 
*          ENTRY- 
*          FFU111 ASSUMES THAT THE STARTING AND ENDING CYLINDER NUMBERS 
*          ARE INITIALLY IN OUTPUT BUFFER LOCATIONS 502 AND 503.
* 
*          EXIT-
*          FFU111 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU111 CALLS SUBMODULE FFU98A TO DISPLAY DETAILED STATUS 
*          IF AN I/O FUNCTION IS ABORTED. 
* 
*          REGISTERS USED-
*          FFU111 USES REGISTERS B1, B2, AND B5 TO B11.  REGISTERS ARE
*          USED AS FOLLOWS--
*            B1 - MAP CYLINDER (SET BY FFU97A)
*            B2 - MAXIMUM TRACK (SET BY FFU97A) 
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - OUTPUT BUFFER CLEAR INDEX 
*            B7 - MAP SECTOR
*            B8 - INPUT BUFFER INDEX
*            B9 - INPUT BUFFER INDEX
*           B10 - OUTPUT BUFFER INSERT INDEX
*           B11 - OUTPUT BUFFER SCAN INDEX
* 
*          BUFFERS USED-
*          FFU111 USES THE INPUT BUFFER FOR FLAW MAPS READ FROM THE 
*          DISK.  THE OUTPUT BUFFER IS USED FOR THE PARAMETERS FOR THE
*          FORMAT COMMAND.  OUTPUT BUFFER LOCATIONS 502 AND 503 
*          CONTAIN THE STARTING AND ENDING CYLINDER NUMBERS.
* 
* 
/  - FORMAT PACK (CONTINUED) -
/ 
1  FORMAT CYLINDER = *OCT 
2  FORMAT PACK FORMATTING COMPLETE
15 FORMAT FFU111 FORMAT CYL *OCT
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
/ 
/  GET TRACK FLAWS FOR CURRENT CYLINDER 
20 MSG 15 (OB(502)) TO DISPLAY
   MSG 1 (OB(502)) TO LINE B5 
   B10=7                          * SET OB INSERT INDEX 
   B7=1                           * SET MAP SECTOR
   RES DRIVE, ABT 74
   GET FACTORY SECTOR B7, ABT 74  * READ TRACK FLAWS
   B6=0                           * CLEAR OUTPUT BUFFER 
24 OB(B6)=0 
   B6=B6+1
   IF (B6 LT 500) GOTO 24         * IF NOT DONE CLEARING
   OB(0)=OB(502)                  * SET CYLINDER
   OB(1)=SB(63) AND 0077          * SINGLE TRACK, NO ERRORS 
   B8=0                           * SET IB INDEX
30 B9=B8+1
   IF (IB(B8) AND 4000 EQ 0) GOTO 34   * IF END OF MAP
   IF (IB(B8) AND 1777 NE OB(502)) GOTO 32  * IF NO CY MATCH
   OB(B10)=OB(502)                * TRACK FLAW
   B10=B10+1
   OB(B10)=SB(63) AND 0077 XOR 0100 
   B10=B10+1
   OB(B10)=IB(B9) RS 6
   B10=B10+5
32 B8=B8+2                        * NEXT ENTRY
   IF (B8 LT 318D) GOTO 30        * IF MORE ENTRIES 
34 IF (DC NE 12) GOTO 50          * IF NOT 317 MBYTE DEVICE 
/ 
/  GET SKIP DISPLACEMENT FOR CURRENT CYLINDER 
   B7=3                           * SET MAP SECTOR
36 RES DRIVE, ABT 74
   GET FACTORY SECTOR B7, ABT 74  * READ SKIP DISPLACEMENT
   B8=0                           * SET IB INDEX
40 B9=B8+1
   IF (IB(B8) AND 4000 EQ 0) GOTO 50   * IF END OF MAP
   IF (IB(B8) AND 1777 NE OB(502)) GOTO 44  * IF NO CY MATCH
   B11=7                          * SET OB SCAN INDEX 
41 IF (B11 GE B10) GOTO 47        * IF NO TRACK FLAW
   B11=B11+2
   IF (IB(B9) RS 6 NE OB(B11)) GOTO 46      * IF NO TRACK MATCH 
42 B11=B11+1                      * INCREMENT OB INDEX
   B9=B9+1                        * INCREMENT IB INDEX
   OB(B11)=IB(B9)                 * INSERT SKIP DISPLACEMENT
   IF (B9-B8 LT 5) GOTO 42        * IF MORE SKIP DISPLACEMENT 
44 B8=B8+6                        * NEXT MAP ENTRY
   IF (B8 LT 318D) GOTO 40        * IF NOT END OF SECTOR
   B7=B7+1                        * NEXT MAP SECTOR 
   IF (B7 LE 33) GOTO 36          * IF MORE SECTORS 
   GOTO 50                        * END OF MAP
46 B11=B11+5                      * INCREMENT OB INDEX
   GOTO 41                        * GO CHECK NEXT TRACK FLAW
47 OB(B10)=OB(502)                * SKIP DIAPLACEMENT ONLY
   B10=B10+1
   OB(B10)=SB(63) AND 0077
   B10=B10+1
   OB(B10)=IB(B9) RS 6            * SET INDEX 
   B11=B10
   B10=B10+5
   GOTO 42                        * GO INSERT SKIP
/ 
/  FORMAT CYLINDER
50 B11=9D                         * SET OB INDEX
51 IF (B11 GE B10) GOTO 60        * IF NO FLAW FOUND
   IF (OB(B11) EQ OB(2)) GOTO 52  * IF FLAW FOUND 
   B11=B11+7
   GOTO 51                        * CHECK NEXT ENTRY
52 B11=B11-2                      * SET INDEX BACK TO FIRST WORD
53 IF (OB(502) NE B1) GOTO 54     * IF NOT MAP CYLINDER 
   IF (OB(2) EQ 0) GOTO 57        * IF MAP TRACK
54 RES DRIVE, ABT 74
   REFORM OB(B11), ABT 74         * FORMAT THE TRACK
56 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 56     * IF BUSY 
   IF (SB NE 0) GOTO 72           * IF ERROR ON FORMAT
57 OB(2)=OB(2)+1                  * NEXT TRACK
   IF (OB(2) LE B2) GOTO 50       * IF MORE TRACKS
   OB(502)=OB(502)+1              * NEXT CYLINDER 
   IF (OB(502) LE OB(503)) GOTO 20     * IF MORE CYLINDERS
   MSG 2 TO LINE B5                * FORMATTING COMPLETE
   B5=B5+2
   GOTO 76                        * END OF MODULE 
60 B11=0                          * SET INDEX 
   GOTO 53                        * GO FORMAT 
72 STATUS DETAIL, ABT 74          * GET DETAILED STATUS 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU12, FMDFT, (10,11,12), LOCK
*** 5.2.16 FFU12 - FORMAT PARTIAL PACK
**
*          PURPOSE- 
*          FFU12 FORMATS A SPECIFIED PORTION OF THE DISK PACK.  TRACK 
*          FLAWS AND SKIP DISPLACEMENT (317 MEGABYTE DEVICE ONLY) ARE 
*          SET AS SPECIFIED BY THE FLAW MAPS. 
* 
*          METHOD-
*          FFU12 TAKES THE STARTING CYLINDER NUMBER FROM PARAMETER P1 
*          AND THE ENDING CYLINDER FROM PARAMETER P2 AND PLACES THEM IN 
*          THE OUTPUT BUFFER.  FFU12 EXITS TO FFU111 TO PERFORM THE 
*          FORMATTING AND SETTING THE TRACK FLAWS AND SKIP
*          DISPLACEMENT.
* 
*          ENTRY- 
*          FFU12 REQUIRES PARAMETERS P1 AND P2 SET TO INDICATE STARTING 
*          AND ENDING CYLINDER FOR FORMATTING.  PARAMETER USAGE AND 
*          ALLOWED OCTAL VALUES FOR EACH DEVICE SIZE ARE SHOWN BELOW--
* 
*                  PARAMETERS         317 MBYTE   200 MBYTE   100 MBYTE 
*            ----------------------   ---------   ---------   --------- 
*            P1 - STARTING CYLINDER   0 TO 1057   0 TO 1456   0 TO 632
*            P2 - ENDING CYLINDER     0 TO 1057   0 TO 1456   0 TO 632
* 
*          AN ERROR MESSAGE IS DISPLAYED IF EITHER OF THE PARAMETERS IS 
*          TOO LARGE OR IF P1 IS GREATER THAN P2. 
/ 
*          EXIT-
*          FFU12 EXITS TO MODULE FFU111.  OUTPUT BUFFER LOCATIONS 
*          502 AND 503 CONTAIN THE STARTING AND ENDING CYLINDER FOR USE 
*          BY FFU111. 
* 
*          SUBMODULES REFERENCED- 
*          FFU12 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU12 CALLS FFU98A TO DISPLAY DETAILED STATUS IF AN 
*          I/O FUNCTION IS ABORTED.  FFU12 CALLS FFU97B TO DISPLAY A
*          WARNING MESSAGE AND PAUSE. 
* 
*          REGISTERS USED-
*          FFU12 USES REGISTERS B0, B1, B4, AND B5.  REGISTERS ARE USED 
*          AS FOLLOWS-- 
*            B0 - ERROR FLAG (SET BY FFU97A)
*            B1 - MAXIMUM CYLINDER (SET BY FFU97A)
*            B4 - DEVICE SIZE (SET BY FFU97A) 
*            B5 - K DISPLAY LINE NUMBER 
* 
*          BUFFERS USED-
*          FFU12 USES TWO LOCATIONS IN THE OUTPUT BUFFER FOR THE
*          STARTING AND ENDING CYLINDERS TO BE FORMATTED.  THEY ARE SET 
*          TO THE VALUES SHOWN BELOW--
*            OB(502) = P1 - STARTING CYLINDER 
*            OB(503) = P2 - ENDING CYLINDER 
* 
* 
/  - FORMAT PARTIAL PACK -
/ 
1  FORMAT FORMAT PARTIAL PACK - CH=*O, EQ=*O, UN=*O 
2  FORMAT CYLINDER *OCT TO *OCT 
3  FORMAT ERROR - MAX CY = *OCT FOR *OC MBYTE DEVICE
4  FORMAT ERROR - ILLEGAL RANGE OF CYLINDERS
15 FORMAT MODULE FFU12
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   MSG 2 (P1,P2) TO LINE 3
   B5=5                           * SET DISPLAY LINE
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * IF ERROR
   IF (P2 GE P1) GOTO 24          * IF VALID RANGE
   MSG 4 TO LINE 5                * ILLEGAL RANGE 
22 MSG 16 TO LINE 7 
   PICTURE
   GOTO 77                        * ERROR STOP
24 IF (P2 LE B1) GOTO 26          * IF END VALID
   MSG 3 (B1,B4) TO LINE 5        * ILLEGAL END CYL 
   GOTO 22
26 IF (P1 LE B1) GOTO 30          * IF START VALID
   MSG 3 (B1,B4) TO LINE 5        * ILLEGAL START CYLINDER
   GOTO 22
30 B15=2                          * SET MESSAGE NUMBER
   CALL 97B                       * PAUSE 
   OB(502)=P1                     * START CYLINDER
   OB(503)=P2                     * END CYLINDER
   EXIT TO 111
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
   MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU13, FMDFT, (10,11,12), LOCK
*** 5.2.17 FFU13 - INITIALIZE PACK
**
*          PURPOSE- 
*          FFU13 GENERATES FLAW MAPS AND THEN FORMATS THE DISK PACK 
*          TO SET THE SECTOR SIZE AND ELIMINATE ALTERNATE TRACKS. 
* 
*          METHOD-
*          FFU13 ASSUMES THAT THE DISK PACK CONTAINS READABLE HOME
*          ADDRESS FIELDS.  THE MAP CYLINDER IS FIRST SCANNED TO
*          OBTAIN TRACK FLAWS AND SKIP DISPLACEMENT (317 MEGABYTE DEVICE
*          ONLY).  THIS INFORMATION IS THEN USED IN FORMATTING THE MAP
*          TRACK. THE SERIAL NUMBER AND DATE OF FORMATTING ARE THEN 
*          WRITTEN IN THE PROTECTED AREA.  FFU13 EXITS TO FFU131 TO 
*          CONTINUE THE INITIALIZATION PROCESS.  THE DISK IS SCANNED AND
*          INFORMATION OBTAINED BY THE SCAN IS PLACED IN THE FLAW MAPS. 
*          THE NORMAL TRACKS ARE FORMATTED WITHOUT WRITTING HOME
*          ADDRESS FIELDS.  THE ALTERNATE TRACKS ARE FORMATTED WITH THE 
*          HOME ADDRESS FIELD WRITTEN.  THIS CONVERTS THE ALTERNATE 
*          TRACKS TO NORMAL TRACKS. (CDC FORMAT DOES NOT REQUIRE
*          ALTERNATE TRACKS.)  OCTAL CYLINDER NUMBERS OF NORMAL AND 
*          ALTERNATE TRACKS ARE LISTED BELOW--
* 
*                          317 MBYTE       200 MBYTE       100 MBYTE
*            ---------   -------------   -------------   -------------
*            NORMAL       0 TO 1052       0 TO 1447        0 TO 623 
*            ALTERNATE   1053 TO 1057    1450 TO 1456      624 TO 632 
* 
* 
*          ENTRY- 
*          FFU13 REQUIRES PARAMETERS P0 TO P4 SET TO INDICATE A SIX 
*          DIGIT DECIMAL PACK SERIAL NUMBER AND A SIX DIGIT DECIMAL 
*          DATE CODE.  PARAMETER USAGE IS SHOWN BELOW-- 
* 
*            P0 - 0NNND - SERIAL NUMBER (FIRST 3 DIGITS)
*            P1 - 0NNND - SERIAL NUMBER (LAST 3 DIGITS) 
*            P2 - 0NNND - DATE CODE (FIRST 3 DIGITS)
*            P3 - 0NNND - DATE CODE (LAST 3 DIGITS) 
/ 
*          EXIT-
*          FFU13 EXITS TO FFU131.  CONTENTS OF REGISTERS B0, B1, B2,
*          AND B5 ARE USED BY FFU131. 
* 
*          SUBMODULES REFERENCED- 
*          FFU13 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU13 CALLS FFU98A TO DISPLAY DETAILED STATUS IF AN 
*          I/O FUNCTION IS ABORTED.  FFU13 CALLS FFU97B TO DISPLAY A
*          WARNING MESSAGE AND PAUSE. 
* 
*          REGISTERS USED-
*          FFU13 USES REGISTERS B0 TO B12.  REGISTERS ARE USED AS 
*          FOLLOWS--
*            B0 - ERROR FLAG (SET BY FFU97A)
*            B1 - MAXIMUM CYLINDER (SET BY FFU97A)
*            B2 - MAXIMUM TRACK (SET BY FFU97A) 
*            B3 - MAP TRACK 
*            B4 - BCD CONVERSION
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - BCD DATE CODE 
*            B7 - BCD DATE CODE 
*            B8 - BCD DATE CODE 
*            B9 - BCD SERIAL NUMBER 
*           B10 - BCD SERIAL NUMBER 
*           B11 - BUFFER INDEX
*           B12 - SCRATCH PAD 
* 
*          BUFFERS USED-
*          FFU13 USES THE INPUT BUFFER FOR SCAN RESULTS.  THE OUTPUT
*          BUFFER IS USED FOR PARAMETERS FOR THE FORMAT COMMAND AND 
*          FOR THE SERIAL NUMBER WRITTEN IN THE PROTECTED AREA. 
* 
* 
/  - INITIALIZE PACK -
/ 
1  FORMAT INITIALIZE PACK - CH=*O, EQ=*O, UN=*O 
2  FORMAT S/N = *HE*HE   DATE OF FORMAT = *H/*H/*H
3  FORMAT ERROR - P0 TO P3 MUST ALL BE 999 OR LESS
4  FORMAT ERROR - MAP TRACK IS DEFECTIVE
5  FORMAT MAP TRACK FORMATTED 
6  FORMAT UNABLE TO COMPLETE INITIALIZATION 
15 FORMAT MODULE FFU13
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   MSG 15 TO DISPLAY
   B5=5                           * SET LINE NUMBER 
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * IF ERROR
   IF (P0 GT 999D) GOTO 24        * IF PARAMETER TOO LARGE
   IF (P1 GT 999D) GOTO 24        * IF PARAMETER TOO LARGE
   IF (P2 GT 999D) GOTO 24        * IF PARAMETER TOO LARGE
   IF (P3 LE 999D) GOTO 26        * IF PARAMETER VALID
24 MSG 3 TO LINE 5                * PARAMETER TOO LARGE 
   GOTO 33                        * ERROR EXIT
26 B4=P0                          * CONVERT SERIAL NUMBER TO BCD
   GOSUB 70 
   OB(0)=B4 
   B9=B4
   B4=P1
   GOSUB 70 
   OB(1)=B4 
   B10=B4 
   B4=P2                          * CONVERT DATE TO BCD 
   GOSUB 70 
   OB(2)=B4 
   B6=B4 RS 4 
   B7=B4 LS 4 AND 0360
   B4=P3
   GOSUB 70 
   OB(3)=B4 
   B8=B4 AND 0377 
   B7=B4 RS 8 XOR B7
   MSG 2 (B9,B10,B6,B7,B8) TO LINE 3
   B15=2                          * SET MESSAGE NUMBER
   CALL 97B                       * PAUSE 
   B3=0                           * SET MAP TRACK 
   RES DRIVE, ABT 74
   SEEK CYL B1 TRK B3 SEC B3, ABT 74   * SEEK 
   SCAN, ABT 74                   * SCAN CYLINDER 
30 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 30     * IF BUSY 
   IF (SB NE 0) GOTO 74           * IF ERROR ON SCAN
   DIAGRD, ABT 74                 * READ BUFFER 
   OB(400)=B1                     * SET FORMAT PARAMETERS 
   OB(401)=SB(63) AND 0077
   OB(402)=0
   OB(403)=0
   OB(404)=0
   OB(405)=0
   OB(406)=0
   IF (IB(0) EQ 0) GOTO 36        * IF NO FLAWS 
   IF (IB(0) AND 0077 NE 0) GOTO 36    * IF NOT MAP TRACK 
   IF (DC EQ 12) GOTO 34          * IF 317 MEGABYTE DEVICE
32 MSG 4 TO LINE 5                * MAP TRACK DEFECTIVE 
33 B5=B5+2                        * INCREMENT LINE NUMBER 
   MSG 6 TO LINE B5               * FATAL ERROR 
   B5=B5+2
   GOTO 75                        * ERROR EXIT
34 IF (IB(0) AND 7600 NE 2000) GOTO 32      * IF DEFECTIVE TRACK
   COPY IB(1) TO OB(403) FOR 4    * SET SKIP DISPLACEMENT 
36 RES DRIVE, ABT 74
   REFORM OB(400), ABT 74         * FORMAT ONE TRACK
37 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 37     * IF BUSY 
   IF (SB NE 0) GOTO 76           * IF ERROR ON FORMAT
   B11=4                          * SET INDEX 
40 OB(B11)=0                      * CLEAR OUTPUT BUFFER 
   B11=B11+1
   IF (B11 LT 502) GOTO 40        * IF MORE TO CLEAR
   B3=0                           * SET TRACK AND SECTOR
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B3 SEC B3, ABT 74       * WRITE SERIAL NUMBER 
   MSG 5 TO LINE 5                * MAP TRACK FORMATTED 
   B5=B5+2                        * INCREMENT LINE NUMBER 
   EXIT TO 131                    * GO BUILD FLAW MAPS
/ 
/  BCD CONVERSION 
70 B12=B4                         * SAVE NUMBER TO BE CONVERTED 
   B4=0                           * CLEAR BCD ACCUMULATOR 
71 IF (B12 LT 100D) GOTO 72       * IF NO MORE HUNDREDS 
   B12=B12-100D                   * SUBTRACT 100
   B4=B4+0400                     * INCREMENT HUNDREDS
   GOTO 71                        * CHECK FOR MORE HUNDREDS 
72 IF (B12 LT 10D) GOTO 73        * IF NO MORE TENS 
   B12=B12-10D                    * SUBTRACT 10 
   B4=B4+0020                     * INCREMENT TENS
   GOTO 72                        * CHECK FOR MORE TENS 
73 B4=B4+B12                      * ADD ONES
   RETURN 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
75 MSG 16 TO LINE B5
   PICTURE
   GOTO 77
76 STATUS DETAIL, ABT 74          * GET DETAILED STATUS 
   GOTO 74
77 END 20 
COMPILE 
   MODULE FFU131, FMDFT, (10,11,12), LOCK 
*** 5.2.18 FFU131 - INITIALIZE PACK (CONTINUED) 
**
*          PURPOSE- 
*          FFU131 BUILDS THE FLAW MAPS AND WRITES THEM IN THE PROTECTED 
*          AREA ON THE DISK.
* 
*          METHOD-
*          FFU131 SCANS THE ENTIRE DISK AND BUILDS A TRACK FLAW MAP 
*          FOR 100 OR 200 MEGABYTE DEVICES IN THE OUTPUT BUFFER.  FOR 
*          317 MEGABYTE DEVICES A COMBINED TRACK FLAW AND SKIP
*          DISPLACEMENT MAP IS GENERATED AND WRITTEN INTO THE SKIP
*          DISPLACEMENT MAP SECTORS.  FFU131 EXITS TO FFU132.  FFU132 
*          SEPARATES THE TRACK FLAW MAP AND THE SKIP DISPLACEMENT MAP,
*          FORMATS THE NORMAL CYLINDERS, AND THEN EXITS TO FFU111 TO
*          FORMAT THE ALTERNATE CYLINDERS.
/ 
*          ENTRY- 
*          FFU131 IS ONLY ENTERED FROM FFU13.  REGISTERS B0, B1, B2,
*          AND B5 ARE ASSUMED TO CONTAIN VALID INFORMATION. 
* 
*          EXIT-
*          FFU131 EXITS TO FFU132.  CONTENTS OF REGISTERS B1, B2, B3, 
*          AND B5 ARE USED BY FFU132. 
* 
*          SUBMODULES REFERENCED- 
*          FFU131 CALLS SUBMODULE FFU98A TO DISPLAY DETAILED STATUS IF
*          AN I/O FUNCTION IS ABORTED.
* 
*          REGISTERS USED-
*          FFU131 USES REGISTERS B0 TO B10.  REGISTERS ARE USED AS
*          FOLLOWS--
*            B0 - ERROR FLAG (SET BY FFU97A)
*            B1 - MAXIMUM CYLINDER (SET BY FFU97A)
*            B2 - MAXIMUM TRACK (SET BY FFU97A) 
*            B3 - MAP TRACK 
*            B4 - MAP SECTOR
*            B5 - K DISPLAY LINE NUMBER (SET BY FFU13)
*            B6 - OUTPUT BUFFER INDEX 
*            B7 - INPUT BUFFER INDEX
*            B8 - CYLINDER FOR SCAN 
*            B9 - TRACK AND SECTOR FOR SCAN 
*           B10 - SCRATCH PAD 
* 
*          BUFFERS USED-
*          FFU131 USES THE INPUT BUFFER FOR SCAN RESULTS AND THE
*          OUTPUT BUFFER FOR BUILDING AND WRITING FLAW MAPS.
* 
* 
/  - INITIALIZE PACK (CONTINUED) -
/ 
1  FORMAT FFU131 SCAN CYL *OCT
2  FORMAT ERROR - MAP CAPACITY EXCEEDED 
3  FORMAT HOME ADDRESS ERROR  CY = *OCT   TR = *O 
4  FORMAT UNABLE TO COMPLETE INITIALIZATION 
5  FORMAT FLAW MAPS WRITTEN 
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 B6=0                           * SET OB INDEX
   B3=0                           * MAP TRACK 
   B4=3                           * MAP SECTOR
   IF (DC NE 12) B4=1             * IF NOT 317 MBYTE DEVICE 
   B8=0                           * SET CYLINDER
   B9=0                           * SET TRACK AND SECTOR
22 RES DRIVE, ABT 74
   SEEK CYL B8 TRK B9 SEC B9, ABT 74   * SEEK 
   SCAN, ABT 74                   * SCAN CYLINDER 
   MSG 1 (B8) TO LINE B5          * DISPLAY CYLINDER NUMBER 
   MSG 1 (B8) TO DISPLAY          * SCAN CYLINDER 
24 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 24     * IF BUSY 
   IF (SB NE 0) GOTO 74           * IF ERROR ON SCAN
   DIAGRD, ABT 74                 * INPUT SCAN RESULTS
   B7=0                           * SET IB INDEX
30 IF (IB(B7) EQ 0) GOTO 50       * IF NO MORE FLAWS
   IF (IB(B7) AND 1600 NE 0) GOTO 70   * IF FATAL ERROR 
   IF (IB(B7) AND 6000 EQ 0) GOTO 70   * IF FATAL ERROR 
32 IF (B6 LT 318D) GOTO 36        * IF ROOM FOR FLAW
34 OB(B6)=0                       * CLEAR END OF BUFFER 
   B6=B6+1
   IF (B6 LT 502) GOTO 34         * IF MORE TO CLEAR
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B3 SEC B4, ABT 74  * WRITE MAP SECTOR 
   B6=0                           * RESET OB INDEX
   B4=B4+1                        * NEXT SECTOR 
   IF (B4 EQ 2) GOTO 66           * IF OVERFLOW 
   IF (B4 GT 33) GOTO 66          * IF OVERFLOW 
36 OB(B6)=B8 XOR 4000             * INDICATE CYLINDER 
   B6=B6+1
   OB(B6)=IB(B7) LS 6 AND 7700    * INDICATE TRACK
   B6=B6+1
   IF (DC NE 12) GOTO 44          * IF NOT 317 MBYTE DEVICE 
   B7=B7+1
   COPY IB(B7) TO OB(B6) FOR 4    * MOVE SKIP DISPLACEMENT
   B6=B6+4                        * INCREMENT OB INDEX
   B7=B7-1                        * RESET IB INDEX
   IF (IB(B7) AND 2000 EQ 0) GOTO 40   * IF NO SKIP DISPLACEMENT
   IF (IB(B7) AND 4000 EQ 0) GOTO 42   * IF NO TRACK FLAW 
   IB(B7)=IB(B7) AND 5777         * CLEAR SKIP DISPLACEMENT 
   GOTO 32                        * GO ENTER TRACK FLAW 
40 B6=B6-6                        * RESET OB INDEX
   OB(B6)=B8 XOR 2000             * INDICATE TRACK FLAW 
   B6=B6+6
42 B7=B7+5
   IF (B7 LT 150D) GOTO 30        * IF MORE ENTRIES 
   GOTO 50                        * NO MORE FLAWS 
44 IF (IB(B7) AND 6000 NE 4000) GOTO 70     * IF FATAL ERROR
46 B7=B7+5
   IF (B7 LT 95D) GOTO 30         * IF MORE ENTRIES 
50 B8=B8+1                        * NEXT CYLINDER 
   IF (B0 NE 0) GOTO 51           * IF ERROR FLAG 
   IF (B8 LE B1) GOTO 22          * IF MORE CYLINDERS 
51 IF (B6 LT 318D) GOTO 54        * IF ROOM TO ADD 0 WORD 
   IF (DC NE 12) GOTO 54          * IF NOT 317 MBYTE DEVICE 
   IF (B4 EQ 33) GOTO 54          * IF LAST SECTOR
52 OB(B6)=0                       * CLEAR END OF BUFFER 
   B6=B6+1
   IF (B6 LT 502) GOTO 52         * IF MORE TO CLEAR
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B3 SEC B4, ABT 74  * WRITE MAP SECTOR 
   B4=B4+1                        * NEXT SECTOR 
   B6=0                           * SET BUFFER INDEX
54 OB(B6)=0                       * CLEAR BUFFER
   B6=B6+1
   IF (B6 LT 502) GOTO 54         * IF MORE TO CLEAR
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B3 SEC B4, ABT 74  * WRITE MAP SECTOR 
   IF (B0 NE 0) GOTO 67           * IF ERROR
   IF (DC EQ 12) EXIT TO 132      * IF 317 MBYTE DEVICE 
   MSG 5 TO LINE B5               * MAPS WRITTEN
   B5=B5+2
   EXIT TO 132                    * GO FORMAT 
66 MSG 2 TO LINE B5               * MAP CAPACITY EXCEEDED 
67 B5=B5+2
   MSG 4 TO LINE B5               * FATAL ERROR 
   B5=B5+2
   GOTO 76                        * ERROR EXIT
70 B0=B0+1                        * INCREMENT ERROR FLAG
   IF (B0 GE 10D) GOTO 72         * IF TEN ERRORS DISPLAYED 
   B10=IB(B7) AND 0077            * EXTRACT TRACK 
   MSG 3 (B8,B10) TO LINE B5      * DISPLAY ERROR 
   B5=B5+1                        * INCREMENT LINE
72 IF (DC EQ 12) GOTO 42          * IF 317 MBYTE DEVICE 
   GOTO 46                        * NOT 317 MBYTE DEVICE
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU132, FMDFT, (10,11,12) LOCK
*** 5.2.19 FFU132 - INITIALIZE PACK 
**
*          PURPOSE- 
*          FFU132 SEPARATES THE TRACK FLAW MAP ENTRIES FROM THE SKIP
*          DISPLACEMENT MAP AND WRITES THE TRACK FLAW MAP (317
*          MEGABYTE DEVICE ONLY).  FFU132 ALSO FORMATS THE NORMAL 
*          CLYINDERS AND THEN EXITS TO FFU111 TO FORMAT THE ALTERNATE 
*          TRACKS.
* 
*          METHOD-
*          FFU132 CHECKS THE DEVICE CODE AND IF A 317 MEGABYTE DEVICE 
*          IS ASSIGNED THE SKIP DISPLACEMENT MAP WRITTEN BY FFU131 IS 
*          READ.  TRACK FLAW ENTRIES ARE COPIED TO THE OUTPUT BUFFER TO 
*          GENERATE THE TRACK FLAW MAP.  AFTER THE ENTIRE SKIP
*          DISPLACEMENT MAP HAS BEEN READ FFU132 WRITES THE TRACK FLAW
*          MAP.  THE SKIP DISPLACEMENT MAP IS THEN RE-READ, TRACK FLAW
*          ENTRIES ARE DELETED, AND THE SKIP DISPLACEMENT MAP IS
*          REWRITTEN.  FFU132 THEN FORMATS THE NORMAL CYLINDERS ONE 
*          CYLINDER AT A TIME.  HOME ADDRESS FIELDS ARE NOT WRITTEN.
*          FFU132 SETS THE STARTING AND ENDING CYLINDERS IN THE OUTPUT
*          BUFFER AND EXITS TO FFU111 TO FORMAT THE ALTERNATE TRACKS. 
/ 
*          ENTRY- 
*          FFU132 IS ONLY ENTERED FROM FFU131.  REGISTERS B1, B2, B3, 
*          AND B5 ARE ASSUMED TO CONTAIN VALID INFORMATION. 
* 
*          EXIT-
*          FFU132 EXITS TO FFU111.  CONTENTS OF REGISTERS B1, B2, B3, 
*          AND B5 ARE USED BY FFU111.  OUTPUT BUFFER LOCATIONS 502 AND
*          503 ARE ALSO USED BY FFU111. 
* 
*          SUBMODULES REFERENCED- 
*          FFU132 CALLS SUBMODULE FFU98A TO DISPLAY DETAILED STATUS IF
*          AN I/O FUNCTION IS ABORTED.
* 
*          REGISTERS USED-
*          FFU132 USES REGISTERS B0 TO B7.  REGISTERS ARE USED AS 
*          FOLLOWS--
*            B0 - MAP SECTOR TO WRITE 
*            B1 - MAXIMUM CYLINDER (SET BY FFU97A)
*            B2 - MAXIMUM TRACK (SET BY FFU97A) 
*            B3 - MAP TRACK 
*            B4 - MAP SECTOR TO READ
*            B5 - K DISPLAY LINE NUMBER (SET BY FFU13)
*            B6 - OUTPUT BUFFER INDEX 
*            B7 - INPUT BUFFER INDEX
* 
*          BUFFERS USED-
*          FFU132 USES THE INPUT BUFFER FOR SKIP DISPLACEMENT MAPS READ 
*          FROM THE DISK.  THE OUTPUT BUFFER IS USED FOR THE TRACK FLAW 
*          AND SKIP DISPLACEMENT MAPS WRITTEN TO THE DISK.
*          THE OUTPUT BUFFER IS ALSO USED FOR STARTING AND ENDING 
*          CYLINDERS PASSED TO FFU111.
* 
* 
/  - INITIALIZE PACK (CONTINUED) -
/ 
1  FORMAT MODULE FFU132 
2  FORMAT ERROR - MAP CAPACITY EXCEEDED 
3  FORMAT UNABLE TO COMPLETE INITIALIZATION 
5  FORMAT FLAW MAPS WRITTEN 
15 FORMAT FFU132 FORMAT CYL *OCT
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 MSG 1 TO DISPLAY 
   MSG 1 TO LINE B5 
   IF (DC NE 12) GOTO 60          * IF NOT 317 MBYTE DEVICE 
   B6=0                           * SET OB INDEX
   B4=3                           * SET READ SECTOR 
   B0=1                           * SET WRITE SECTOR
22 RES DRIVE, ABT 74
   GET FACTORY SECTOR B4, ABT 74  * READ SKIP DISPLACEMENT
   B7=0                           * RESET IB INDEX
24 IF (IB(B7) AND 6000 EQ 0) GOTO 30   * IF END OF MAP
   IF (IB(B7) AND 2000 EQ 0) GOTO 26   * IF NO TRACK FLAW 
   IF (B6 LT 318D) GOTO 25        * IF ROOM FOR FLAW
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B3 SEC B0, ABT 74  * WRITE MAP SECTOR 
   MSG 2 TO LINE B5               * MAP CAPACITY EXCEEDED 
   B5=B5+2
   MSG 3 TO LINE B5               * FATAL ERROR 
   B5=B5+2
   GOTO 76                        * ERROR EXIT
25 IB(B7)=IB(B7) AND 1777 XOR 4000     * INDICATE TRACK FLAW
   COPY IB(B7) TO OB(B6) FOR 2
   B6=B6+2                        * INCREMENT OB INDEX
26 B7=B7+6                        * NEXT ENTRY
   IF (B7 LT 318D) GOTO 24        * IF MORE FLAWS 
   B4=B4+1                        * NEXT SECTOR 
   IF (B4 LE 33) GOTO 22          * IF MORE SECTORS 
30 OB(B6)=0                       * CLEAR END OF BUFFER 
   B6=B6+1
   IF (B6 LT 502) GOTO 30         * IF MORE TO CLEAR
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B3 SEC B0, ABT 74  * WRITE MAP SECTOR 
   B4=3                           * RESET READ SECTOR 
   B0=3                           * RESET WRITE SECTOR
   B6=0                           * RESET OB INDEX
32 RES DRIVE, ABT 74
   GET FACTORY SECTOR B4, ABT 74  * READ SKIP DISPLACEMENT
   B7=0                           * RESET IB INDEX
34 IF (IB(B7) AND 6000 EQ 0) GOTO 44   * IF END OF MAP
   IF (IB(B7) AND 2000 NE 0) GOTO 36   * IF TRACK FLAW
   COPY IB(B7) TO OB(B6) FOR 6    * MOVE IB TO OB 
   B6=B6+6
36 B7=B7+6
   IF (B6 LT 318D) GOTO 42        * IF OB NOT FULL
40 OB(B6)=0                       * CLEAR END OF BUFFER 
   B6=B6+1
   IF (B6 LT 502) GOTO 40         * IF MORE TO CLEAR
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B3 SEC B0, ABT 74  * WRITE MAP SECTOR 
   B0=B0+1                        * NEXT SECTOR 
   B6=0                           * RESET OB INDEX
42 IF (B7 LT 318D) GOTO 34        * IF MORE ENTRIES 
   B4=B4+1                        * NEXT SECTOR 
   IF (B4 LE 33) GOTO 32          * IF MORE SECTORS 
44 OB(B6)=0                       * CLEAR END OF BUFFER 
   B6=B6+1
   IF (B6 LT 502) GOTO 44         * IF MORE TO CLEAR
   IF (B0 GT 33) GOTO 50          * IF NO MORE SECTORS
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B3 SEC B0, ABT 74  * WRITE MAP SECTOR 
50 MSG 5 TO LINE B5               * MAPS WRITTEN
   B5=B5+2
60 B6=0                           * CLEAR OUTPUT BUFFER 
62 OB(B6)=0 
   B6=B6+1
   IF (B6 LT 502) GOTO 62         * IF MORE TO CLEAR
   OB(1)=SB(63) AND 0077 XOR 2200      * FORMAT CYLINDER
   B3=1052                        * MAXIMUM NORMAL CYLINDER 
   IF (DC EQ 11) B3=1447          * IF 200 MBYTE DEVICE 
   IF (DC EQ 10) B3=623           * IF 100 MBYTE DEVICE 
63 RES DRIVE, ABT 74
   REFORM OB(0), ABT 74           * FORMAT THE CYLINDER 
   MSG 15 (OB(0)) TO DISPLAY
   MSG 15 (OB(0)) TO LINE B5
64 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 64     * IF BUSY 
   IF (SB NE 0) GOTO 72           * IF ERROR ON FORMAT
   OB(0)=OB(0)+1                  * NEXT CYLINDER 
   IF (OB(0) LE B3) GOTO 63       * IF MORE CYLINDERS 
   OB(502)=B3+1                   * SET START CYLINDER
   OB(503)=B1                     * SET END CYLINDER
   EXIT TO 111                    * FORMAT ALTERNATE CYLINDERS
72 STATUS DETAIL, ABT 74          * GET DETAILED STATUS 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU14, FMDFT, (10,11,12), LOCK
*** 5.2.20 FFU14 - FORMAT MAP TRACK 
**
*          PURPOSE- 
*          FFU14 FORMATS THE MAP TRACK IN THE PROTECTED AREA OF THE 
*          DISK PACK.  FLAW MAPS ARE DESTROYED AND MUST BE RESTORED 
*          BY RUNNING FFU07 FOR EACH TRACK FLAW (100 AND 200 MEGA-
*          BYTE DEVICES) OR BY RUNNING FFU20 TO RESTORE THE MAPS
*          FROM ARCHIVED FLAW MAPS (317 MEGABYTE DEVICE ONLY).
* 
*          METHOD-
*          FFU14 FORMATS THE MAP TRACK.  SKIP DISPLACEMENT MAY BE 
*          SPECIFIED FOR 317 MEGABYTE DEVICES.  AFTER FORMATTING IS 
*          COMPLETE FFU14 WRITES THE SERIAL NUMBER AND DATE OF
*          FORMATTING IN TRACK 0, SECTOR 0 OF THE PROTECTED AREA. 
* 
*          ENTRY- 
*          FFU14 REQUIRES PARAMETERS P0 TO P3 SET TO INDICATE A SIX 
*          DIGIT DECIMAL PACK SERIAL NUMBER AND A SIX DIGIT DECIMAL 
*          DATE CODE.  ON 317 MEGABYTE DRIVES PARAMETERS P4 TO P9 
*          MUST BE SET TO SPECIFY SKIP DISPLACEMENT FOR THE MAP 
*          TRACK.  PARAMETER USAGE IS SHOWN BELOW-- 
* 
*            P0 - 0NNND - SERIAL NUMBER (FIRST 3 DIGITS)
*            P1 - 0NNND - SERIAL NUMBER (LAST 3 DIGITS) 
*            P2 - 0NNND - DATE CODE (FIRST 3 DIGITS)
*            P3 - 0NNND - DATE CODE (LAST 3 DIGITS) 
*            P4 P5 - 000N NNNN - SKIP DISPLACEMENT 1
*            P6 P7 - 000N NNNN - SKIP DISPLACEMENT 2
*            P8 P9 - 000N NNNN - SKIP DISPLACEMENT 3
/ 
*          EXIT-
*          FFU14 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS 
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU14 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU14 CALLS FFU98A TO DISPLAY DETAILED STATUS IF AN 
*          I/O FUNCTION IS ABORTED.  FFU14 CALLS FFU97B TO DISPLAY A
*          WARNING MESSAGE AND PAUSE. 
* 
*          REGISTERS USED-
*          FFU14 USES REGISTERS B0 TO B12.  REGISTERS ARE USED AS 
*          FOLLOWS--
*            B0 - ERROR FLAG (SET BY FFU97A)
*            B1 - MAP CYLINDER (SET BY FFU97A)
*            B2 - MAP TRACK 
*            B3 - MAP SECTOR
*            B4 - BCD CONVERSION
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - BCD DATE CODE 
*            B7 - BCD DATE CODE 
*            B8 - BCD DATE CODE 
*            B9 - BCD SERIAL NUMBER 
*           B10 - BCD SERIAL NUMBER 
*           B11 - BUFFER INDEX
*           B12 - SCRATCH PAD 
* 
*          BUFFERS USED-
*          FFU14 USES THE OUTPUT BUFFER FOR PARAMETERS NEEDED BY THE
*          FORMAT COMMAND.  BUFFER LOCATIONS USED ARE AS FOLLOWS--
*            OB(300) TO OB(306) - PARAMETERS FOR FORMATTING 
* 
* 
/  - FORMAT MAP TRACK - 
/ 
1  FORMAT FORMAT MAP TRACK - CH=*O, EQ=*O, UN=*O
2  FORMAT S/N = *HE*HE    DATE OF FORMAT = *H/*H/*H 
3  FORMAT SD1 = *O*OCT  SD2 = *O*OCT  SD3 = *O*OCT
4  FORMAT ERROR - P0 TO P3 MUST ALL BE 999 OR LESS
5  FORMAT MAP TRACK FORMATTING COMPLETE 
15 FORMAT MODULE FFU14
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   B5=5                           * SET LINE NUMBER 
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * IF ERROR
   IF (P0 GT 999D) GOTO 24        * IF PARAMETER TOO LARGE
   IF (P1 GT 999D) GOTO 24        * IF PARAMETER TOO LARGE
   IF (P2 GT 999D) GOTO 24        * IF PARAMETER TOO LARGE
   IF (P3 LE 999D) GOTO 26        * IF PARAMETER VALID
24 MSG 4 TO LINE 4                * PARAMETER TOO LARGE 
   MSG 16 TO LINE 6 
   PICTURE
   GOTO 77                        * ERROR EXIT
26 B4=P0                          * CONVERT SERIAL NUMBER TO BCD
   GOSUB 70 
   OB(0)=B4 
   B9=B4
   B4=P1
   GOSUB 70 
   OB(1)=B4 
   B10=B4 
   B4=P2                          * CONVERT DATE CODE TO BCD
   GOSUB 70 
   OB(2)=B4 
   B6=B4 RS 4 
   B7=B4 LS 4 AND 0360
   B4=P3
   GOSUB 70 
   OB(3)=B4 
   B8=B4 AND 0377 
   B7=B4 RS 8 XOR B7
   MSG 2 (B9,B10,B6,B7,B8) TO LINE 3
   IF (DC NE 12) GOTO 30          * IF NOT 317 MBYTE DEVICE 
   MSG 3 (P4,P5,P6,P7,P8,P9) TO LINE 4
   B5=6 
30 B15=3                          * SET MESSAGE NUMBER
   CALL 97B                       * PAUSE 
   OB(400)=B1                     * SET FORMAT PARAMETERS 
   OB(401)=SB(63) AND 0077
   OB(402)=0
   OB(403)=0
   OB(404)=0
   OB(405)=0
   OB(406)=0
   IF (DC NE 12) GOTO 32          * IF NOT 317 MEGABYTE DEVICE
   OB(403)=P8 LS 8 AND 7400 
   OB(403)=P9 RS 4 XOR OB(403)
   OB(404)=P9 LS 8 AND 7400 
   OB(405)=P6 LS 4 AND 0360 
   OB(404)=OB(404) XOR OB(405)
   OB(404)=P7 RS 8 XOR OB(404)
   OB(405)=P7 LS 4 AND 7760 
   OB(405)=P4 AND 0017 XOR OB(405)
   OB(406)=P5 
32 RES DRIVE, ABT 74
   REFORM OB(400), ABT 74         * FORMAT ONE TRACK
33 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 33     * IF BUSY 
   IF (SB NE 0) GOTO 76           * IF ERROR ON FORMAT
   B11=4                          * SET INDEX 
36 OB(B11)=0                      * CLEAR OUTPUT BUFFER 
   B11=B11+1
   IF (B11 LT 502) GOTO 36        * IF MORE TO CLEAR
   B2=0                           * MAP TRACK 
   B3=0                           * MAP SECTOR
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B2 SEC B3, ABT 74  * WRITE SECTOR 
   MSG 5 TO LINE B5               * FORMATTING COMPLETE 
   B5=B5+2
   MSG 16 TO LINE B5
   PICTURE
   GOTO 77                        * END OF MODULE 
/ 
/  BCD CONVERSION 
70 B12=B4                         * SAVE NUMBER TO BE CONVERTED 
   B4=0                           * CLEAR BCD ACCUMULATOR 
71 IF (B12 LT 100D) GOTO 72       * IF NO MORE HUNDREDS 
   B12=B12-100D                   * SUBTRACT 100
   B4=B4+0400                     * INCREMENT HUNDREDS
   GOTO 71                        * CHECK FOR MORE HUNDREDS 
72 IF (B12 LT 10D) GOTO 73        * IF NO MORE TENS 
   B12=B12-10D                    * SUBTRACT 10 
   B4=B4+0020                     * INCREMENT TENS
   GOTO 72                        * CHECK FOR MORE TENS 
73 B4=B4+B12                      * ADD ONES
   RETURN 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
   MSG 16 TO LINE B5
   PICTURE
   GOTO 77
76 STATUS DETAIL, ABT 74          * GET DETAILED STATUS 
   GOTO 74
77 END 20 
COMPILE 
   MODULE FFU15, FMDFT, (10,11,12), LOCK
*** 5.2.21 FFU15 - SCAN AND DISPLAY FLAWS 
**
*          PURPOSE- 
*          FFU15 SCANS A PORTION OF THE ASSIGNED DRIVE AND PRINTS A 
*          LIST OF TRACK FLAWS, SKIP DISPLACEMENT (317 MEGABYTE DEVICE
*          ONLY), HOME ADDRESS ERRORS, CYLINDER MISCOMPARES, AND
*          TRACK MISCOMPARES. 
* 
*          METHOD-
*          FFU15 STARTS WITH THE CYLINDER INDICATED BY PARAMETER P1 
*          AND DOES A SEEK FOLLOWED BY A SCAN COMMAND.  AFTER THE SCAN
*          COMPLETES FFU15 DOES A DIAGNOSTIC READ TO OBTAIN A LIST OF 
*          FLAWS FOR THE CURRENT CLINDER.  FFU15 THEN DISPLAYS THIS 
*          LIST OF FLAWS.  THE CYLINDER NUMBER IS THEN INCREMENTED AND
*          THE PROCESS CONTINUES UNTIL THE ENDING CYLINDER, INDICATED 
*          BY PARAMETER P2, HAS BEEN SCANNED. 
* 
*          ENTRY- 
*          FFU15 REQUIRES PARAMETERS P1 AND P2 TO BE SET TO INDICATE
*          THE STARTING AND ENDING CYLINDERS.  PARAMETER USAGE AND
*          ALLOWED OCTAL VALUES FOR EACH DEVICE SIZE ARE SHOWN BELOW--
* 
*                  PARAMETERS         317 MBYTE   200 MBYTE   100 MBYTE 
*            ----------------------   ---------   ---------   --------- 
*            P1 - STARTING CYLINDER   0 TO 1057   0 TO 1456   0 TO 632
*            P2 - ENDING CYLINDER     0 TO 1057   0 TO 1456   0 TO 632
* 
*          AN ERROR MESSAGE IS DISPLAYED IF EITHER OF THE PARAMETERS
*          IS TOO LARGE OR IF P1 IS GREATER THAN P2.
/ 
*          EXIT-
*          FFU15 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS 
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU15 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU15 ALSO CALLS FFU98A TO DISPALY DETAILED STATUS IF 
*          AN I/O FUNCTION IS ABORTED.
* 
*          REGISTERS USED-
*          FFU15 USES REGISTERS B0 TO B5, AND B8 TO B13.  REGISTERS ARE 
*          USED AS FOLLOWS--
*            B0 - CYLINDER
*            B1 - TRACK 
*            B2 - INPUT BUFFER INDEX
*            B3 - INPUT BUFFER INDEX
*            B4 - TRACK AND SECTOR FOR SEEK 
*            B5 - K DISPLAY LINE NUMBER 
*            B8 - SKIP DISPLACEMENT 3, UPPER
*            B9 - SKIP DISPLACEMENT 3, LOWER
*           B10 - SKIP DISPLACEMENT 2, UPPER
*           B11 - SKIP DISPLACEMENT 2, LOWER
*           B12 - SKIP DISPLACEMENT 1, UPPER
*           B13 - SKIP DISPLACEMENT 1, LOWER
* 
*          BUFFERS USED-
*          FFU15 USES THE INPUT BUFFER FOR READING THE LIST OF FLAWS
*          FROM THE FSC ADAPTER.
* 
* 
/  - SCAN AND DISPLAY FLAWS - 
/ 
1  FORMAT SCAN AND DISPLAY FLAWS - CH=*O  EQ=*O  UN=*O
2  FORMAT CYLINDERS *OCT TO *OCT
3  FORMAT 
4  FORMAT CY = *OCT   TR = *O   TRACK FLAW
5  FORMAT CY = *OCT   TR = *O   SD = *O*OCT  *O*OCT  *O*OCT 
6  FORMAT CY = *OCT   TR = *O   SD = *O*OCT  *O*OCT 
7  FORMAT CY = *OCT   TR = *O   SD = *O*OCT 
10 FORMAT CY = *OCT   TR = *O   HOME ADDRESS ERROR
11 FORMAT CY = *OCT   TR = *O   MISCOMPARE - CY READ = *OCT 
12 FORMAT CY = *OCT   TR = *O   MISCOMPARE - TR READ = *O 
13 FORMAT ABORT - SCAN COMMAND FAILED 
22 FORMAT - - - - - - - END OF LIST - - - - - - - 
23 FORMAT ERROR - MAX CY = *OCT FOR *OC MBYTE DEVICE
24 FORMAT ERROR - ILLEGAL RANGE OF CYLINDERS
25 FORMAT FFU15 SCAN CYL *OCT 
26 FORMAT - - - - - - - - - - - - - - - - - - - - 
30 BLANK
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   MSG 2 (P1,P2) TO LINE 3
   B5=5                           * SET DISPLAY LINE
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * JUMP IF ERROR 
   IF (P2 GE P1) GOTO 32          * IF VALID RANGE
   MSG 24 TO LINE B5              * ILLEGAL RANGE 
31 B5=B5+2                        * INCREMENT LINE NUMBER 
   GOTO 76                        * ABORT 
32 IF (P2 LE B1) GOTO 33          * IF VALID CYLINDER 
   MSG 23 (B1,B4) TO LINE B5      * ILLEGAL CYLINDER
   GOTO 31                        * ABORT 
33 B0=P1                          * SET CYLINDER
   B4=0                           * SET TRACK AND SECTOR
34 RES DRIVE, ABT 74
   SEEK CYL B0 TRK B4 SEC B4, ABT 74   * SEEK 
   SCAN, ABT 74                   * SCAN CYLINDER 
   MSG 25 (B0) TO LINE B5 
   MSG 25 (B0) TO DISPLAY 
36 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 36     * IF BUSY 
   IF (SB NE 0) GOTO 74           * ABORT IF STATUS NOT ZERO
   DIAGRD, ABT 74                 * READ BUFFER 
   GOSUB 40                       * PROCESS CYLINDER
   B0=B0+1                        * NEXT CYLINDER 
   IF (B0 LE P2) GOTO 34          * IF MORE CYLINDERS 
   GOTO 77                        * END OF MODULE 
/ 
/  PROCESS AND DISPLAY THE FLAWS IN IB (SUBROUTINE) 
40 B2=0                           * SET IB INDEX
46 IF (IB(B2) EQ 0) GOTO 64       * IF END OF IB
   IF (B5 LE 34D) GOTO 54         * IF DISPLAY NOT FULL 
   MSG 3 TO LINE B5 
   PICTURE                        * PRINT PAGE
50 B5=B5-1                        * CLEAR DISPLAY 
   MSG 3 TO LINE B5 
   IF (B5 GT 5) GOTO 50           * IF NOT DONE CLEARING
54 B3=B2+1                        * SET IB INDEX
   B1=IB(B2) AND 0077             * EXTRACT TRACK 
   MSG 4 (B0,B1) TO LINE B5       * ASSUME TRACK FLAWS
   IF (IB(B2) AND 4000 NE 0) GOTO 60  * IF TRACK FLAW 
   B8=IB(B3) RS 8                 * GET SKIP DISPLACEMENT 
   B9=IB(B3) AND 0377 LS 4
   B3=B3+1
   B10=IB(B3) RS 8
   B9=B9 XOR B10
   B10=IB(B3) AND 0360 RS 4 
   B11=IB(B3) AND 0017 LS 8 
   B3=B3+1
   B12=IB(B3) RS 4
   B11=B11 XOR B12
   B12=IB(B3) AND 0017
   B3=B3+1
   B13=IB(B3) 
   MSG 7 (B0,B1,B12,B13) TO LINE B5 
   IF (B8 OR B9 NE 0) GOTO 56     * IF 3 SKIPS
   IF (B10 OR B11 EQ 0) GOTO 57   * IF ONLY 1 SKIP
   MSG 6 (B0,B1,B12,B13,B10,B11) TO LINE B5 
   GOTO 57                        * 2 SKIPS 
56 MSG 5 (B0,B1,B12,B13,B10,B11,B8,B9) TO LINE B5 
57 IF (IB(B2) AND 2000 NE 0) GOTO 60  * IF SKIP DISPLACEMENT
   MSG 10 (B0,B1) TO LINE B5
   IF (IB(B2) AND 1000 NE 0) GOTO 60  * IF HOME ADRESS ERROR
   B3=B2+3                        * INDEX TO WORD 4 
   MSG 11 (B0,B1,IB(B3)) TO LINE B5 
   IF (IB(B2) AND 0400 NE 0) GOTO 60  * IF CY MISCOMPARE
   B3=B2+4                        * INDEX TO WORD 5 
   MSG 12 (B0,B1,IB(B3)) TO LINE B5 
   IF (IB(B2) AND 0200 NE 0) GOTO 60  * IF TR MISCOMPARE
   MSG 13 TO LINE B5              * SCAN FAILED 
   B0=P2
   GOTO 66                        * ABORT SCAN
60 B2=B2+5                        * INCREMENT IB INDEX
   B5=B5+1                        * NEXT LINE 
   IF (B2 LT 500) GOTO 46         * IF NOT END OF IB
64 IF (B0 LT P2) RETURN           * IF MORE CYLINDERS 
   MSG 22 TO LINE B5              * END OF LIST 
66 B5=B5+2
   MSG 26 TO LINE B5
   PICTURE
   RETURN 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 26 TO LINE B5
   PICTURE
77 END 30 
COMPILE 
   MODULE FFU16, FMDFT, (10,11,12), LOCK
*** 5.2.22 FFU16 - VERIFY UTILITY MAPS
**
*          PURPOSE- 
*          FFU16 COMPARES THE UTILITY TRACK FLAW MAP WITH ACTUAL FLAWED 
*          TRACKS ON A PORTION OF THE DISK.  ANY DIFFERENCES ARE
*          DISPLAYED.  FOR 317 MEGABYTE DEVICES FFU16 ALSO COMPARES 
*          THE SKIP DISPLACEMENT MAP WITH ACTUAL SKIP DISPLACEMENT
*          ON THE DISK.  ANY DIFFERENCES ARE DISPLAYED. 
* 
*          METHOD-
*          FFU16 BEGINS WITH THE CYLINDER INDICATED BY PARAMETER P1.
*          THE FLAW MAPS ARE READ AND ALL FLAWS IN THIS CYLINDER ARE
*          SAVED IN THE OUTPUT BUFFER.  THE CYLINDER IS THEN SCANNED
*          AND THE LIST OF FLAWS IS READ INTO THE INPUT BUFFER. 
*          FFU16A IS CALLED TO COMPARE THE DATA IN THE INPUT AND OUTPUT 
*          BUFFERS.  THIS PROCESS IS REPEATED FOR EACH CYLINDER UNTIL 
*          THE ENDING CYLINDER, SPECIFIED BY PARAMETER P2, IS 
*          VERIFIED.
* 
*          ENTRY- 
*          FFU16 REQUIRES PARAMETERS P1 AND P2 SET TO INDICATE THE
*          STARTING AND ENDING CYLINDERS.  PARAMETER USAGE AND
*          ALLOWED OCTAL VALUES FOR EACH DEVICE SIZE ARE SHOWN
*          BELOW--
* 
*                  PARAMETERS         317 MBYTE   200 MBYTE   100 MBYTE 
*            ----------------------   ---------   ---------   --------- 
*            P1 - STARTING CYLINDER   0 TO 1057   0 TO 1456   0 TO 632
*            P2 - ENDING CYLINDER     0 TO 1057   0 TO 1456   0 TO 632
* 
*          AN ERROR MESSAGE IS DISPLAYED IF EITHER OF THE PARAMETERS
*          IS TOO LARGE OR IF P1 IS GREATER THAN P2.
/ 
*          EXIT-
*          FFU16 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS 
*          ARE NOT USED BY THE OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU16 CALLS SUBMODULE FFU16A TO COMPARE THE LIST OF SKIPPED
*          SECTORS IN THE INPUT BUFFER WITH THE FLAW MAP ENTRIES IN THE 
*          OUTPUT BUFFER. 
*          FFU16 CALLS SUBMODULE FFU98A TO DISPLAY DETAILED STATUS IF 
*          AN I/O FUNCTION IS ABORTED.
* 
*          REGISTERS USED-
*          FFU16 USES REGISTERS B0, B3, B5, B6, B7, AND B8.  REGISTERS
*          ARE USED AS FOLLOWS--
*            B0 - MAP SECTOR NUMBER 
*            B1 - MAXIMUM CYLINDER (SET BY FFU97A)
*            B2 - INCREMENT 
*            B3 - OUTPUT BUFFER INDEX 
*            B4 - OUTPUT BUFFER SCAN INDEX
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - INPUT BUFFER INDEX
*            B7 - INPUT BUFFER INDEX
*            B8 - CYLINDER
*            B9 - SCRATCH PAD 
* 
*          BUFFERS USED-
*          FFU16 USES THE INPUT BUFFER FOR HOLDING THE LIST OF SKIPPED
*          SECTORS FOUND BY THE SCAN COMMAND.  THE OUTPUT BUFFER IS 
*          USED FOR HOLDING THE LIST OF SECTORS FROM THE FLAW MAPS. 
* 
* 
/  - VERIFY MAPS -
/ 
1  FORMAT VERIFY FLAW MAPS - CH=*O, EQ=*O, UN=*O
2  FORMAT CYLINDERS *OCT TO *OCT
3  FORMAT VERIFY COMPLETE 
6  FORMAT 
13 FORMAT ERROR - MAX CY = *OCT FOR *OC MBYTE DEVICE
14 FORMAT ERROR - ILLEGAL RANGE OF CYLINDERS
15 FORMAT FFU16 VERIFY CYL *OCT 
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   MSG 2 (P1,P2) TO LINE 3        * DISPLAY CYLINDER RANGE
   B5=5                           * SET LINE NUMBER 
   B8=P1                          * CYLINDER
   MSG 15 (B8) TO DISPLAY 
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * IF ERROR
   IF (P2 GE P1) GOTO 22          * IF VALID RANGE
   MSG 14 TO LINE B5              * ILLEGAL RANGE 
21 B5=B5+2
   GOTO 76                        * ERROR EXIT
22 IF (P2 LE B1) GOTO 23          * IF VALID CYLINDER 
   MSG 13 (B1,B4) TO LINE B5      * ILLEGAL CYLINDER
   GOTO 21                        * ERROR EXIT
/ 
/  FIND ALL MAP ENTRIES FOR CYLINDER B8 
23 B3=0                           * OB INDEX
24 OB(B3)=0                       * CLEAR OUTPUT BUFFER 
   B3=B3+1
   IF (B3 LT 500) GOTO 24         * IF MORE TO CLEAR
   B3=0                           * RESET OB INDEX
   B0=1                           * SET SECTOR
   B2=2                           * SET INCREMENT 
26 RES DRIVE, ABT 74
   GET FACTORY SECTOR B0, ABT 74  * READ UTILITY SECTOR 
   B7=0                           * SET IB INDEX
30 B6=B7+1
   IF (IB(B7) AND 4000 EQ 0) GOTO 36   * IF END OF FLAW MAP 
   IF (IB(B7) AND 1777 EQ B8) GOTO 50  * IF FLAW IN THIS CYL
32 B7=B7+B2                       * INCREMENT IB INDEX
   IF (B7 LT 318D) GOTO 30        * IF MORE FLAWS 
34 IF (DC NE 12) GOTO 40          * IF NOT 317 MEGABYTE DEVICE
   B2=6                           * SET INCREMENT 
35 B0=B0+1
   IF (B0 EQ 2) GOTO 35           * IF SECTOR 2 
   IF (B0 LE 33) GOTO 26          * IF MORE SECTORS 
36 IF (B2 EQ 6) GOTO 40           * END OF 317 MB MAPS
   IF (DC NE 12) GOTO 40          * IF NOT 317 MB DEVICE
   B2=6                           * SET INCREMENT 
   B0=3                           * SET MAP SECTOR
   GOTO 26                        * GO GET SKIP MAP 
40 B0=0                           * SET TRACK AND SECTOR
/ 
/  SCAN CYLINDER AND COMPARE FLAWS
   RES DRIVE, ABT 74
   SEEK CYL B8 TRK B0 SEC B0, ABT 74   * SEEK 
   SCAN, ABT 74                   * SCAN CYLINDER 
   MSG 15 (B8) TO LINE B5 
   MSG 15 (B8) TO DISPLAY 
42 STATUS GENERAL, ABT 74         * REQUEST GENERAL STATUS
   IF (SB AND 2 NE 0) GOTO 42     * IF BUSY 
   IF (SB NE 0) GOTO 74           * IF ERROR ON SCAN
   DIAGRD, ABT 74                 * READ BUFFER 
   CALL 16A                       * COMPARE 
44 B8=B8+1                        * NEXT CYLINDER 
   IF (B8 LE P2) GOTO 23          * IF MORE CYLINDERS 
   MSG 6 TO LINE B5 
   B5=B5+1
   MSG 3 TO LINE B5               * VERIFY COMPLETE 
47 B5=B5+2
   GOTO 76                        * END OF MODULE 
/ 
/  SAVE FLAW FROM MAP IN OB 
50 IF (B0 NE 1) GOTO 60           * IF SKIP DISPLACEMENT
   OB(B3)=IB(B6) RS 6 XOR 4000    * INDICATE TRACK FLAW 
   B3=B3+5                        * INCREMENT OB INDEX
   GOTO 32                        * CONTINUE
60 B4=B3                          * SET SCAN INDEX
62 IF (B4 NE 0) GOTO 64           * IF MORE TO SCAN 
   COPY IB(B6) TO OB(B3) FOR 5    * COPY SKIP DISPLACEMENT
   OB(B3)=IB(B6) RS 6 XOR 2000    * SKIP DISPLACEMENT ONLY
   B3=B3+5                        * INCREMENT OB INDEX
   GOTO 32                        * CONTINUE IB SCAN
64 B4=B4-5
   B9=IB(B6) RS 6 
   IF (OB(B4) AND 0077 EQ B9) GOTO 66  * IF TRACK FOUND 
   GOTO 62                        * CONTINUE OB SCAN
66 COPY IB(B6) TO OB(B4) FOR 5    * COPY SKIP DISPLACEMENT
   OB(B4)=IB(B6) RS 6 XOR 6000    * TRACK FLAW AND SKIP 
   GOTO 32                        * CONTINUE IB SCAN
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU16A, FMDFT, (10,11,12), LOCK 
*** 5.2.23 FFU16A - COMPARE AND DISPLAY ERRORS (SUBROUTINE) 
**
*          PURPOSE- 
*          FFU16A COMPARES THE ACTUAL FLAWED TRACKS AND SKIP
*          DISPLACEMENT (317 MEGABYTE DEVICE) IN ONE CYLINDER WITH THE
*          TRACK FLAWS AND SKIP DISPLACEMENT IN THE FLAW MAPS.
* 
*          METHOD-
*          FFU16A IS A SUBMODULE CALLED BY MODULE FFU16.
*          FFU16A FIRST CHECKS TO SEE THAT ALL OF THE FLAWED TRACKS 
*          AND SKIP DISPLACEMENTS LISTED IN THE INPUT BUFFER HAVE A 
*          CORRESPONDING ENTRY IN THE UTILITY FLAW MAPS LISTED IN THE 
*          OUTPUT BUFFER.  A CHECK IS MADE TO SEE IF ALL OF THE 
*          FLAW MAP ENTRIES HAVE A CORRESPONDING FLAWED TRACK OR SKIP 
*          DISPLACEMENT.  FFU16A DISPLAYS ANY DIFFERENCES BETWEEN THE 
*          TWO LISTS.  AFTER COMPARING THE LISTS FOR ONE CYLINDER 
*          FFU16A RETURNS TO FFU16. 
/ 
*          ENTRY- 
*          FFU16A ASSUMES THAT DATA TO BE COMPARED IS IN THE INPUT AND
*          OUTPUT BUFFERS.
* 
*          EXIT-
*          FFU16A MODIFIES REGISTER B5 AS DIFFERENCES BETWEEN THE LISTS 
*          ARE ADDED TO THE DISPLAY.  WHEN THE LISTS HAVE BEEN COMPARED 
*          FFU16A RETURNS FFU16.
* 
*          SUBMODULES REFERENCED- 
*          FFU16A DOES NOT CALL ANY SUBMODULES. 
* 
*          REGISTERS USED-
*          FFU16A USES REGISTERS B0, B1, AND B3 TO B7.  REGISTERS ARE 
*          USED AS FOLLOWS--
*            B3 - OUTPUT BUFFER INDEX 
*            B4 - OUTPUT BUFFER INDEX 
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - INPUT BUFFER INDEX
*            B7 - INPUT BUFFER INDEX
*            B8 - CYLINDER
*            B9 - TRACK 
* 
*          BUFFERS USED-
*          FFU16A ASSUMES THAT THE INPUT BUFFER CONTAINS A LIST OF
*          SKIPPED SECTORS AND FLAWED TRACKS.  THE OUTPUT BUFFER IS 
*          ASSUMED TO CONTAIN A LIST OF THE FLAW MAP ENTRIES FOR THE
*          CURRENT CYLINDER.
* 
* 
/  - COMPARE AND DISPLAY ERRORS (SUBROUTINE) -
/ 
1  FORMAT 
2  FORMAT CY=*OCT  TR=*O  SKIP DISPLACEMENT NOT IN MAP
3  FORMAT CY=*OCT  TR=*O  SKIP DISPLACEMENT COMPARE ERROR 
5  FORMAT CY=*OCT  TR=*O  SKIP DISPL. IN MAP BUT NOT SET
6  FORMAT CY=*OCT  TR=*O  TRACK FLAW NOT IN MAP 
7  FORMAT CY=*OCT  TR=*O  TRACK FLAW IN MAP BUT NOT SET 
10 FORMAT CY=*OCT  TR=*O  HOME ADDRESS ERROR ON SCAN
11 FORMAT CY=*OCT  TR=*O  CYLINDER MISCOMPARE ON SCAN 
12 FORMAT CY=*OCT  TR=*O  TRACK MISCOMPARE ON SCAN
13 FORMAT CY=*OCT  TR=*O  SCAN ERROR
/ 
/  CHECK FOR FLAWED (IB) BUT NOT IN MAP (OB)
20 B7=0                           * SET IB INDEX
22 B6=B7+1
   B4=0                           * SET OB INDEX
   B9=IB(B7) AND 0077             * SET TRACK 
   IF (IB(B7) AND 7600 EQ 0) GOTO 40   * IF END OF IB 
   IF (IB(B7) AND 1600 NE 0) GOTO 23   * IF NO SCAN ERROR 
   IF (DC EQ 12) GOTO 24          * IF 317 MBYTE DEVICE 
   IF (IB(B7) AND 2000 EQ 0) GOTO 24   * IF NO SKIP DISPLACEMENT
   MSG 13 (B8,B9) TO LINE B5      * SD ON NON-317 MB DEVICE 
   GOTO 35
23 GOSUB 60                       * CHECK DISPLAY 
   MSG 10 (B8,B9) TO LINE B5
   IF (IB(B7) AND 1000 NE 0) GOTO 35   * IF HOME ADDRESS ERROR
   MSG 11 (B8,B9) TO LINE B5
   IF (IB(B7) AND 0400 NE 0) GOTO 35   * IF CYLINDER MISCOMPARE 
   MSG 12 (B8,B9) TO LINE B5
   GOTO 35
24 B3=B4+1
   IF (OB(B4) AND 6000 EQ 0) GOTO 30   * IF END OF OB 
   IF (OB(B4) AND 0077 NE B9) GOTO 26  * IF NOT SAME TRACK
   IF (DC NE 12) GOTO 37          * IF NOT 317 MEGABYTE DEVICE
   IF (IB(B7) NE OB(B4)) GOTO 30  * IF IB NE OB 
   IF (IB(B6) NE OB(B3)) GOTO 30  * IF IB AND OB DIFFER 
   IF (IB(B6+1) NE OB(B3+1)) GOTO 30   * IF IB NE OB
   IF (IB(B6+2) NE OB(B3+2)) GOTO 30   * IF IB NE OB
   IF (IB(B6+3) NE OB(B3+3)) GOTO 30   * IF IB NE OB
   GOTO 37                        * COMPARE OK
26 B4=B4+5                        * INCREMENT OB INDEX
   IF (B4 LT 500) GOTO 24         * IF NOT END OF OB
30 GOSUB 60                       * CHECK DISPLAY 
   IF (IB(B7) AND 4000 EQ 0) GOTO 32   * IF NO TRACK FLAW 
   IF (OB(B4) AND 4000 NE 0) GOTO 32   * IF OK
   MSG 6 (B8,B9) TO LINE B5 
   B5=B5+1
32 IF (IB(B7) AND 2000 EQ 0) GOTO 37   * IF NO SKIP DISPLACEMENT
   IF (OB(B4) AND 2000 EQ 0) GOTO 34   * IF SKIP DISPLACEMENT ERROR 
   IF (IB(B6) NE OB(B3)) GOTO 33  * IF IB NE OB 
   IF (IB(B6+1) NE OB(B3+1)) GOTO 33   * IF IB NE OB
   IF (IB(B6+2) NE OB(B3+2)) GOTO 33   * IF IB NE OB
   IF (IB(B6+3) EQ OB(B3+3)) GOTO 37   * IF SKIP OK 
33 MSG 3 (B8,B9) TO LINE B5 
   GOTO 35
34 MSG 2 (B8,B9) TO LINE B5 
35 B5=B5+1                        * INCREMENT LINE COUNT
37 B7=B7+5                        * INCREMENT IB INDEX
   IF (B7 LT 500) GOTO 22         * IF NOT END OF IB
/ 
/  CHECK FOR ENTRY IN MAP (OB) BUT NOT FLAWED (IB)
40 B4=0                           * RESET OB INDEX
42 B3=B4+1
   B7=0                           * RESET IB INDEX
   B9=OB(B4) AND 0077 
   IF (OB(B4) AND 6000 EQ 0) EXIT      * IF END OF OB 
44 B6=B7+1
   IF (IB(B7) AND 7600 EQ 0) GOTO 50   * IF END OF IB 
   IF (IB(B7) AND 0077 NE B9) GOTO 46  * IF DIFFERENT TRACK 
   IF (DC NE 12) GOTO 57          * IF NOT 317 MB DEVICE
   IF (IB(B7) NE OB(B4)) GOTO 50  * IF IB NE OB 
   IF (IB(B6) NE OB(B3)) GOTO 50  * IF IB NE OB 
   IF (IB(B6+1) NE OB(B3+1)) GOTO 50   * IF IB NE OB
   IF (IB(B6+2) NE OB(B3+2)) GOTO 50   * IF IB NE OB
   IF (IB(B6+3) NE OB(B3+2)) GOTO 50   * IF IB NE OB
   GOTO 57                        * COMPARE OK
46 B7=B7+5                        * INCREMENT IB INDEX
   IF (B7 LT 500) GOTO 44 
50 GOSUB 60                       * CHECK DISPLAY 
   IF (OB(B4) AND 4000 EQ 0) GOTO 52   * IF NO TRACK FLAW 
   IF (IB(B7) AND 4000 NE 0) GOTO 52   * IF OK
   MSG 7 (B8,B9) TO LINE B5 
   B5=B5+1
52 IF (OB(B4) AND 2000 EQ 0) GOTO 57   * IF NO SKIP DISPLACEMENT
   IF (IB(B7) AND 2000 NE 0) GOTO 57   * IF NO SKIP ERROR 
54 MSG 5 (B8,B9) TO LINE B5 
55 B5=B5+1
57 B4=B4+5                        * INCREMENT OB INDEX
   IF (B4 LT 500) GOTO 42         * IF NO END OF OB 
   EXIT 
/ 
60 IF (B5 LE 34D) GOTO 64         * IF DISPLAY NOT FULL 
   MSG 1 TO LINE B5 
   PICTURE
62 B5=B5-1                        * CLEAR DISPLAY 
   MSG 1 TO LINE B5 
   IF (B5 GT 5) GOTO 62           * IF NOT DONE CLEARING
64 RETURN 
77 END 20 
COMPILE 
   MODULE FFU17, FMDFT, (12), LOCK
*** 5.2.24 FFU17 - ARCHIVE 317 MEGABYTE DEVICE FLAW MAPS
**
*          PURPOSE- 
*          FFU17 READS THE SERIAL NUMBER, UTILITY TRACK FLAW MAP, 
*          AND SKIP DISPLACEMENT MAP FROM THE ASSIGNED 317 MEGABYTE 
*          DEVICE AND WRITES THEM TO THE SYSTEM SCRATCH FILE. 
* 
*          METHOD 
*          FFU17 STARTS BY READING THE FLAW MAPS ONE SECTOR AT A TIME.
*          AFTER EACH SECTOR IS READ IT IS COPIED TO THE SYSTEM 
*          SCRATCH FILE.  THUS, EACH SECTOR OF THE FLAW MAPS BECOMES
*          ONE RECORD ON THE SCRATCH FILE.  THIS PROCESS CONTINUES
*          UNTIL TRACK 0, SECTORS 0, 1, AND 3 TO 27 OF THE PROTECTED
*          AREA HAVE BEEN COPIED TO THE SCRATCH FILE.  WHEN FFU17 
*          COMPLETES THE SCRATCH FILE WILL HAVE 27 RECORDS. 
* 
*          ENTRY- 
*          FFU17 IS ONLY FOR USE ON 317 MEGABYTE DRIVES.
*          FFU17 DOES NOT REQUIRE SETTING ANY PARAMETERS BEFORE 
*          EXECUTION. 
/ 
*          EXIT-
*          FFU17 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS 
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU17 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU17 CALLS FFU98A TO DISPLAY DETAILED STATUS IF AN 
*          I/O FUNCTION IS ABORTED.  FFU17 CALLS FFU97B TO DISPLAY A
*          WARNING MESSAGE AND PAUSE. 
* 
*          REGISTERS USED-
*          FFU17 USES REGISTERS B5 AND B3.  REGISTERS ARE USED AS 
*          FOLLOWS--
*            B5 - K DISPLAY LINE NUMBER 
*            B3 - SECTOR
* 
*          BUFFERS USED-
*          FFU17 USES THE INPUT BUFFER FOR FLAW TABLE READ FROM THE 
*          DISK.  THE OUTPUT BUFFER IS USED TO WRITE THE TABLES TO THE
*          SCRATCH FILE.
* 
* 
/  - ARCHIVE MAPS - 
/ 
1  FORMAT ARCHIVE FLAW MAPS - CH=*O, EQ=*O, UN=*O 
2  FORMAT FLAW MAPS ARCHIVED ON SYSTEM SCRATCH FILE 
15 FORMAT MODULE FFU17
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   B5=4                           * SET DISPLAY LINE NUMBER 
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * IF ERROR
24 B15=6                          * SET MESSAGE NUMBER
   CALL 97B                       * PAUSE 
   SYSREW                         * REWIND SYSTEM FILE
30 B3=0                           * SET MAP SECTOR
31 RES DRIVE, ABT 74
   GET FACTORY SECTOR B3, ABT 74  * READ FLAW MAPS
   COPY IB TO OB FOR 502
   SYSWR                          * WRITE FILE
   B3=B3+1                        * NEXT SECTOR 
   IF (B3 NE 2) GOTO 32           * IF NOT SECTOR 2 
   B3=B3+1                        * SKIP SECTOR 2 
32 IF (B3 LE 33) GOTO 31          * IF MORE SECTORS 
   MSG 2 TO LINE 4                * MAPS ARCHIVED 
   MSG 16 TO LINE 6 
   PICTURE
   SYSREW                         * REWIND SYSTEM FILE
   GOTO 77                        * END OF MODULE 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU20, FMDFT, (12), LOCK
*** 5.2.25 FFU20 - RESTORE 317 MEGABYTE DEVICE FLAW MAPS
**
*          PURPOSE- 
*          FFU20 COPIES ARCHIEVED UTILITY FLAW MAPS FROM THE SYSTEM 
*          SCRATCH FILE TO THE UTILITY FLAW MAP TRACK.
* 
*          METHOD-
*          FFU20 READS THE UTILITY MAPS FROM THE SCRATCH FILE.  EACH
*          RECORD ON THE FILE CONTAINS DATA FOR ONE SECTOR OF THE 
*          MAPS.  AFTER READING EACH RECORD IT IS COPIED TO THE 
*          UTILITY MAP TRACK ON THE DISK.  THIS PROCESS IS CONTINUED
*          UNTIL TRACK 0, SECTORS 0, 1, AND 3 TO 27 OF THE PROTECTED
*          AREA HAVE BEEN WRITTEN.
* 
*          ENTRY- 
*          FFU20 IS ONLY FOR USE ON 317 MEGABYTE DRIVES.
*          FFU20 ASSUMES THAT THE SCRATCH FILE CONTAINS 27 RECORDS
*          CORRESPONDING TO THE SERIAL NUMBER, TRACK FLAW MAP, AND
*          25 SECTORS OF SKIP DISPLACEMENT INFORMATION. 
*          FFU20 DOES NOT REQUIRE SETTING ANY PARAMETERS BEFORE 
*          EXECUTION. 
/ 
*          EXIT-
*          FFU20 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS 
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU20 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU20 CALLS FFU98A TO DISPLAY DETAILED STATUS IF AN 
*          I/O FUNCTION IS ABORTED.  FFU20 CALLS FFU97B TO DISPLAY A
*          WARNING MESSAGE AND PAUSE. 
* 
*          REGISTERS USED-
*          FFU20 USES REGISTERS B0, B1, B3, B5, AND B7.  REGISTERS ARE
*          USED AS FOLLOWS--
*            B0 - MAP TRACK (SET TO ZERO BY FFU97A) 
*            B1 - MAP CYLINDER (SET BY FFU97A)
*            B3 - MAP SECTOR
*            B5 - K DISPLAY LINE NUMBER 
*            B7 - STATUS OF SYSTEM READ 
* 
*          BUFFERS USED-
*          FFU20 USES THE INPUT BUFFER FOR THE DATA READ FROM THE 
*          SCRATCH FILE AND THE OUTPUT BUFFER FOR DATA WRITTEN TO THE 
*          FLAW MAP SECTORS.
* 
* 
/  - RESTORE UTILITY MAPS - 
/ 
1  FORMAT RESTORE FLAW MAPS FROM SCRATCH FILE 
6  FORMAT UTILITY MAPS WRITTEN FROM SYSTEM FILE 
7  FORMAT 317 MBYTE DRIVE - CH=*O, EQ=*O, UN=*O 
10 FORMAT    DISK S/N = *HE*HE
11 FORMAT ARCHIVE S/N = *HE*HE
14 FORMAT ERROR - SCRATCH FILE ERROR
15 FORMAT MODULE FFU20
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   SYSREW 
   MSG 1 TO LINE 2
   MSG 7 (SB(61),SB(62),SB(63)) TO LINE 3 
   B5=5                           * SET DISPLAY LINE
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * IF ERROR
   RES DRIVE, ABT 74
   GET SERIAL, ABT 74             * READ DRIVE S/N
   COPY IB TO OB FOR 502
   SYSRD, STATUS TO B7            * READ ARCHIVE S/N
   IF (B7 NE 0) GOTO 70           * IF ERROR
   SYSREW 
   MSG 10 (OB(0),OB(1)) TO LINE 4 
   MSG 11 (IB(0),IB(1)) TO LINE 5 
   B5=7                           * SET DISPLAY LINE
26 B15=4                          * SET MESSAGE NUMBER
   CALL 97B                       * PAUSE 
   B5=7                           * SET DISPLAY LINE
   B3=0                           * SET SECTOR
30 SYSRD, STATUS TO B7            * READ ARCHIVE
   IF (B7 NE 0) GOTO 70           * IF ERROR
   COPY IB TO OB FOR 500          * SET OUTPUT BUFFER 
   OB(500)=0
   OB(501)=0
   RES DRIVE, ABT 74
   WRPRO CYL B1 TRK B0 SEC B3, ABT 74  * WRITE MAP SECTOR 
   B3=B3+1                        * NEXT SECTOR 
   IF (B3 NE 2) GOTO 32           * IF NOT SECTOR 2 
   B3=B3+1                        * SKIP SECTOR 2 
32 IF (B3 LE 33) GOTO 30          * IF MORE SECTORS 
   MSG 6 TO LINE B5 
   GOTO 72                        * END OF MODULE 
70 MSG 14 TO LINE B5              * SYSRD ERROR 
72 B5=B5+2
   GOTO 76
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU21,FMDFT(10,11,12), LOCK 
*** 5.2.26 FFU21 - COPY CONTROLWARE TO DISK DRIVE 
**
*          PURPOSE- 
*          FFU21 COPIES FR204 CONTROLWARE FROM THE SYSTEM SCRATCH FILE
*          TO THE DISK. 
* 
*          METHOD-
*          FFU21 USES A SUBROUTINE TO READ ONE RECORD FROM THE SYSTEM 
*          SCRATCH FILE AND PACK IT IN THE INPUT BUFFER.  WHEN THE
*          FIRST RECORD FROM THE SYSTEM FILE IS READ FFU21 CALLS
*          SUBMODULE FFU21B TO CALCULATE THE LENGTH OF THE CONTROLWARE
*          DECK.  THE PACKED INPUT BUFFER IS THEN COPIED TO THE OUTPUT
*          BUFFER ONE WORD AT A TIME.  WHEN THE OUTPUT BUFFER IS FULL 
*          FFU21 CALLS SUBMODULE FFU21A TO WRITE ONE SECTOR TO THE
*          DISK.  WHEN THE LAST WORD OF THE INPUT BUFFER HAS BEEN MOVED 
*          TO THE OUTPUT BUFFER FFU21 READS ANOTHER RECORD FROM THE 
*          SYSTEM SCRATCH FILE, PACKS IT, AND THE ABOVE PROCESS 
*          CONTINUES UNTIL ALL OF THE CONTROLWARE HAS BEEN COPIED TO
*          THE DISK.
* 
*          ENTRY- 
*          FFU21 ASSUMES THAT THE SCRATCH FILE CONTAINS THE CONTROLWARE 
*          TO BE COPIED TO THE DISK.  THE FORMAT OF THE CONTROLWARE 
*          BINARY MUST BE IDENTICAL TO ITS RELEASED FORMAT.  (WITH OR 
*          WITHOUT A LABEL AND DATA IN THE RIGHT-MOST 8 OF A 12-BIT 
*          WORD)
*          THE CMSE SCRATCH FILE CAN BE CREATED BY TYPING THE FOLLOWING 
*          CMSE COMMANDS--
*            1. CR,ON.        TO TURN CARD READER ON
*            2. LC,10000.     TO READ CONTROLWARE TO CM 
*            3. *WC,SCRACH,10000,15514. 
/ 
*          EXIT-
*          FFU21 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS 
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU21 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU21 CALLS FFU98A TO DISPLAY DETAILED STATUS IF AN 
*          I/O FUNCTION IS ABORTED.  FFU21 CALLS FFU21A TO WRITE EACH 
*          SECTOR OF CONTROLWARE TO THE DISK.  FFU21 CALLS FFU21B TO
*          CALCULATE THE LENGTH OF THE CONTROLWARE DECK.
* 
*          REGISTERS USED-
*          FFU21 USES REGISTERS B0 TO B13.  REGISTERS ARE USED AS 
*          FOLLOWS--
*            B0 - CYLINDER
*            B1 - TRACK 
*            B2 - SECTOR
*            B3 - COUNTER FOR PACKED INPUT BUFFER DATA
*            B4 - COUNTER FOR OUTPUT BUFFER DATA
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - SYSRD COUNTER 
*            B7 - INPUT BUFFER PACKING METHOD 
*            B8 - LENGTH OF PACKED INPUT BUFFER 
*            B9 - POINTER TO PACKED INPUT BUFFER DATA 
*           B10 - POINTER TO UNPACKED BUFFER DATA 
*           B11 - TOTAL NUMBER OF RECORDS ON SCRATCH FILE 
*           B12 - LENGTH OF LAST RECORD ON SCRATCH FILE 
*           B13 - SUBMODULE ERROR FLAG
* 
*          BUFFERS USED-
*          FFU21 USES THE INPUT BUFFER FOR CONTROLWARE READ FROM THE
*          SYSTEM SCRATCH FILE.  THE OUTPUT BUFFER IS USED FOR WRITING
*          CONTROLWARE TO THE DISK SECTOR.  EACH SECTOR CONTAINS 3856 
*          BITS OF DATA FOLLOWED BY 8 UNUSED BITS.
* 
* 
/  - COPY CONTROLWARE TO DISK - 
* 
1  FORMAT COPY CONTROLWARE TO DISK - CH=*O, EQ=*O, UN=*O
3  FORMAT ERROR - CONTROLWARE DECK WRONG LENGTH 
4  FORMAT EXPECTED *DE RECORDS WITH *DE BYTES IN LAST RECORD
5  FORMAT ACTUAL   *DE RECORDS WITH *DE BYTES IN LAST RECORD
6  FORMAT WARNING - CONTROLWARE TRUNCATED TO 20 SECTORS 
7  FORMAT CONTROLWARE COPIED TO DISK
15 FORMAT MODULE FFU21
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   B5=5                           * SET DISPLAY LINE
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * IF ERROR
   B0=B1                          * SET CYLINDER
   B1=1                           * STARTING TRACK
   B2=0                           * STARTING SECTOR 
   B4=0                           * COUNTER(0-501) FOR OB DATA
   B6=0                           * SYSRD COUNTER 
   B11=2                          * SET LENGTH TO ALLOW READ
   B7=0                           * PACKING IB METHOD 0,1, OR 2 
   SYSREW 
   GOSUB 40                       * SYSRD AND PACK IT 
   CALL 21B                       * DETERMINE LENGTH OF CONTROLWARE 
22 COPY IB(B3) TO OB(B4) FOR 1
   IF (B4 NE 501) GOTO 24         * IF OB NOT FULL
   CALL 21A                       * WRITE ONE SECTOR
   IF (B13 NE 0) GOTO 74          * IF ERROR
   IF (B3 EQ 325) GOTO 25         * IF IB FULL
   IF (B7 EQ 0) GOTO 31           * IF IB ON WORD BOUNDARY
   GOTO 32
24 IF (B3 NE B8) GOTO 31          * IF IB NOT FULL
25 IF (B6 LT B11) GOTO 30         * IF MORE RECORDS TO READ 
26 B4=B4+1
   OB(B4)=0                       * CLEAR END OF BUFFER 
   IF (B4 LT 501) GOTO 26         * IF MORE TO CLEAR
   CALL 21A                       * WRITE LAST SECTOR 
   IF (B13 NE 0) GOTO 74          * IF ERROR
   IF (B2 LE 20D) GOTO 27         * IF ALL CONTROLWARE WRITTEN
   MSG 6 TO LINE B5               * TRUNCATED 
   B5=B5+2
27 MSG 7 TO LINE B5               * COPY COMPLETE 
   B5=B5+2
   GOTO 76                        * END OF MODULE 
30 GOSUB 40                       * SYSRD AND PACK IT 
   IF (B7 NE 1) GOTO 22           * IF OB(B4) NOT FILLED
   GOTO 32
31 B3=B3+1                        * INCREMENT IB POINTER
32 IF (B4 NE 501) GOTO 34         * TO INCREMENT OB POINTER 
   B4=0 
   GOTO 22
34 B4=B4+1                        * INCREMENT OB POINTER
   GOTO 22
* 
*   DESCRIPTION 
/         SYSRD ONE BLOCK AND PACK IT SUBROUTINE
* 
*         1.  SYSRD ONE BLOCK FROM THE SCRATCH FILE AND INSURE
*             THE FILE HAS THE CORRECT NUMBER OF WORDS. 
*         2.  DETERMINE THE PACKING METHOD. 
*             A.  IF B7 = 0 PACK IB(0) THROUGH IB(500) INTO IB(0) 
*                 THROUGH IB(325).
*             B.  IF B7 = 1 PACK IB(0) THROUGH IB(500) INTO IB(0) 
*                 THROUGH IB(325), RIGHT SHIFT THE PACKED DATA BY 
*                 4 AND RESTORE IB(0) BITS 8-11 FROM THE OUTPUT BUFFER. 
*             C.  IB B7 = 2 PACK IB(0) THROUGH IB(500) INTO IB(0) 
*                 THROUGH IB(325), RIGHT SHIFT THE PACKED DATA BY 8 
*                 AND RESTORE IB(0) BITS 4-11 FROM THE OUTPUT BUFFER. 
*         3.  UPDATE PACKING METHOD (B7 = B7 +1 MODULO 3) AND RETURN. 
* 
40 B3=0                           * SET COUNTER FOR IB DATA 
   SYSRD, STATUS TO BA
   B6=B6+1                        * INCREMENT COUNTER 
   IF (B6 NE B11) GOTO 42         * IF NOT LAST SYSRD 
   IB(WT)=0 
   IF (WT LT B12) GOTO 41         * IF DECK TOO SHORT 
   IF (WT-B12 LE 4) GOTO 44       * IF LAST SYSRD OK
41 MSG 3 TO LINE 5                * WRONG LENGTH
   MSG 4 (B11,B12) TO LINE 6
   MSG 5 (B6,WT) TO LINE 7
   B5=9 
   GOTO 76                        * ERROR EXIT
42 IF (BA NE 0) GOTO 41           * IF DECK IS WRONG LENGTH 
44 B10=0                          * PACKED POINTER
   B9=0                           * UNPACKED IB POINTER 
   IB(500)=0
   B8=325                         * SET NORMAL LENGTH 
   IF (B6 NE 1) GOTO 45           * IF NOT FIRST READ 
   IF (IB(0) NE 7700) GOTO 45     * IF NO 77 TABLE
   B9=120                         * SKIP TABLE
   B8=237                         * SET SHORT LENGTH
45 IF (B7 NE 0) GOTO 50           * IF PACK AND SHIFT 4 OR 8
/         PACK THE INPUT BUFFER. (NO SHIFTING)
46 IB(501)=IB(B9+1) RS 4          * PACK 24 BITS
   IB(B10)=IB(B9) LS 4 XOR IB(501)
   IB(501)=IB(B9+1) AND 17 LS 10
   IB(B10+1)=IB(501) XOR IB(B9+2) 
   B9=B9+3                        * INCREMENT UNPACKED POINTER
   B10=B10+2                      * INCREMENT PACKED POINTER
   IF (B9 LT 500) GOTO 46         * IF MORE BITS TO PACK
   IF (B8 EQ 237) GOTO 64         * IF 77 TABLE SKIPPED 
   B7=B7+1                        * INCREMENT PACKING METHOD
   GOTO 64
50 IF (B7 NE 1) GOTO 54           * IF PACK AND SHIFT 8 
/         PACK AND SHIFT IB RIGHT 4 BITS
   IB(502)=OB(B4) XOR IB(B9)
52 IB(B10)=IB(B10) XOR IB(B9)     * PACK 24 BITS
   IB(B10+1)=IB(B9+1) LS 4
   IB(B10+1)=IB(B9+2) RS 4 XOR IB(B10+1)
   IB(B10+2)=IB(B9+2) AND 17 LS 10
   B9=B9+3                        * INCREMENT UNPACKED POINTER
   B10=B10+2                      * INCREMENT PACKED POINTER
   IF (B9 NE 501) GOTO 52         * IF MORE BITS TO PACK
   B7=B7+1                        * INCREMENT PACKING METHOD
   GOTO 60
/         PACK AND SHIFT IB RIGHT 8 BITS
54 IB(502)=IB(0) RS 4 XOR OB(B4)
56 IB(501)=IB(B9) AND 17 LS 10
   IB(B10)=IB(B9) RS 4 XOR IB(B10)
   IB(B10+1)=IB(501) XOR IB(B9+1) 
   IB(B10+2)=IB(B9+2) LS 4
   B9=B9+3                        * INCREMENT UNPACKED POINTER
   B10=B10+2                      * INCREMENT PACKED POINTER
   IF (B9 NE 501) GOTO 56         * IF MORE BITS TO PACK
   B7=0                           * UPDATE PACKING METHOD 
60 IB(0)=IB(502)
64 RETURN 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
76 MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU21A,FMDFT(10,11,12), LOCK
*** 5.2.27 FFU21A - WRITE CONTROLWARE TO DISK (SUBROUTINE)
**
*          PURPOSE- 
*          FFU21A IS CALLED BY FFU21 TO WRITE ONE SECTOR OF CONTROLWARE 
*          TO THE DISK. 
* 
*          METHOD-
*          FFU21A WRITES ONE SECTOR USING THE WRITE PROTECTED SECTOR
*          COMMAND.  FFU21A THEN INCREMENTS THE SECTOR NUMBER BY ONE. 
*          SINCE THE WRITE DOES NOT WRITE A MULTIPLE OF 12-BIT WORDS
*          THE INPUT BUFFER MUST BE SHIFTED BEFORE MORE WORDS CAN BE
*          COPIED FROM THE INPUT BUFFER TO THE OUTPUT BUFFER.  IF THE 
*          PACKING METHOD IS 1 THE INPUT BUFFER IS RIGHT SHIFTED BY 8 
*          BITS.  IF THE PACKING METHOD IS 0 OR 2 THE INPUT BUFFER IS 
*          LEFT SHIFTED BY 4 BITS.  AFTER THE BUFFER HAS BEEN SHIFTED 
*          THE PACKING METHOD IS DECREMENTED BY 1 AND FFU21A RETURNS
*          TO FFU21.
/ 
*          ENTRY- 
*          FFU21A IS CALLED BY FFU21.  REGISTERS B0, B1, B2, AND B7 ARE 
*          ASSUMED TO CONTAIN VALID INFORMATION.  REGISTER B13 IS 
*          ASSUMED TO BE ZERO.
* 
*          EXIT-
*          FFU21A TERMINATES BY RETURNING TO FFU21.  REGISTER B2
*          CONTAINS THE NUMBER FOR THE NEXT SECTOR TO BE WRITTEN, 
*          B7 CONTAINS THE PACKING METHOD, AND B13 IS NON-ZERO IF AN
*          ERROR OCCURRED.
* 
*          SUBMODULES REFERENCED- 
*          FFU21A DOES NOT CALL ANY SUBMODULES. 
* 
*          REGISTERS USED-
*          FFU21A USES REGISTERS B0, B1,  B2, B7, B10, AND B13. 
*          REGISTERS ARE USED AS FOLLOWS--
*            B0 - CYLINDER TO WRITE CONTROLWARE 
*            B1 - TRACK 
*            B2 - SECTOR
*            B7 - INPUT BUFFER PACKING METHOD 
*           B10 - POINTER TO UNPACKED INPUT BUFFER DATA 
*           B13 - ERROR FLAG
* 
*          BUFFERS USED-
*          FFU21A USES THE INPUT BUFFER FOR CONTROLWARE READ FROM THE 
*          SYSTEM SCRATCH FILE.  THE OUTPUT BUFFER IS USED FOR WRITING
*          CONTROLWARE TO THE DISK SECTOR.
* 
* 
/  - WRITE CONTROLWARE TO DISK (SUBROUTINE) - 
/ 
15 FORMAT FFU21A WROTE SECTOR *O
20 IF (B2 GT 20D) GOTO 22         * IF ALL SECTORS WRITTEN
   RES DRIVE, ABT 74
   WRPRO CYL B0 TRK B1 SEC B2, ABT 74 
   MSG 15 (B2) TO DISPLAY 
22 B2=B2+1                        * UPDATE SECTOR ADDRESS 
   IB(326)=0
   B10=0
   IF (B7 EQ 1) GOTO 40           * TO RIGHT SHIFT IB 8 BITS
/         LEFT SHIFT INPUT BUFFER BY 4 BITS 
25 IB(B10)=IB(B10) AND 377 LS 4 
   IB(B10)=IB(B10+1) RS 10 XOR IB(B10)
   IF (B10 EQ 325) GOTO 30        * IF DONE SHIFTING
   B10=B10+1                      * INCREMENT POINTER 
   GOTO 25
30 IF (B7 EQ 0) GOTO 35           * TO DECREMENT PACKING METHOD 
   B7=B7-1                        * DECREMENT PACKING METHOD
   EXIT 
35 B7=2 
   EXIT 
/         RIGHT SHIFT IB BY 8 BITS
40 B10=324
46 IB(501)=IB(B10) AND 377 LS 4 
   IB(B10+1)=IB(B10+1) RS 10 XOR IB(501)
   IF (B10 EQ 0) GOTO 30          * IF DONE SHIFTING
   B10=B10-1
   GOTO 46
74 B13=1                          * SET ERROR FLAG
   EXIT                           * RETURN
   END 20 
COMPILE 
   MODULE FFU21B, FMDFT, (10,11,12), LOCK 
*** 5.2.28 FFU21B - DETERMINE LENGTH OF CONTROLWARE (SUBROUTINE)
**
*          PURPOSE- 
*          FFU21B DETERMINES THE LENGTH OF THE CONTROLWARE DECK AND 
*          DISPLAYS THE CONTROLWARE NUMBER AND REVISION LEVEL.
* 
*          METHOD-
*          FFU21B ASSUMES THAT THE FIRST RECORD OF THE SCRATCH FILE 
*          CONTAINING THE CONTROLWARE DECK HAS BEEN READ TO THE INPUT 
*          BUFFER AND PACKED.  HEXADECIMAL MEMORY ADDRESS 3B OF THE 
*          CONTROLWARE CONTAINS THE LAST MEMORY ADDRESS TO CHECKSUM.
*          THE CONTROLWARE DECK STARTS WITH MEMORY ADDRESS 30.  THE 
*          FOLLOWING ALGORITHM IS USED TO CALCULATE THE LENGTH OF THE 
*          CONTROLWARE DECK-- 
*           1. SUBTRACT 2F FROM THE LAST LOCATION TO CHECKSUM.
*              NOTE THAT 16 BIT ARITHMETIC IS REQUIRED.  THE RESULT IS
*              THE NUMBER OF MEMORY LOCATIONS TO BE LOADED BY AN
*              AUTOLOAD FUNCTION. 
*           2. IF THE CONTROLWARE DECK IS PRECEDED BY A 77 TABLE ADD
*              40 DECIMAL. (HALF THE LENGTH OF THE 77 TABLE)
*           3. DIVIDE BY 160 DECIMAL (NUMBER OF WORDS PER RECORD ON 
*              THE SCRATCH FILE)
*           4. QUOTIENT + 1  IS THE NUMBER OF RECORDS ON THE SCRATCH
*              FILE.
*           5. REMAINDER X 2  IS THE NUMBER OF BYTES IN THE LAST RECORD.
* 
*          FFU21B ALSO EXTRACTS THE LAST 4 DIGITS OF THE CONTROLWARE
*          NUMBER FROM MEMORY ADDRESS 3C AND THE REVISION FROM
*          ADDRESS 3D.  THE CONTROLWARE NUMBER AND REVISION ARE 
*          DISPLAYED. 
/ 
*          ENTRY- 
*          FFU21B IS CALLED BY FFU21.  REGISTER B8 IS ASSUMED TO
*          CONTAIN VALID INFORMATION.  THE INPUT BUFFER IS ASSUMED TO 
*          CONTAIN THE FIRST RECORD OF THE CONTROLWARE FILE.
* 
*          EXIT-
*          FFU21B TERMINATES BY RETURNING TO FFU21.  REGISTERS B11, 
*          B12, AND B13 ARE USED BY FFU21.
* 
*          SUBMODULES REFERENCED- 
*          FFU21B DOES NOT CALL ANY SUBMODULES. 
* 
*          REGISTERS USED-
*          FFU21B USES REGISTERS B8 AND B11 TO B15.  REGISTERS ARE USED 
*          AS FOLLOWS-- 
*            B8 - LENGTH OF PACKED INPUT BUFFER 
*           B11 - TOTAL NUMBER OF RECORDS ON SCRATCH FILE 
*           B12 - LENGTH OF LAST RECORD ON SCRATCH FILE 
*           B13 - CONTROLWARE REVISION, ERROR FLAG
*           B14 - UPPER DIGITS OF CONTROLWARE NUMBER
*           B15 - LOWER DIGITS OF CONTROLWARE NUMBER
* 
*          BUFFERS USED-
*          FFU21B ASSUMES THAT THE INPUT BUFFER CONTAINS THE FIRST
*          RECORD OF THE CONTROLWARE DECK.
* 
* 
/  - DETERMINE LENGTH OF CONTROLWARE -
/ 
1  FORMAT M*H*H  REV *D  CONTROLWARE
6  FORMAT ERROR - CONTROLWARE LESS THAN 256 WORDS 
15 FORMAT MODULE FFU21B 
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 MSG 15 TO DISPLAY
22 B13=IB(16) LS 4 AND 0360       * UPPER 8 BITS
   B13=IB(17) RS 8 XOR B13
   B14=IB(17) AND 0377            * LOWER 8 BITS
   IF (B13 NE 0) GOTO 24          * IF MORE THAN 256 WORDS
   MSG 6 TO LINE 5                * TOO SHORT 
   MSG 16 TO LINE 7 
   PICTURE
   GOTO 77                        * ERROR EXIT
24 IF (B14 GE 57) GOTO 26         * IF LOWER GE 2F
   B13=B13-1                      * BORROW
   B14=B14+400
26 B14=B14-57                     * SUBTRACT 2F 
   IF (B8 NE 237) GOTO 30         * IF NO 77 TABLE
   B14=B14+50                     * ADD LENGTH OF 77 TABLE (WORDS)
   IF (B14 LT 400) GOTO 30        * IF NO CARRY 
   B14=B14-400
   B13=B13+1
30 B11=1                          * SET QUOTIENT
32 IF (B14 GE 240) GOTO 34        * IF NO BORROW NEEDED 
   IF (B13 EQ 0) GOTO 36          * IF DIVISION COMPLETE
   B13=B13-1                      * BORROW
   B14=B14+400
34 B14=B14-240                    * SUBTRACT 240
   B11=B11+1                      * INCREMENT QUOTIENT
   GOTO 32                        * CONTINUE DIVIDE 
36 B12=B14 LS 1                   * SET REMAINDER (BYTES) 
   B14=IB(20) RS 4                * UPPER DIGITS OF CONTROLWARE NUMBER
   B15=IB(20) LS 4 AND 0360 
   B15=IB(21) RS 8 XOR B15        * LOWER DIGITS OF CONTROLWARE NUMBER
   B13=IB(22) RS 4 AND 0017       * REVISION
   MSG 1 (B14,B15,B13) TO LINE 3  * CONTROLWARE NUMBER
   B13=0                          * CLEAR ERROR FLAG
   EXIT                           * RETURN
77 END 20 
COMPILE 
   MODULE FFU22, FMDFT, (10,11,12), LOCK
*** 5.2.29 FFU22 - READ FR204 CONTROLWARE REVISION
**
*          PURPOSE- 
*          FFU22 DISPLAYS THE REVISION NUMBER OF THE CONTROLWARE
*          CURRENTLY IN THE FR204 FSC ADAPTER.
* 
*          METHOD-
*          FFU22 OBTAINS DETAILED STATUS AND EXTRACTS THE CONTROLWARE 
*          REVISION NUMBER FROM WORD 17.
* 
*          ENTRY- 
*          FFU22 DOES NOT REQUIRE SETTING ANY PARAMETERS BEFORE 
*          EXECUTION. 
/ 
*          EXIT-
*          FFU22 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS 
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU22 CALLS SUBMODULE FFU98A TO DISPLAY DETAILED STATUS IF 
*          AN I/O FUNCTION IS ABORTED.
* 
*          REGISTERS USED-
*          FFU22 USES REGISTERS B0 AND B5.  REGISTERS ARE USED AS 
*          FOLLOWS--
*            B0 - CONTROLWARE REVISION NUMBER 
*            B5 - K DISPLAY LINE NUMBER 
* 
*          BUFFERS USED-
*          FFU22 USES THE STATUS BUFFER FOR DETAILED STATUS READ FROM 
*          THE CONTROLLER.
* 
* 
/  - READ CONTROLWARE REVISION -
/ 
1  FORMAT CURRENT CONTROLWARE REVISION - CH=*O, EQ=*O 
2  FORMAT REVISION = *D 
15 FORMAT MODULE FFU22
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   MSG 15 TO DISPLAY
   MSG 1 (SB(61),SB(62)) TO LINE 2
   B5=3                           * SET DISPLAY LINE
   RES CONTROLLER, ABT 74 
   STATUS DETAIL, ABT 74          * REQUEST DETAILED STATUS 
   REL, ABT 74
   B0=SB(17D) AND 1700 RS 6       * EXTRACT REVISION
   MSG 2 (B0) TO LINE 4           * DISPLAY REVISION
24 MSG 16 TO LINE 6 
   PICTURE
   GOTO 77                        * END OF MODULE 
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
   MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU23, FMDFT, (10,11,12), LOCK
*** 5.2.30 FFU23 - WRITE DIAGNOSTIC TRACKS
**
*          PURPOSE- 
*          FFU23 WRITES A SPECIFIC PATTERN FOR USE BY DIAGNOSTIC
*          PROGRAMS ON THE TRACKS LISTED BELOW--
* 
*                              317 MBYTE   200 MBYTE   100 MBYTE
*            ---------------   ---------   ---------   ---------
*            CYLINDER (OCTAL)    1057        1456         632 
*            TRACKS (OCTAL)     2 TO 35     2 TO 22     2 TO 22 
* 
*          THE PATTERN HAS THE HEXADECIMAL FORM SHOWN BELOW-- 
*                         E36A AAAA 
*          THIS PATTERN IS REPEATED TO FILL EACH SECTOR.
* 
*          METHOD-
*          FFU23 BUILDS THE REQUIRED PATTERN IN THE OUTPUT BUFFER.
*          THE WRITE CODED SECTOR FUNCTION IS THEN USED TO COPY THE 
*          PATTERN TO THE DISK. 
* 
*          ENTRY- 
*          FFU23 DOES NOT REQUIRE SETTING ANY PARAMETERS BEFORE 
*          EXECUTION. 
/ 
*          EXIT-
*          FFU23 TERMINATES WITH AN END STATEMENT.  REGISTER CONTENTS 
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU23 CALLS SUBMODULE FFU97A TO CHECK THE ASSIGNED DEVICE
*          CODE.  FFU23 ALSO CALLS FFU98A TO DISPLAY DETAILED STATUS IF 
*          AN I/O FUNCTION IS ABORTED.
* 
*          REGISTERS USED-
*          FFU23 USES REGISTERS B0 TO B11. REGISTERS ARE USED AS
*          FOLLOWS--
*            B0 - ERROR FLAG
*            B1 - CYLINDER
*            B2 - MAXIMUM TRACK 
*            B3 - MAXIMUM SECTOR
*            B4 - DEVICE SIZE 
*            B5 - DISPLAY LINE NUMBER 
*            B6 - OUTPUT BUFFER INDEX 
*            B7 - PATTERN INDEX 
*            B8 - NUMBER OF SECTORS TO WRITE
*            B9 - TRACK 
*           B10 - SECTOR
*           B11 - SENSE BYTE 7
* 
*          BUFFERS USED-
*          FFU23 USES BOTH THE INPUT AND OUTPUT BUFFERS AS FOLLOWS--
*            IB(0) TO IB(7) - PATTERN 
*            OB(0) TO OB(501) - WRITE DATA
* 
* 
/  - WRITE DIAGNOSTIC TRACKS -
/ 
1  FORMAT WRITE DIAGNOSTIC TRACKS - CH=*O, EQ=*O, UN=*O 
2  FORMAT DIAGNOSTIC TRACKS WRITTEN 
3  FORMAT SKIPPED FLAWED TRACK - CY=*OCT, TR=*O 
15 FORMAT FFU23 TRACK *O
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 BLANK
   B9=2                           * SET STARTING TRACK
   MSG 15 (B9) TO DISPLAY 
   MSG 1 (SB(61),SB(62),SB(63)) TO LINE 2 
   B5=4                           * SET DISPLAY LINE
   CALL 97A                       * CHECK DEVICE CODE 
   IF (B0 NE 0) GOTO 74           * IF ERROR
   IB(0)=7066                     * SET PATTERN 
   IB(1)=5252 
   IB(2)=5256 
   IB(3)=1552 
   IB(4)=5252 
   IB(5)=5343 
   IB(6)=3252 
   IB(7)=5252 
   B6=0                           * SET OB INDEX
   B7=0                           * SET PATTERN INDEX 
24 OB(B6)=IB(B7)                  * LOAD OUTPUT BUFFER
   B7=B7 + 1 AND 7                * NEXT PATTERN
   B6=B6+1                        * NEXT OUTPUT BUFFER LOCATION 
   IF (B6 LT 502) GOTO 24         * IF BUFFER NOT FULL
/ 
/  WRITE TRACKS 
30 RES DRIVE, ABT 74
   B8=B3+1                        * SET NUMBER OF SECTORS 
   B10=0                          * SET STARTING SECTOR 
   WRITE B8 CODED SECTORS AT CYL B1 TRK B9 SEC B10, ABT 60
34 B9=B9+1                        * NEXT TRACK
   MSG 15 (B9) TO DISPLAY 
   MSG 15 (B9) TO LINE B5 
   IF (B9 LE B2) GOTO 30          * IF MORE TRACKS
   MSG 2 TO LINE B5 
   B5=B5+2                        * INCREMENT DISPLAY LINE
   MSG 16 TO LINE B5
   PICTURE
   GOTO 77
/ 
/  CHECK FOR TRACK FLAW 
60 IF (SB NE 5020) GOTO 74        * IF GENERAL STATUS NE 5020 
   B0=SB(5) AND 0017 LS 4         * EXTRACT SENSE BYTE 7
   B11=SB(6) AND 7400 RS 8
   B11=B11 XOR B0 
   IF (B11 NE 0013) GOTO 74       * IF NOT A TRACK FLAW 
   MSG 3 (B1,B9) TO LINE B5       * DISPLAY TRACK FLAW MESSAGE
   B5=B5+1
   GOTO 34                        * GO ON TO NEXT TRACK 
/ 
/  DISPLAY DETAILED STATUS
74 CALL 98A                       * DISPLAY DETAILED STATUS 
   B5=B5+1
   MSG 16 TO LINE B5
   PICTURE
77 END 20 
COMPILE 
   MODULE FFU65, 6000, (10,11,12), LOCK 
*** 5.2.31 FFU65 - DISPLAY FR204 MEMORY 
**
*          PURPOSE- 
*          FFU65 DISPLAYS 32 WORDS OF FR204 PROGRAM MEMORY AND PROVIDES 
*          A MEANS OF CHANGING THE CONTENTS OF MEMORY.
* 
*          METHOD-
*          FFU65 DISPLAYS 32 WORDS BEGINNING AT THE ADDRESS SPECIFIED 
*          BY P0 AND P1.  FOR EXAMPLE, IF P0=1H AND P1=234H FFU65 WILL
*          DISPLAY 32 WORDS BEGINNING AT HEXADECIMAL ADDRESS 1234.
*          AFTER DISPLAYING THE CONTENTS OF MEMORY FFU65 PAUSES.  WHEN
*          A GO COMMAND IS ENTERED PARAMETERS P2 AND P3 ARE CHECKED.
*          IF THEY ARE NON-ZERO THEY ARE ASSUMED TO CONTAIN THE ADDRESS 
*          OF A MEMORY LOCATION TO BE CHANGED.  P4 AND P5 ARE ASSUMED 
*          TO CONTAIN THE DATA TO BE STORED AT THAT ADDRESS.  PARAMETERS
*          ARE CHANGED TO AN 8-BITS-PER-WORD FORMAT AND P4, P5 IS 
*          WRITTEN AT LOCATION P2, P3.  FINALLY, FFU65 AGAIN DISPLAYS 
*          32 WORDS OF MEMORY AND PAUSES. 
* 
*          ENTRY- 
*          FFU65 REQUIRES PARAMETERS P0 TO P5 SET TO INDICATE MEMORY
*          DISPLAY ADDRESS, MEMORY WRITE ADDRESS, AND MEMORY WRITE
*          DATA.  PARAMETERS ARE USED AS FOLLOWS--
*            P0 P1 - NH NNNH - DISPLAY ADDRESS
*            P2 P3 - NH NNNH - MEMORY ADDRESS TO CHANGE (IF NON-ZERO) 
*            P4 P5 - NH NNNH - MEMORY WRITE DATA
/ 
*          EXIT-
*          FFU65 TERMINATES WITH A PAUSE STATEMENT.  REGISTER CONTENTS
*          ARE NOT USED BY OTHER MODULES. 
* 
*          SUBMODULES REFERENCED- 
*          FFU65 DOES NOT CALL ANY SUBMODULES.
* 
*          REGISTERS USED-
*          FFU65 USES REGISTERS B0 TO B10, BA, AND WC.  REGISTERS ARE 
*          USED AS FOLLOWS--
*            B0 - INPUT BUFFER INDEX
*            B1 - MESSAGE NUMBER
*            B2 - LINE NUMBER 
*            B3 TO B10 - DATA FOR DISPLAY LINE
*            BA - OUTPUT BUFFER STARTING ADDRESS
*            WC - OUTPUT WORD COUNT 
* 
*          BUFFERS USED-
*          FFU65 USES THE INPUT BUFFER FOR DATA READ FROM FR204 MEMORY. 
*          THE OUTPUT BUFFER IS USED FOR FUNCTION PARAMETERS SENT TO
*          THE FSC ADAPTER. 
* 
* 
/  - DISPLAY FR204 MEMORY - 
/ 
1  FORMAT P0 P1 = *H *HEH - DISPLAY ADDRESS 
2  FORMAT P2 P3 = *H *HEH - ADDRESS TO CHANGE (IF NON-ZERO) 
3  FORMAT FFU65  FR204 MEMORY DISPLAY 
4  FORMAT    *HE-       *HE-       *HE-       *HE-
5  FORMAT 0  *H*H    8  *H*H    0  *H*H    8  *H*H
6  FORMAT 1  *H*H    9  *H*H    1  *H*H    9  *H*H
7  FORMAT 2  *H*H    A  *H*H    2  *H*H    A  *H*H
10 FORMAT 3  *H*H    B  *H*H    3  *H*H    B  *H*H
11 FORMAT 4  *H*H    C  *H*H    4  *H*H    C  *H*H
12 FORMAT 5  *H*H    D  *H*H    5  *H*H    D  *H*H
13 FORMAT 6  *H*H    E  *H*H    6  *H*H    E  *H*H
14 FORMAT 7  *H*H    F  *H*H    7  *H*H    F  *H*H
15 FORMAT ABORT - EC=*OCT AT LINE *OCT
16 FORMAT P4 P5 = *H *HEH - DATA TO WRITE IN MEMORY 
17 FORMAT TYPE GO TO CONTINUE 
   DATA (OB(0),CON) 0002,0000,0000,0000,0000
20 BLANK
   MSG 3 TO LINE 1
   MSG 3 TO DISPLAY 
   MSG 1 (P0,P1) TO LINE 3
   MSG 2 (P2,P3) TO LINE 4
   MSG 16 (P4,P5) TO LINE 5 
   B1=P0 AND 0017 XOR 0500        * SET DISPLAY ADDRESS 
   OB(0)=P1 AND 7760
   OB(1)=32D
   GOSUB 40                       * SET DISPLAY ADDRESS 
   GOSUB 44                       * DISPLAY 40B LOCATIONS 
   IF (ES AND TM EQ 0) GOTO 23    * IF NOT TERMINAL MODE
   PICTURE
   BLANK
23 PAUSE
24 IF (P2 NE 0) GOTO 26           * IF MEMORY CHANGE
   IF (P3 EQ 0) GOTO 20           * IF NO MEMORY CHANGE 
26 B1=P2 AND 0017 XOR 0500        * SET MEMORY ADDRESS
   OB(0)=P3 
   OB(1)=1
   GOSUB 40                       * CHANGE 1 MEM. LOCATION
   OB(1)=P4 LS 4 AND 0360 
   OB(0)=P5 RS 8 XOR OB(1)        * SET DATA
   OB(1)=P5 AND 0377
   WC=2                           * WORD COUNT
   BA=0                           * BUFFER ADDRESS
   FOUT 0702, ABT 70              * WRITE MEMORY
   GOTO 20
/         MANIPULATE PROCESSOR SUBROUTINE 
40 WC=2                           * WORD COUNT
   BA=0                           * BUFFER ADDRESS
   RES, ABT 70
   FOUT B1, ABT 70                * MANIPULATE PROCESSOR FUNCTION 
   RETURN 
/         INPUT AND DISPLAY FR204 MEMORY SUBROUTINE.
44 WC=64D                         * WORD COUNT
   BA=0                           * BUFFER ADDRESS
   FIN 0701, ABT 70               * READ MEMORY 
   B0=0                           * POINTER 
   B1=5                           * MESSAGE NUMBER
   B2=10                          * LINE NUMBER 
50 B3=IB(B0)
   B4=IB(B0+1)
   B5=IB(B0+20) 
   B6=IB(B0+21) 
   B7=IB(B0+40) 
   B8=IB(B0+41) 
   B9=IB(B0+60) 
   B10=IB(B0+61)
   MSG B1 (B3,B4,B5,B6,B7,B8,B9,B10) TO LINE B2 
   B0=B0+2
   B1=B1+1
   B2=B2+1
   IF (B0 NE 20) GOTO 50          * IF MORE LINES TO DISPLAY
   B1=P0 LS 8 AND 7400
   B0=P1 RS 4 XOR B1
   B1=B0+1
   MSG 4 (B0,B0,B1,B1) TO LINE 7
   B2=B2+1                        * INCREMENT LINE NUMBER 
   MSG 17 TO LINE B2              * TYPE GO 
   RETURN 
70 MSG 15 (EC,EA) TO LINE 21
   MSG EM TO LINE 23
   PICTURE
   ENDSUB 
   END 20 
COMPILE 
   MODULE FFU97A, FMDFT, (10,11,12), LOCK 
*** 5.2.32 FFU97A - CHECK DEVICE CODE 
**
*          PURPOSE- 
*          FFU97A VERIFIES THAT THE ASSIGNED DEVICE CODE MATCHES THE
*          DEVICE CAPACITY INDICATED BY DETAILED STATUS WORD 20.
* 
*          METHOD-
*          FFU97A RESERVES THE DRIVE AND OBTAINS DETAILED STATUS.  AN 
*          ERROR MESSAGE IS DISPLAYED IF EITHER OF THESE FUNCTIONS
*          FAILS.  BITS 11 AND 10 OF DETAILED STATUS WORD 20 ARE
*          EXAMINED AND COMPARED WITH THE DEVICE CODE.  BIT COMBINATIONS
*          AND DEVICE CODES ARE SHOWN BELOW-- 
* 
*            BIT 11   BIT 10     DEVICE SIZE     DEVICE CODE
*            ------   ------   ---------------   -----------
*              1        1       317 MEGABYTE         12 
*              1        0       200 MEGABYTE         11 
*              0        1       100 MEGABYTE         10 
*              0        0            UNUSED          -- 
* 
*          AN ERROR FLAG IS SET AND AN ERROR MESSAGE IS DISPLAYED IF AN 
*          ERROR IS DETECTED.  IF THE BITS AND THE DEVICE CODE MATCH, 
*          THE DEVICE SIZE AND MAXIMUM CYLINDER, TRACK, AND SECTOR ARE
*          STORED IN REGISTERS AND FFU97A RETURNS TO THE CALLING MODULE.
/ 
*          ENTRY- 
*          FFU97A ASSUMES THAT REGISTER B5 CONTAINS THE LINE NUMBER FOR 
*          THE K DISPLAY. 
* 
*          EXIT-
*          FFU97A TERMINATES BY RETURNING TO THE CALLING MODULE.
*          REGISTER B0 IS SET TO ZERO IF NO ERROR OCCURRED AND NON-ZERO 
*          IF FFU97A DETECTED AN ERROR.  REGISTERS B1, B2, AND B3 
*          CONTAIN MAXIMUM CYLINDER, TRACK, AND SECTOR FOR THE ASSIGNED 
*          DEVICE.  REGISTER B4 IS THE DEVICE SIZE IN MEGABYTES (100, 
*          200, OR 317 OCTAL).
* 
*          SUBMODULES REFERENCED- 
*          FFU97A DOES NOT CALL ANY SUBMODULES. 
* 
*          REGISTERS USED-
*          FFU97A USES REGISTERS B0 TO B4.  REGISTERS ARE USED AS 
*          FOLLOWS--
*            B0 - ERROR FLAG
*            B1 - MAXIMUM CYLINDER
*            B2 - MAXIMUM TRACK 
*            B3 - MAXIMUM SECTOR
*            B4 - DEVICE SIZE (MEGABYTES) 
* 
*          BUFFERS USED-
*          FFU97A USES THE STATUS BUFFER FOR GENERAL AND DETAILED 
*          STATUS.  BUFFER LOCATIONS ARE AS FOLLOWS-- 
*            SB(0) - GENERAL STATUS 
*            SB(1) TO SB(20D) - DETAILED STATUS 
* 
/  - CHECK DEVICE CODE -
/ 
1  FORMAT DEVICE CODE DOES NOT MATCH DETAILED STATUS WORD 20
2  FORMAT ILLEGAL DETAILED STATUS WORD 20 
3  FORMAT RESERVE OR DETAIL STATUS FUNCTION ABORTED - FFU97A
20 RES DRIVE, ABT 74
   STATUS DETAIL, ABT 74
   B0=0                           * INDICATE NO ERROR 
   B4=SB(20D) AND 6000 RS 4       * SET DEVICE SIZE 
   IF (B4 NE 0) GOTO 30           * IF VALID CODE 
   MSG 2 TO LINE B5               * UNEXPECTED DETAIL STATUS
   GOTO 76                        * ABORT 
30 B1=DC - 7 LS 6                 * CHECK DEVICE CODE 
   IF (B1 EQ B4) GOTO 40          * IF VALID DEVICE CODE
   MSG 1 TO LINE B5               * DEVICE CODE ERROR 
   GOTO 76                        * ABORT 
40 IF (B4 NE 300) GOTO 42         * IF NOT 317 MBYTE DEVICE 
   B1=559D                        * SET MAXIMUM CYLINDER
   B2=29D                         * SET MAXIMUM TRACK 
   B3=27D                         * SET MAXIMUM SECTOR
   B4=317                         * 317 MBYTE DEVICE
   GOTO 50                        * RETURN
42 B1=814D                        * SET MAXIMUM CYLINDER
   B2=18D                         * SET MAXIMUM TRACK 
   B3=20D                         * SET MAXIMUM SECTOR
   IF (B4 EQ 200) GOTO 50         * IF 200 MBYTE DEVICE 
   B1=410D                        * 100 MBYTE DEVICE
50 EXIT 
74 MSG 3 TO LINE B5               * ERROR ON DETAILED STATUS
76 B5=B5+2                        * INCREMENT LINE NUMBER 
   B0=1                           * INDICATE ERROR
   EXIT 
   END 20 
COMPILE 
   MODULE FFU97B, FMDFT, (10,11,12), LOCK 
*** 5.2.33 FFU97B - PAUSE (SUBROUTINE)
**
*          PURPOSE- 
*          FFU97B DISPLAYS A WARNING MESSAGE AND PAUSES.
* 
*          METHOD-
*          FFU97B ASSUMES THAT THE CALLING MODULE HAS PLACED A MESSAGE
*          NUMBER IN REGISTER B15.  THIS NUMBER IS USED TO SELECT A 
*          WARNING MESSAGE WHICH IS DISPLAYED.  IF OPERATION IS IN
*          TERMINAL MODE THE DISPLAY IS PRINTED AND THE SCREEN IS 
*          ERASED.  FFU97B THEN PAUSES AND WAITS FOR THE USER TO TYPE 
*          GO.
/ 
*          ENTRY- 
*          FFU97B ASSUMES THAT REGISTERS B5 AND B15 CONTAIN VALID 
*          INFORMATION. 
* 
*          EXIT-
*          FFU97B TERMINATES BY RETURNING TO THE CALLING MODULE.
*          REGISTER B5 CONTAINS THE K DISPLAY LINE NUMBER.
* 
*          SUBMODULES REFERENCED- 
*          FFU97B DOES NOT CALL ANY SUBMODULES. 
* 
*          REGISTERS USED-
*          FFU97B USES REGISTERS B5 AND B15.  REGISTERS ARE USED AS 
*          FOLLOWS--
*            B5 - K DISPLAY LINE NUMBER 
*           B15 - MESSAGE NUMBER
* 
*          BUFFERS USED-
*          FFU97B DOES NOT USE THE INPUT OR OUTPUT BUFFER.
* 
* 
/  - DISPLAY MESSAGE AND PAUSE (SUBROUTINE) - 
1  FORMAT TYPE GO TO CONTINUE 
2  FORMAT WARNING - DISK WILL BE WRITTEN - DATA MAY BE LOST 
3  FORMAT WARNING - FLAW MAPS WILL BE DESTROYED 
4  FORMAT WARNING - FLAW MAPS WILL BE WRITTEN 
5  FORMAT WARNING - TRACK WILL BE FLAWED - DATA MAY BE LOST 
6  FORMAT WARNING - SYSTEM SCRATCH FILE WILL BE WRITTEN 
16 FORMAT 
20 IF (ES AND TM NE 0) GOTO 40    * IF TERMINAL MODE
   MSG 1 TO LINE B5               * TYPE GO 
   B5=B5+1
   MSG B15 TO LINE B5 
   MSG 1 TO DISPLAY 
   PAUSE
   MSG 16 TO LINE B5              * ERASE MESSAGE 
   B5=B5-1
   MSG 16 TO LINE B5
   EXIT 
40 MSG 1 TO LINE B5 
   B5=B5+1
   MSG B15 TO LINE B5 
   MSG 1 TO DISPLAY 
   PICTURE
   PAUSE
   BLANK                          * ERASE SCREEN
   B5=1                           * RESET LINE NUMBER 
   EXIT 
   END 20 
COMPILE 
   MODULE FFU98A, FMDFT, (10,11,12), LOCK 
*** 5.2.34 FFU98A - DISPLAY ERROR MESSAGES (SUBROUTINE) 
**
*          PURPOSE- 
*          FFU98A DISPLAYS THE ERROR CODE, LINE NUMBER, LAST FUNCTION,
*          GENERAL STATUS, AND DETAILED STATUS.  THIS MODULE IS CALLED
*          WHEN AN I/O COMMAND IS ABORTED.
* 
*          METHOD-
*          FFU98A DISPLAYS THE STATUS RESULTING FROM THE LAST I/O 
*          COMMAND.  THE DETAILED STATUS DISPLAYED IS THAT CONTAINED IN 
*          THE STATUS BUFFER.  THE FIRST 16 WORDS OF DETAILED STATUS
*          ARE DISPLAYED AS 24 SENSE BYTES IN HEXADECIMAL FORMAT. 
*          FFU98A DOES NOT REQUEST STATUS FROM THE FR204 ADAPTER. 
/ 
*          ENTRY- 
*          FFU98A ASSUMES THAT REGISTER B5 CONTAINS THE LINE NUMBER FOR 
*          THE K DISPLAY.  THE STATUS BUFFER IS ASSUMED TO CONTAIN
*          GENERAL AND DETAILED STATUS. 
* 
*          EXIT-
*          FFU98A TERMINATES BY RETURNING TO THE CALLING MODULE.
*          REGISTER B5 CONTAINS THE K DISPLAY LINE NUMBER.
* 
*          SUBMODULES REFERENCED- 
*          FFU98A DOES NOT CALL ANY SUBMODULES. 
* 
*          REGISTERS USED-
*          FFU98A USES REGISTER B5 FOR THE K DISPLAY LINE NUMBER
* 
*          BUFFERS USED-
*          FFU98A USES THE STATUS BUFFER FOR GENERAL AND DETAILED 
*          STATUS.  BUFFER LOCATIONS ARE AS FOLLOWS-- 
*            SB(0) - GENERAL STATUS 
*            SB(1) TO SB(20D) - DETAILED STATUS 
* 
* 
/  - DISPLAY ERROR MESSAGES (SUBROUTINE) -
/       ENTER WITH DISPLAY LINE NUMBER IN B5. 
/ 
1  FORMAT 
2  FORMAT ERROR CODE = *OCT AT LINE *OCT, LAST FCN = *OCT 
3  FORMAT GENERAL STATUS = *OCT 
4  FORMAT SENSE BYTES = 
5  FORMAT  0=*H   1=*H   2=*H   3=*H   4=*H   5=*H
6  FORMAT  6=*H   7=*H   8=*H   9=*H  10=*H  11=*H
7  FORMAT 12=*H  13=*H  14=*H  15=*H  16=*H  17=*H
10 FORMAT 18=*H  19=*H  20=*H  21=*H  22=*H  23=*H
11 FORMAT DETAILED STATUS = 
12 FORMAT 17=*OCT  18=*OCT  19=*OCT  20=*OCT
20 IF (B5 LE 30) GOTO 24          * IF ROOM FOR STATUS
   PICTURE
   BLANK
   B5=0 
24 B5=B5+1
   MSG 1 TO LINE B5 
   B5=B5+1
   MSG EM TO LINE B5
   B5=B5+1
   MSG 1 TO LINE B5 
   B5=B5+1
   MSG 2 (EC,EA,LF) TO LINE B5
   B5=B5+1
   MSG 3 (SB) TO LINE B5
   B5=B5+2
   MSG 4 TO LINE B5 
   B5=B5+1
   B9=1                           * SET INDEX 
   GOSUB 60                       * CONVERT STATUS TO SENSE BYTES 
   MSG 5 (B10,B11,SB(2),B12,B13,SB(4)) TO LINE B5 
   B5=B5+1
   GOSUB 60                       * CONVERT STATUS TO SENSE BYTES 
   MSG 6 (B10,B11,SB(6),B12,B13,SB(8)) TO LINE B5 
   B5=B5+1
   GOSUB 60                       * CONVERT STATUS TO SENSE BYTES 
   MSG 7 (B10,B11,SB(10D),B12,B13,SB(12D)) TO LINE B5 
   B5=B5+1
   GOSUB 60                       * CONVERT STATUS TO SENSE BYTES 
   MSG 10 (B10,B11,SB(14D),B12,B13,SB(16D)) TO LINE B5
   B5=B5+1
   MSG 11 TO LINE B5
   B5=B5+1
   MSG 12, 4 WORDS FROM SB(17D) TO LINE B5
   B5=B5+1
   EXIT 
60 B10=SB(B9) RS 4
   B11=SB(B9) LS 4 AND 0360 
   B9=B9+1
   B11=SB(B9) RS 8 XOR B11
   B9=B9+1
   B12=SB(B9) RS 4
   B13=SB(B9) LS 4 AND 0360 
   B9=B9+1
   B13=SB(B9) RS 8 XOR B13
   B9=B9+1
   RETURN 
   END 20 
COMPILE 
   MODULE FFU98B, FMDFT, (10,11,12), LOCK 
*** 5.2.35 FFU98B - DISPLAY FLAWS (SUBROUTINE)
**
*          PURPOSE- 
*          FFU98B DISPLAYS THE TRACK FLAW MAP OR SKIP DISPLACEMENT MAP
*          FROM DATA CONTAINED IN THE OUTPUT BUFFER.
* 
*          METHOD-
*          FFU98B INTERPRETS THE DATA CONTAINED IN THE OUTPUT BUFFER
*          AS EITHER THE TRACK FLAW MAP OR ONE SECTOR OF THE SKIP 
*          DISPLACEMENT MAP.  REGISTER B6 IS A FLAG TO INDICATE WHICH 
*          DISPLAY HEADING AND FORMAT TO USE.  FLAWS ARE ADDED TO 
*          THE MAP UNTIL THE END OF THE SECTOR OR END OF THE MAP IS 
*          DETECTED.  END OF SECTOR OCCURS AFTER 53D ENTRIES.  WHEN 
*          END OF SECTOR IS FOUND, FFU98B RETURNS TO THE CALLING MODULE.
*          IF THE END OF THE MAP IS FOUND BEFORE REACHING THE END OF
*          THE SECTOR, A MESSAGE IS DISPLAYED INDICATING THE END OF THE 
*          FLAW MAP, AND FFU98B RETURNS TO THE CALLING MODULE.
/ 
*          ENTRY- 
*          FFU98B ASSUMES THAT THE OUTPUT BUFFER CONTAINS ONE SECTOR OF 
*          THE FLAW MAP.  REGISTER B6 IS USED AS A FLAG TO SELECT 
*          EITHER TRACK FLAW MAP OR SKIP DISPLACEMENT.  IF B6 IS 1
*          THEN TRACK FLAWS ARE DISPLAYED.  IF B6 IS 2 THEN SKIP
*          DISPLACEMENT IS DISPLAYED. 
* 
*          EXIT-
*          FFU98B TERMINATES BY RETURNING TO THE CALLING MODULE.
*          REGISTER B3 CONTAINS THE INDEX TO THE LAST MAP ENTRY READ. 
*          THIS IS USED BY THE CALLING MODULE TO DETERMINE IF THE END 
*          OF THE FLAW MAP WAS FOUND. 
* 
*          SUBMODULES REFERENCED- 
*          FFU98B DOES NOT CALL ANY SUBMODULES. 
* 
*          REGISTERS USED-
*          FFU98B USES REGISTERS B0 TO B6, B8, AND B10 TO B15.
*          REGISTERS ARE USED AS FOLLOWS--
*            B0 - CYLINDER
*            B1 - TRACK 
*            B2 - INDEX INCREMENT 
*            B3 - OUTPUT BUFFER INDEX 
*            B4 - OUTPUT BUFFER INDEX 
*            B5 - K DISPLAY LINE NUMBER 
*            B6 - MAP TYPE
*            B8 - FLAW COUNT
*           B10 - SKIP DISPLACEMENT 3, UPPER
*           B11 - SKIP DISPLACEMENT 3, LOWER
*           B12 - SKIP DISPLACEMENT 2, UPPER
*           B13 - SKIP DISPLACEMENT 2, LOWER
*           B14 - SKIP DISPLACEMENT 1, UPPER
*           B15 - SKIP DISPLACEMENT 1, LOWER
* 
*          BUFFERS USED-
*          FFU98B ASSUMES THAT THE OUTPUT BUFFER CONTAINS ONE SECTOR OF 
*          THE FLAW MAPS. 
* 
* 
/  - DISPLAY FLAWS (SUBROUTINE) - 
/    ENTER WITH B6 = 1 FOR TRACK, OR 2 FOR SKIP DISPLACEMENT
/ 
1  FORMAT - - -    TRACK FLAW MAP   - - - 
2  FORMAT - - -  SKIP DISPLACEMENT  - - - 
3  FORMAT - - -     END OF TABLE    - - - 
4  FORMAT *DE   CY = *OCT   TR = *O 
5  FORMAT *DEC   CY=*OCT   TR=*O   SD1=*O*OCT 
6  FORMAT                          SD2=*O*OCT 
7  FORMAT                          SD3=*O*OCT 
15 FORMAT 
16 FORMAT - - - - - - - - - - - - - - - - - - - - 
20 B3=0                           * SET OB INDEX
   MSG B6 TO LINE 4 
26 B5=5                           * SET DISPLAY LINE
30 B4=B3+1
   IF (OB(B3) AND 4000 EQ 0) GOTO 40   * IF END OF MAP
31 B0=OB(B3) AND 1777             * EXTRACT CYLINDER
   B1=OB(B4) RS 6                 * EXTRACT TRACK 
   IF (B6 EQ 2) GOTO 60           * IF SKIP DISPLACEMENT
   MSG 4 (B8,B0,B1) TO LINE B5
34 B3=B3+B2                       * INCREMENT INDEX 
   B8=B8+1                        * INCREMENT FLAW COUNT
   IF (B3 GE 318D) GOTO 42        * IF END OF SECTOR
   B5=B5+1                        * INCREMENT LINE COUNT
   IF (B5 LT 35D) GOTO 30         * IF DISPLAY NOT FULL 
   PICTURE                        * PRINT PAGE
   GOTO 26
40 MSG 3 TO LINE B5               * END OF TABLE
   B5=B5+1
   MSG 15 TO LINE B5
   B5=B5+1
   MSG 16 TO LINE B5
42 B5=B5+1
   IF (B5 GE 38D) GOTO 50         * IF DISPLAY NOT FULL 
   MSG 15 TO LINE B5
   GOTO 42                        * CLEAR REMAINING LINES 
50 PICTURE
   B5=5                           * RESET LINE NUMBER 
   EXIT 
60 B4=B4+1                        * INCREMENT BUFFER INDEX
   B10=OB(B4) RS 8                * EXTRACT SKIP DISPLACEMENT 
   B11=OB(B4) AND 0377 LS 4 
   B4=B4+1
   B12=OB(B4) RS 8
   B11=B11 XOR B12
   B12=OB(B4) AND 0360 RS 4 
   B13=OB(B4) AND 0017 LS 8 
   B4=B4+1
   B14=OB(B4) RS 4
   B13=B13 XOR B14
   B14=OB(B4) AND 0017
   B4=B4+1
   B15=OB(B4) 
   MSG 5 (B8,B0,B1,B14,B15) TO LINE B5   * DISPLAY SD1
   IF (B10 OR B11 NE 0) GOTO 64   * IF 3 SKIPS
   IF (B12 OR B13 EQ 0) GOTO 34   * IF ONLY 1 SKIP
   B5=B5+1
   MSG 6 (B12,B13) TO LINE B5 
   GOTO 34                        * 2 SKIPS DISPLAYED 
64 B5=B5+1
   MSG 6 (B12,B13) TO LINE B5     * SECOND SKIP 
   B5=B5+1
   MSG 7 (B10,B11) TO LINE B5     * THIRD SKIP
   GOTO 34                        * 3 SKIPS DISPLAYED 
77 END 20 
COMPILE 
   MODULE FFU99, FMDFT, (10,11,12), LOCK
*** 5.2.36 FFU99 - PARAMETERS 
**
* 
/ 
/  PARAMETER DESCRIPTION. 
/ 
/  P0 = 000X - ENABLE REORDERING UTILITY FLAW MAP DISPLAY 
/ 
/       0000 - DO NOT REORDER UTILITY MAPS
/       0001 - SORT MAPS INTO ASCENDING ORDER 
/ 
/  P0 = 0NNND - PACK SERIAL NUMBER (FIRST 3 DIGITS) 
/  P1 = 0NNND - PACK SERIAL NUMBER (LAST 3 DIGITS)
/ 
/  P1 = CCCC - STARTING CYLINDER NUMBER FOR FORMAT OR SCAN
/  P2 = CCCC - ENDING CYLINDER NUMBER FOR FORMAT OR SCAN
/ 
/  P1 = CCCC - CYLINDER 
/  P2 = 00TT - TRACK
/  P3 = 00SS - SECTOR 
/ 
/  P2 = 0NNND - DATE CODE (FIRST 3 DIGITS)
/  P3 = 0NNND - DATE CODE (LAST 3 DIGITS) 
/ 
/  P4 P5 = 000N NNNN - SKIP DISPLACEMENT 1 (RELATIVE TO IDX)
/  P6 P7 = 000N NNNN - SKIP DISPLACEMENT 2 (RELATIVE TO SD1)
/  P8 P9 = 000N NNNN - SKIP DISPLACEMENT 3 (RELATIVE TO SD2)
/ 
1  END 1
COMPILE,SOURCE                    * FFU99 - PARAMETERS
   MODULE FFU99A, FMDFT, (10,11,12), LOCK 
*** 5.2.37 FFU99A - LIST OF MODULES 
**
* 
/ 
/  MODULE         MODULE               PARA-   ACCESS  RUN
/  NUMBER         DESCRIPTION          METERS  LEVEL   TIME 
/  ------         -----------          ------  -----   ---- 
/  FFU01   READ SERIAL NUMBER           NONE      3    1 SEC
/  FFU03   READ UTILITY MAPS            P0        3   15 SEC
/  FFU04   LOCATE AND SET SKIP DISP.    P1-P3     4    4 SEC
/  FFU05   SET/CLEAR SKIP DISP.      P1,P2,P4-P9  4    2 SEC
/  FFU07   SET TRACK FLAW               P1,P2     4    2 SEC
/  FFU10   CLEAR TRACK FLAW             P1,P2     4    2 SEC
/  FFU11   FORMAT PACK                  NONE      4   25 MIN
/  FFU12   FORMAT PARTIAL PACK          P1,P2     4  3 S/CYL
/  FFU13   INITIALIZE PACK              P0-P3     4   15 MIN
/  FFU14   FORMAT MAP TRACK             P0-P9     4    2 SEC
/  FFU15   SCAN AND DISPLAY FLAWS       P1,P2     1  1 S/CYL
/  FFU16   VERIFY FLAW MAPS             P1,P2     3  2 S/CYL
/  FFU17   ARCHIVE UTILITY FLAW MAPS    NONE      3   10 SEC
/  FFU20   RESTORE UTILITY FLAW MAPS    NONE      3   10 SEC
/  FFU21   COPY CONTROLWARE TO DISK     NONE      3   20 SEC
/  FFU22   READ CONTROLWARE REVISION    NONE      1    1 SEC
/  FFU23   WRITE DIAGNOSTIC TRACKS      NONE      3    2 SEC
/ 
/  FFU65   DISPLAY FR204 MEMORY         P0-P5    10    1 SEC
/ 
/   NOTE - RUN TIMES ARE APPROXIMATE AND ASSUME 
/          ON LINE OPERATION WITH NO CONFLICTS. 
1  END 1
COMPILE,SOURCE                    * FFU99A - LIST OF MODULES
