      HED S4 - SECTION 4 (CONTINUED)
* 
* 
*     SECTION 4 - CONTINUED 
* 
*         THIS SECTION READS RANDOM SECTORS AND VERIFIES
*     THAT THEY ACTUALLY ARE THE SECTORS REQUESTED. 
* 
*         THE TEST RUNS FOR ABOUT 250 SEEKS 
* 
*         AT THE END OF EACH SEEK, A READ IS ISSUED FOR THE 
*     NEXT AVAILABLE SECTOR.  AS SOON AS THIS READ IS COMPLETED, THE
*     NEXT SEEK IS STARTED. 
* 
* 
FLAG4 EQU GLOB2     USED WHEN STEP 53 LOOPS 
ALNT  EQU GLOB4    SEEK LENGTH COUNTER
ZCYL  EQU GLOB5    HOLDS PREVIOUS CYLINDER NUMBER 
ZHDS  EQU GLOB6    HOLDS PREVIOUS HEAD/SECTOR 
S5A   EQU * 
      CLA 
      STA ALNT     ZERO SEEK LENGTH COUNTER 
      STA SVCT     ZERO TOTAL TIME IN SEEKS 
      STA SVKC     ZERO SEEK COUNT
      CCA          -1 
      STA FIRST 
      LDA D128+SZREF CHECK ONE SECTOR 
      STA WCNT     SET WORD COUNT FOR ONE SECTOR
* 
S5C   EQU * 
      LDA CYL      LOAD PREVIOUS CYLINDER NUMBER
      STA ZCYL     AND SAVE IT FOR RCHK 
      LDA HEAD     LOAD PREVIOUS HEAD NUMBER
      IOR HDON
      ALF,ALF      MOVE TO LEFT HALF
      IOR SECTR    PLUG IN SECTOR NUMBER
      STA ZHDS     AND SAVE FOR RCHK
IFAKE EQU *        USED IN RCHK 
      JSB RNCH     GENERATE CYLINDER AND HEAD NUMBER
      JSB RNSC
      CLA,INA       SET UP
      STA FLAG4      FOR TIMING 
      LDA SVCT      SET UP
      STA SVCTA      CURRENT MILLISECOND COUNT
* 
*     STEP 53 
*                  THIS SEEK MOVES TO A 
*                  RANDOM CYLINDER AND HEAD.
* 
      LDA D53 
      JSB COPR
      JSB FSEEK 
      LDA FLAG4     HAS THIS STEP BEEN REPEATED 
      SZA,RSS       SKIP IF NO
      JMP S4A       YES 
      CLA 
      STA FLAG4     DISABLE TIMING ON LOOP
      LDA SVCTA     SAVE CURRENT
      STA SVCT       MILLISECOND COUNT
      ISZ FIRST 
      JSB RCHK
S4A   EQU * 
      JSB ENDST 
* 
*     STEP 54 
*                  THIS READ READS IN ONE SECTOR
*                  FROM A RANDOM LOCATION 
* 
      LDA D54 
      JSB COPR
      JSB SEEH
      JSB READ     GO DO READ 
      JSB WENDI,I 
      CLA 
      STA FIRST     RESET 
      LDA CYL      LOAD CYLINDER NUMBER 
      CMA,INA 
      ADA ZCYL     GET SEEK LENGTH
      SSA          SKIP IF NOW POSITIVE 
      CMA,INA      ABSOLUTE VALUE 
      ADA ALNT     ADD TO TOTAL 
      STA ALNT
      LDA SVKC
      INA          COUNT UP SEEK COUNT
      STA SVKC
      CPA D128     SKIP IF NO PRINT 
      RSS          128 TH.  PRINT OUT TIMING
      JMP S5TE     NOT NOW
* 
      JSB SWR 
      AND BIT12     ABORT IF
      SZA,RSS        BIT 12 IS CLEAR
      JMP S5TE     ABORT PRINTOUT 
      JSB TTYCK 
      JMP S5TE      ABORT PRINTOUT
      LDA SVCT      LOAD TOTAL TIME 
      ADA MM64      AVERAGE ADJUSTMENT
      JSB MSCV      CONVERT TO ASCII
      LDB P054A 
      LDA CVT1      TRANSFER
      STA B,I        TO 
      INB 
      LDA CVT2        MESSAGE 
      STA B,I 
      INB 
      LDA CVT3
      STA B,I 
      LDA ALNT      LOAD TOTAL LENGTH 
      JSB MSCV      CONVERT TO ASCII
      LDB P054B 
      LDA CVT2      TRANSFER
      STA B,I        TO 
      INB 
      LDA CVT3        MESSAGE 
      STA B,I 
H54   LDA B54 
      JSB PRINT     AVERAGE RANDOM SEEK TIME XXXX.X.
*                                   AVERAGE RANDOM SEEK LENGTH XX.X 
* 
S5TE  EQU * 
      LDB SVKC      LOAD SEEK COUNTER 
      JSB SWR       SWITCH REGISTER TO A
      AND BIT5
      ADB M256      SHORT TEST
      SZA,RSS       SKIP IF YES 
      ADB M7936     NO
      SSB          SKIP IF DONE 
      JMP S5C      DO ANOTHER 
      JMP SKIPI,I   EXIT S4 
      HED RCHK,RCHK1
* 
* 
*         RCHK
*         THIS ROUTINE CHECKS THE BUFFERS GENERATED BY RCGEN
*         IT USES BUFAE FOR A POINTER AND CHECKS ONE SECTOR 
*         SEE RCGEN FOR A DESCRIPTION OF THE SECTOR FORMAT
* 
* 
RCHK  NOP 
* 
      LDA RCHK     SAVE RETURN ADDRESS FOR EXIT 
      JSB RCHK1     FORM BUFFER CHECK SUM 
      SZA          SKIP IF CHECKSUM OK
      JMP RCER     CHECKSUM ERROR 
      LDA TEMP2    GET CYLINDER CHECK BACK
      CPA ZCYL     CHECK FOR PROPER CYLINDER
      RSS 
      JMP RCER     WRONG CYLINDER 
      LDA TEMP3    GET HEAD/SECTOR BACK 
      CPA ZHDS
      JMP WRERX    NO BUFFER ERRORS, CHECK STATUS 
* 
RCER  EQU * 
      LDA ZCYL     RESTORE
      STA CYL       CYL 
      LDA ZHDS
      ALF,ALF 
      AND B377
      STA HEAD       HEAD 
      LDA ZHDS
      AND B377
      STA SECTR       AND SECTR 
      CCA          -1 
      STA FIRST    RESET FIRST FLAG 
      LDA FAKE     RESET
      STA WCHK      RETURN
RCER1 EQU * 
      LDA TEMP1    LOAD CHECKSUM
      LDB P052A     POINTER-CHECKSUM
      JSB CNVRT     CONVERT TO ASCII
      LDA TEMP2    LOAD CYLINDER CHECK
      LDB P052B     POINTER-CYLINDER
      JSB CNVRT     CONVERT TO ASCII
      LDA TEMP3    LOAD HEAD/SECTOR CHECK 
      LDB P052C     POINTER-HEAD AND SECTOR 
      JSB CNVRT     CONVERT TO ASCII
      LDA TEMP2 
      LDB P052D     PRINT CYLINDER IN DECIMAL 
      JSB DCIN2 
      LDA TEMP3 
      ALF,ALF 
      AND B377
      LDB P052E     PRINT HEAD IN DECIMAL 
      JSB DCIN1 
      LDA TEMP3 
      AND B377
      LDB P052F     PRINT SECTOR IN DECIMAL 
      JSB DCIN1 
E52   LDB B52       BUFFER CHECKSUM XXXXXX CYL
*                                     YYYYYY HD/S ZZZZZZ
      STB STRF     SET ERROR MESSAGE POINTER
      STB ELOC      SAVE FOR ERHLT
      JMP WRERZ    GO ANALYZE ERRORS
* 
*     RCHK1 
*      FORM BUFFER CHECKSUM 
* 
RCHK1 NOP 
      STA WCHK
      LDA B46       READ
      STA COPRN 
      LDB BUFAE    LOAD BUFFER POINTER
      LDA M124+SZREF
      STA TEMP1    SET COUNT FOR ADD LOOP 
      LDA B,I      LOAD FIRST WORD
      INB 
      ADA B,I      MAKE CYLINDER CHECK
      INB 
      STA TEMP2    SAVE CYLINDER CHECK
      LDA B,I 
      INB 
      ADA B,I      MAKE HEAD/SECTOR CHECK 
      INB 
      STA TEMP3    SAVE HDS CHECK 
      ADA TEMP2    CHECKSUM SO FAR
* 
RCQ   EQU * 
      ADA B,I      ADD UP ALL WORDS 
      INB 
      ISZ TEMP1    COUNT DOWN COUNTER 
      JMP RCQ 
      STA TEMP1    SAVE CHECKSUM
      JMP RCHK1,I   RETURN
      HED S5 - SECTION 5
* 
* 
*     SECTION 5 
*      THIS SECTION RUNS MULTIPLE UNIT TEST IF AT LEAST TWO UNITS 
*      ARE PRESENT. THE SEEKS OVERLAP. THE READ CHECK IS THE SAME 
*      THAT S4 PERFORMS.
* 
STBLE EQU GLOB1 
STBLF EQU GLOB2 
STBLG EQU GLOB3 
S5    EQU * 
      LDA UNITC     NUMBER OF UNITS 
      CPA D1        IS IT ONLY ONE? 
      JMP S6NO      YES,ABORT TEST
      CPA NI        ARE ALL INITIALIZED?
      JMP S6TST     YES 
      LDA NI        NO,FINISH 
      ADA UNITS      INITIALIZATION 
      LDA A,I 
      STA UNIT      INITIALIZE NEXT UNIT
      ISZ NI
      JSB SHEAD     SET HEADS INTO PASS MESSAGE 
      JMP THRUI,I   DISABLE REPEAT OF SECTION 
S6TST EQU * 
      LDB S4BUG     TROUBLE?
      SZB 
      JMP S6NO      YES - ABORT 
      CLA 
      STA S6CNT     ZERO COUNT
      STA SHTAS     AND STATUS
*     CHECK FOR RESTRICTED CYLINDER 
      JSB S6SET 
      CLA 
S6X1  EQU * 
      LDB SAV6,I
      ADB S400
      IOR B,I       OR THE SWR'S TOGETHER 
      ISZ SAV6
      ISZ FL6 
      JMP S6X1
      STA TEMP1 
      JSB S6SET 
      LDA TEMP1 
S6X2  EQU * 
      LDB SAV6,I
      ADB S400
      STA B,I       STORE RESULT BACK 
      ISZ SAV6
      ISZ FL6 
      JMP S6X2
* 
      LDA D128+SZREF
      STA WCNT      WORD COUNT = 128
*     THIS SECTION IS TIME DEPENDENT AND MAY NOT BE SINGLE CYCLED 
S6L   EQU * 
      JSB RNCH      SELECT RANDOM CYL AND HEAD
      JSB RNSC      SELECT RANDOM SECTOR
* 
*     STEP 55 
*      PERFORM MULTI-SEEK AND READ
* 
      LDA D55 
      JSB COPR
      JSB S6SET 
S6SL  EQU * 
      LDA SAV6,I    GENERATE
      STA UNIT       UNIT NUMBER
      JSB SEEK      PERFORM SEEK
      ISZ SAV6      NEXT UNIT 
      ISZ FL6       DONE? 
      JMP S6SL      NO
      JSB S6SET 
      LDB BPTO      WORK AREA 
S6L1  EQU *         SET UP FOR VALIDITY CHECK 
      LDA SAV6,I
      STA B,I 
      INB 
      ISZ SAV6
      ISZ FL6 
      JMP S6L1
      JSB S6SET 
      STB STBLE     SET UP FOR
      STB STBLF      ATTENTION/SEEK-STATUS TABLE
S6RL  EQU * 
      LDA B44       SEEK IN S5
      STA COPRN 
      LDA MM512 
      STA LCNT      ALLOW 512 MILLISECONDS FOR FLAG 
S6D   EQU * 
      CLA,INA 
      JSB TMR,I     DELAY 1 MSEC
CC09  SFC CC
      JMP CC10      FLAG IS SET 
      ISZ LCNT
      JMP S6D 
      JSB PCOP      CURRENT OPERATION 
      LDA B10       NO CC FLAG
      STA ELOC
      JSB FPRNT 
      JSB S6SET     SET UP POINTER
SL3   LDA SAV6,I    GET NEXT
      STA UNIT       UNIT 
      LDA STBLE 
      CMA,INA 
      ADA STBLF 
      SZA,RSS 
      JMP S6L4      NO INTERRUPTS OCCURRED
      INA 
      RAR 
      STA LOCAL     = NUMBER OF INTERRUPTS
      LDA STBLF     SET UP
      STA STBLG      POINTER
SL1   LDA STBLG,I   GET ATTENTION WORD
      JSB GETN      CONVERT TO UNIT (IN B)
      CPB UNIT      IS THIS THE ONE?
      JMP SL2       YES - THIS UNIT IS OK 
      ISZ STBLG     NO MOVE 
      ISZ STBLG      POINTER TWICE -PAST SEEK STATUS
      ISZ LOCAL 
      JMP SL1 
      JMP S6L4
SL2   ISZ SAV6
      JMP SL3 
CC10  LIA CC
      STA ATTN      SAVE ATTENTION BITS 
      STA STBLE,I   SAVE ATTENTION
      ISZ STBLE 
      JSB GETN
      JMP S6F 
EE21  JSB PCOP
E21   JSB ERROR     MISSING OR DUPLICATE ATTENTION
S6L4  LDA STBLE     CALCULATE 
      CMA,INA        NUMBER OF
      ADA STBLF       WORDS IN THE
      STA LOCAL        STACK
      LDB P033A     BUFFER ADDRESS
S6M3  LDA BB        BLANK,BLANK 
      JSB S6M6      SET UP BUFFER 
      LDA CRLF      CR,LF 
      JSB S6M6      SET UP BUFFER 
      JMP S6M3
S6M6  NOP 
      STA TEMP2     ENDING WORD 
      STB TEMP1     BUFFER POINTER
      LDA STBLF,I   GET NEXT WORD FROM TABLE
      ISZ STBLF 
      JSB CNVRT     DEPOSIT RESULT IN OCTAL 
      LDB TEMP1 
      ADB B3
      LDA TEMP2 
      STA B,I       STORE ENDING
      INB 
      ISZ LOCAL     DONE? 
      JMP S6M6,I    NO
      ADB MM1       YES 
      LDA C1440     #,BLANK 
      STA B,I 
      LDA B33 
H33   JSB FPRNT     ATTENTION/SEEK-STATUS TABLE 
      JSB ADDOI,I 
      JMP STP55 
S6F   STB UNIT
      JSB STAT
      STA STBLE,I   SAVE SEEK-STATUS
      ISZ STBLE 
      LDA UNITC     CHECK VALIDITY OF UNIT NUMBER 
      CMA,INA 
      STA GLOB4 
      LDB BPTO
S6L3  EQU * 
      LDA B,I 
      CPA UNIT
      JMP S6OK
      INB 
      ISZ GLOB4 
      JMP S6L3
      JMP EE21      NOT VALID BIT 
S6OK  STB B,I       DON'T ALLOW SAME BIT AGAIN
      JSB WCHK      CHECK STATUS
      JSB FSEEH     ADDRESS RECORD IN S5
      JSB READ
      JSB S6CHK     CHECK BUFFER
      ISZ FL6       DONE? 
      JMP S6RL      NO
STP55 EQU * 
      JSB ENDST 
      ISZ S6CNT     BUMP COUNTER
      LDB S6CNT 
      JSB SWR 
      AND BIT5      SHORTEN TEST? 
      ADB M256      -256
      SZA,RSS       SKIP IF YES 
      ADB M7936     -7936 
      SSB           DONE? 
      JMP S6L       NO
      LDA B14 
      STA MDFLG 
S6NO  EQU * 
      LDA UNITA     RESET 
      STA UNIT       UNIT NUMBER FOR NEXT PASS
      JSB SHEAD     SET HEADS INTO PASS MESSAGE 
      LDA HFLAG     IS FLAG SET 
      SLA,RSS       SKIP IF YES 
      JMP S6OUT 
      LDA HDON      SWITCH
      XOR D2         SURFACE
      STA HDON
      LDA HDON      UPPER PLATTER 
      SZA            SELECTED?
      JMP SKIPI,I   NO - EXIT S5
      LDA S4BUG     TROUBLE?
      SZA 
      JMP S6OUT     YES 
* 
*     STEP 56 
*      FOR MODE C AND HEAD = 2,CHECK ONE SECTOR FROM HEAD 0(WRITTEN 
*      IN S4 ON SOME PREVIOUS PASS) TO VERIFY HEAD SELECT LOGIC.
*      STEP IS RUN ON ALL DRIVES. 
* 
      LDA D56 
      JSB COPR
      CLA 
      STA HEAD
      STA SECTR 
      LDA FTR,I     FIRST ENTRY IN CYLINDER TABLE 
      STA CYL 
      JSB S6SET     SET UP FOR ALL UNITS
STP56 LDA SAV6,I
      STA UNIT
      ISZ SAV6
      JSB FSEEK 
      JSB READ
      JSB WCHK
      JSB S6CHK     CHECK DATA INCLUDING HEAD # 
      ISZ FL6       DONE? 
      JMP STP56     NO
      LDA UNITA     RESET 
      STA UNIT       UNIT FOR NEXT PASS 
      JSB ENDST 
S6OUT EQU * 
      CLA 
      STA S4BUG 
      JMP SKIPI,I 
* 
* 
* 
*     S6CHK 
*      CHECKS BUFFER FOR PROPER POSITION AND DATA 
*      TRANSFER 
* 
S6CHK NOP 
      LDA S6CHK 
      JSB RCHK1     FORM BUFFER CHECKSUM
      SZA           SKIP IF OK
      JMP SCER      ERROR 
      LDA TEMP2 
      CPA CYL       IS CYLINDER OK? 
      RSS           YES 
      JMP SCER      NO,ERROR
      LDA TEMP3 
      ALF,ALF 
      AND B377
      LDB A 
      LDA HEAD
      IOR HDON
      CPA B         IS HEAD OK? 
      RSS           YES 
      JMP SCER      NO,ERROR
      LDA TEMP3 
      AND B377
      CPA SECTR     IS SECTOR OK? 
      JMP WRERX     YES 
SCER  EQU * 
      JMP RCER1 
* 
* 
S6SET NOP 
      LDA UNITC     NUMBER OF UNITS 
      CMA,INA       TWO'S COMPLEMENT
      STA FL6 
      LDA UNITS     POINTER FOR 
      STA SAV6       UNIT NUMBERS 
      JMP S6SET,I 
* 
*     SHEAD 
*      SET HEADS INTO PASS MESSAGE
* 
SHEAD NOP 
      LDB P065E 
      ADB MM4 
      LDA HDON
      IOR C7461     27461B (/,1)
      STA B,I 
      ADB MM1 
      LDA HDON
      IOR B2060     20060B (BLANK,0)
      STA B,I 
      JMP SHEAD,I 
      HED GETN
* 
* 
*  GETN 
*     SCANS A REGISTER, RETURNS WITH BIT POSITION OF
*     RIGHTMOST "1" IN REGISTER B.  SKIPS ON ERROR. 
* 
GETN  NOP 
      CLB 
S6L2  SLA 
      JMP GETN,I    FOUND IT
      INB           MAYBE NEXT TIME?
      RAR 
      CPB D4
      RSS 
      JMP S6L2     ONLY FIRST 4 BITS (0,1,2,3)
      ISZ GETN
      JMP GETN,I
      HED PCHK,MSCV 
* 
*         PCHK ROUTINE. 
*     THIS ROUTINE CHECKS THE ENTIRE READ BUFFER FOR
*     EQUALITY WITH THE WORD IN PATT. 
* 
PCHK  NOP 
* 
      LDA PCHK     LOAD RETURN ADDRESS
      STA WCHK     SAVE FOR POSSIBLE CALL 
* 
      LDA WCNT     LOAD BUFFER LENGTH 
      ARS,ARS      DIVIDE BY EIGHT
      ARS          ( FOR EIGHT UNIT LOOP )
      CMA,INA      TWOS COMPLEMENT
      STA TEMP1    SET COUNTER FOR LOOP 
      LDA PATT     LOAD COMPARISON WORD 
      LDB BUFAE    LOAD READ BUFFER ADDRESS 
* 
*                                  BEGINNING OF THE LOOP
* 
PCHL  EQU * 
      CPA B,I      CHECK FOR MATCH WITH BUFFER
      INB,RSS      COUNT UP BUFFER ADDRESS AND SKIP 
      JMP PCHE     MIS-COMPARE
      CPA B,I 
      INB,RSS 
      JMP PCHE
      CPA B,I 
      INB,RSS 
      JMP PCHE
      CPA B,I 
      INB,RSS 
      JMP PCHE
      CPA B,I 
      INB,RSS 
      JMP PCHE
      CPA B,I 
      INB,RSS 
      JMP PCHE
      CPA B,I 
      INB,RSS 
      JMP PCHE
      CPA B,I 
      INB,RSS 
      JMP PCHE
      ISZ TEMP1    COUNT OUT
      JMP PCHL     NOT DONE, CONTINUE CHECKING
* 
      JMP WRERX    NO BUFFER ERRORS, CHECK STATUS 
* 
* 
PCHE  STB TEMP2     POINTER - IS
      LDA PATTI     SET UP
      STA TEMP1      SHOULD BE PART OF ERROR MESSAGE
      LDA BUFAE 
      CMA,INA 
      ADA TEMP2     A = WORD NUMBER 
      JMP EE101 
      SKP 
* 
*      THIS ROUTINE TAKES THE NUMBER IN THE A-REG,
*     DIVIDES BY 128 AND PUTS THE ASCII ( DECIMAL ) 
*      RESULT INTO CVT1,CVT2 AND CVT3 (XXXX.X)
* 
* 
MSCV  NOP 
      STA TEMP1     LOAD NUMBER OF MILLISECONDS 
      ALF,ALF 
      RAL          DIVIDE BY 128
      AND B377      INTEGRAL NUMBER OF MILLISECONDS 
      JSB DECIN     CONVERT INTEGER TO DECIMAL ASCII
      LDA TEMP1    START ON FRACTION PART 
      AND B177     LEAVE ONLY FRACTION PART 
      CCB          B _ -1 
TMDL  ADA MM13      CLOSE TO 128/10 
      INB          COUNT UP TENTHS PART 
      SSA,RSS      SKIP IF TENTHS CALCULATION DONE
      JMP TMDL
      ADB ASCD0    MAKE INTO .X 
      STB CVT3      STORE 
      JMP MSCV,I   RETURN 
      HED MESSAGE TABLES
* 
FERC  ABS -FER
FER   DEF *+1 
* NOTE: UNUSED POSITIONS ARE USED FOR OTHER POINTERS ETC. 
      DEF H0        MESSAGE NUMBER TABLE
      DEF H1
      DEF E2
      DEF E3
      DEF E4
      DEF E5
      DEF E6
      DEF E7
      DEF E10 
      DEF E11 
      DEF E12 
      DEF E13 
      DEF E14 
N5777 OCT 155777    (H15) 
WENDI DEF WEND      (H16) 
      DEF H17 
      DEF H20 
      DEF E21 
SENDI DEF SEND      (H22) 
      DEF H23 
      DEF H24 
      DEF H25 
      DEF H26 
      DEF H27 
      DEF H30 
      DEF H31 
      DEF H32 
      DEF H33 
      DEF H34 
      DEF H35 
DENDI DEF DEND      (H36) 
      DEF H37 
      DEF H40 
      DEF H41 
      DEF H42 
      DEF E43 
FAKE  DEF IFAKE     (H44) 
      NOP           H45 
      NOP           H46 
      DEF E47 
      DEF E50 
      DEF H51 
      DEF E52 
      DEF H53 
      DEF H54 
      DEF H55 
      DEF H56 
      DEF E57 
      NOP           H60 
      NOP           USED BY PCOPR 
      DEF H62 
      DEF E63 
      DEF E64 
      DEF H65 
      NOP           H66 
      NOP           H67 
      DEF H70 
      DEF H71 
      DEF E72 
LER   DEF * 
FMI   DEF *+1       MESSAGE ADDRESS TABLE 
      DEF M0
      DEF M1
      DEF M2
      DEF M3
      DEF M4
      DEF M5
      DEF M6
      DEF M7
      DEF M10 
      DEF M11 
      DEF M12 
      DEF M13 
      DEF M14 
      DEF M15 
      DEF M16 
      DEF M17 
      DEF M20 
      DEF M21 
      DEF M22 
      DEF M23 
      DEF M24 
      DEF M25 
      DEF M26 
      DEF M27 
      DEF M30 
      DEF M31 
      DEF M32 
      DEF M33 
      DEF M34 
      DEF M35 
      DEF M36 
      DEF M37 
      DEF M40 
      DEF M41 
      DEF M42 
      DEF M43 
      DEF M44 
      DEF M45 
      DEF M46 
      DEF M47 
      DEF M50 
      DEF M51 
      DEF M52 
      DEF M53 
      DEF M54 
      DEF M55 
      DEF M56 
      DEF M57 
      DEF M60 
      DEF M61 
      DEF M62 
      DEF M63 
      DEF M64 
      DEF M65 
      DEF M66 
      DEF M67 
      DEF M70 
      DEF M71 
      DEF M72 
                                                                                                                                                                                                                                                    