home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / dskutl / hdsource.arc / HDSURF.ASM < prev    next >
Assembly Source File  |  1986-02-24  |  13KB  |  357 lines

  1.      PAGE     64,132            ;PAGE WIDTH,LENGTH
  2.      .SALL
  3.      TITLE     PC/AT DIAGNOSTIC - SURFACE ANALYSIS
  4. ; **********************************************************************
  5. ; *                                       *
  6. ; *    MODULE NAME    HDSURF                           *
  7. ; *    AUTHOR           JIM BRACKING                       *
  8. ; *                                       *
  9. ; *    DECSRIPTION    THIS PROGRAM PERFORMS THE FOLLOWING           *
  10. ; *               FUNCTIONS:                       *
  11. ; *                                       *
  12. ; *               1.  THIS PROGRAM WILL WRITE A DATA PATTERN      *
  13. ; *               OF REPEATING X'6DB6' ON EVERY SECTOR        *
  14. ; *               AND THEN READ IT BACK AND COMPARE IT.       *
  15. ; *               FOR ANY SECTOR WITH A MISS-MATCH THE        *
  16. ; *               ENTIRE TRACK WILL BE MARKED BAD.           *
  17. ; *                                       *
  18. ; **********************************************************************
  19. ;
  20. ; **********************************************************************
  21. ; *            EXTERNAL PROGRAM REFERENCES               *
  22. ; **********************************************************************
  23.      EXTRN     SCRMGR:NEAR
  24. ; **********************************************************************
  25. ; *              EXTERNAL DATA REFERENCES               *
  26. ; **********************************************************************
  27.      INCLUDE HDDATA.ASM
  28. ; **********************************************************************
  29. ; *            EXTERNAL SUBROUTINE REFERENCES               *
  30. ; **********************************************************************
  31.      INCLUDE HDSUB.ASM
  32. ; **********************************************************************
  33. ; *                PUBLIC DECLARES                   *
  34. ; **********************************************************************
  35.      PUBLIC  HDSURF
  36. ; **********************************************************************
  37. ; *                 MACROS                    *
  38. ; **********************************************************************
  39.      IF1
  40.      INCLUDE HD.MAC
  41.      INCLUDE \SCRMGR\SCRNWORK.MAC
  42.      ENDIF
  43. ; **********************************************************************
  44. ; *                                       *
  45. ; *                   BEGIN                       *
  46. ; *                                       *
  47. ; **********************************************************************
  48. CSEG     SEGMENT PARA PUBLIC 'CODE'
  49.      ASSUME CS:CSEG
  50. HDSURF PROC    NEAR
  51.      ASSUME  DS:CSEG           ;DATA SEGMENT
  52.      JMP     BY_ID               ;JMP AROUND ID
  53.      ID     HDSURF
  54.      INCLUDE \SCRMGR\SCRNWORK.ASM
  55. ; **********************************************************************
  56. ; *             EQUATES AND STRUCTURES                *
  57. ; **********************************************************************
  58.      INCLUDE HDEQU.ASM
  59. ; **********************************************************************
  60. ; *                 SCREENS                   *
  61. ; **********************************************************************
  62.   SFIELD FM0,FM1,,@LABEL,RV+BLINK,14,34,' WARNING '
  63.   SFIELD FM1,FM2,,@LABEL,LO,15,18,'THIS WILL DESTROY ALL DATA ON THE HARD DISK'
  64.   SFIELD FM2,FM3,,@LABEL,LO,16,22,'REPLY Y TO CONTINUE OR N TO STOP -'
  65.   SFIELD FM3,FM0,,@YN+@UC+@NFULL+@REQ,LO,16,57,' '
  66.   SFIELD T05,T05,,@LABEL,RV,17,31,'SURFACE ANALYSIS'
  67. ;
  68.   SFIELD X00,X01,,@LABEL,RV,23,02,'CTRL-F1 TO START'
  69.   SFIELD X01,X02,,@LABEL,RV,23,29,'ESC FOR THE MAIN MENU'
  70.   SFIELD X02,X00,,@LABEL,RV,23,62,'CTRL-BRK TO STOP'
  71. ;
  72.   SFIELD XI0,XI1,,@LABEL,LO,19,05,'DRIVE =>'
  73.   SFIELD XI1,XI2,1,@EX+@NUM+@UC+@NFULL+@REQ,LO,19,14
  74.   SFIELD XI2,XI3,,@LABEL,LO,20,05,'(1 OR 2)'
  75.   SFIELD XI3,XI4,,@LABEL,LO,19,22,'INTERLEAVE =>'
  76.   SFIELD XI4,XI5,1,@EX+@NUM+@NFULL+@REQ,LO,19,36
  77.   SFIELD XI5,XI0,,@LABEL,LO,20,26,'(1-8)'
  78. ;
  79.   SFIELD XS0,XS1,,@LABEL,LO,19,46,'STATUS =>'
  80.   SFIELD XS1,XS0,,@LABEL,LO,19,56,'** IDLE **   '
  81. ;
  82.   SFIELD XS2,XS3,,@LABEL,LO,19,46,'STATUS =>'
  83.   SFIELD XS3,XS2,,@LABEL,HI,19,56,'** WORKING **'
  84. ;
  85.   SFIELD XC0,XC1,,@LABEL,LO,20,46,'CYLINDER =>'
  86.   SFIELD XC1,XC0,04,@LABEL,LO,20,58
  87. ;
  88.   SFIELD XE0,XE1,,@LABEL,LO,21,46,'ERRORS =>'
  89.   SFIELD XE1,XE0,04,@LABEL,LO,21,56
  90. ;
  91.   SFIELD E01,E02,,@LABEL,LO,16,02,'  CYL XXXX HEAD XX HAS BEEN FLAGGED'
  92.   SFIELD E02,E03,04,@LABEL,LO,16,08
  93.   SFIELD E03,E01,02,@LABEL,LO,16,18
  94. ;
  95. BY_ID:
  96. HDSURF ENDP
  97. ; *********************************************************************
  98. ; *                                      *
  99. ; *                SURFACE ANALYSIS                  *
  100. ; *                                      *
  101. ; *********************************************************************
  102. SURFA       PROC
  103.      CLS     LO,4,1,23,78           ;CLEAR THE SCREEN
  104.      BOX     17,0,08,80,LO           ;OUTLINE
  105.      WRITEC  0CCH,LO,17,0,1        ;  THE
  106.      WRITEC  0B9H,LO,17,79,1       ;  SCREEN
  107.      WRITE     T05               ;TYPE OF TEST
  108.      WRITE     X00               ;COMMANDS
  109. SURFA_00:
  110.      WRITE     XS0               ;STATUS
  111.      LEA     BX,XI1            ;DRIVE ENTRY
  112.      MOV     [BX].S_ATTR,LO        ;RESTORE ATTRIBUTE
  113.      MOV     [BX].S_DATA,' '       ;CLEAR DRIVE
  114.      LEA     BX,XI4            ;INTERLEAVE ENTRY
  115.      MOV     [BX].S_ATTR,LO        ;RESTORE ATTRIBUTE
  116.      MOV     [BX].S_DATA,'3'       ;DEFAULT INTERLEAVE OF 3 (AT)
  117.      CMP     PCT,00H           ;IBM/AT??
  118.      JE     SURFA_01           ;YES
  119.      MOV     [BX].S_DATA,'6'       ;DEFAULT INTERLEAVE OF 6 (PC)
  120. SURFA_01:
  121.      WRITE     XI0               ;DRIVE + INTERLEAVE
  122. SURFA_02:
  123.      READR     BX               ;FETCH DRIVE AND INTERLEAVE
  124.      CALL     TRANS_KEY           ;TRANSLATE THE KEY
  125.      JNC     SURFA_04           ;SUCESSFULL
  126. SURFA_03:
  127.      CALL     BEEP               ;RING THE BELL
  128.      JMP     SURFA_02           ;TRY AGAIN
  129. SURFA_04:
  130.      CMP     AL,ESC_KEY           ;ESCAPE KEY??
  131.      JNE     SURFA_05           ;NO
  132.      JMP     EXIT               ;RETURN
  133. SURFA_05:
  134.      CMP     AL,C_BRK           ;CONTROL BREAK KEY??
  135.      JNE     SURFA_07           ;NO
  136.      JMP     SURFA               ;YES - START OVER
  137. SURFA_07:
  138.      CMP     AL,C_F1           ;CTRL_F1??
  139.      JNE     SURFA_03           ;NO - INVALID KEY
  140.      LEA     BX,XI1            ;DRIVE ENTRY
  141.      MOV     [BX].S_ATTR,LO        ;RESTORE ATTRIBUTE
  142.      MOV     AL,[BX].S_DATA        ;FETCH DRIVE NUMBER
  143.      CMP     AL,'1'                ;VALID DRIVE??
  144.      JE     SURFA_08           ;YES
  145.      CMP     AL,'2'                ;VALID DRIVE??
  146.      JE     SURFA_08           ;YES
  147.      MOV     [BX].S_ATTR,HI        ;HIGHLIGHT IT
  148.      PMSG     22               ;DISPLAY THE MESSAGE
  149.      CALL     BEEP               ;RING THE BELL
  150.      WRITE     XI0               ;DRIVE + INTERLEAVE
  151.      JMP     SURFA_02           ;TRY AGAIN
  152. SURFA_08:
  153.      AND     AL,0FH            ;ADJUST
  154.      DEC     AL               ;  DRIVE NUMBER
  155.      CMP     AL,NUM_DR           ;DRIVE INSTALLED
  156.      jb     SURFA_10           ;YES
  157.      MOV     [BX].S_ATTR,HI        ;HIGHLIGHT IT
  158.      PMSG     21               ;DISPLAY THE MESSAGE
  159.      CALL     BEEP               ;RING THE BELL
  160.      WRITE     XI0               ;DRIVE + INTERLEAVE
  161.      JMP     SURFA_02           ;TRY AGAIN
  162. SURFA_10:
  163.      MOV     DR,AL               ;SAVE DRIVE NUMBER
  164.      LEA     BX,XI4            ;INTERLEAVE ENTRY
  165.      MOV     [BX].S_ATTR,LO        ;RESTORE ATTRIBUTE
  166.      MOV     AL,[BX].S_DATA        ;FETCH INTERLEAVE
  167.      CMP     AL,'1'                ;IN RANGE??
  168.      JB     SURFA_15           ;NO
  169.      CMP     AL,'8'                ;IN RANGE??
  170.      JA     SURFA_15           ;NO
  171.      JMP     SURFA_20           ;CONTINUE
  172. SURFA_15:
  173.      MOV     [BX].S_ATTR,HI        ;HIGHLIGHT IT
  174.      PMSG     23               ;DISPLAY THE MESSAGE
  175.      CALL     BEEP               ;RING THE BELL
  176.      WRITE     XI2               ;DRIVE + INTERLEAVE
  177.      JMP     SURFA_02           ;TRY AGAIN
  178. SURFA_20:
  179.      XOR     AH,AH               ;CLEAR AH
  180.      AND     AL,0FH            ;MAKE IT A DIGIT
  181.      DEC     AL               ;RELEATIVE TO ZERO
  182.      XOR     DX,DX               ;CLEAR DX
  183.      MOV     CX,17               ;SECTORS PER TRACK
  184.      MUL     CX
  185.      LEA     SI,INL_TBL           ;INTERLEAVE TABLE
  186.      ADD     SI,AX               ;TABLE INDEX
  187.      XOR     AX,AX               ;PAD CHARACTER
  188.      MOV     CX,512            ;BUFFER SIZE
  189.      CLD                   ;FORWARD DIRECTION
  190.      LEA     DI,FMT_BUFF           ;FORMAT BUFFER
  191.      PUSH     DS               ;ESTABLISH
  192.      POP     ES               ;  SEGMENT
  193.      REP     STOSB               ;ZERO THE BUFFER
  194.      MOV     CX,17               ;NUMBER OF SECTORS
  195.      LEA     DI,FMT_BUFF           ;FORMAT BUFFER
  196. SURFA_30:
  197.      LODSB                   ;FETCH SECTOR NUMBER
  198.      MOV     AH,80H            ;BAD SECTOR INDICATOR
  199.      XCHG     AL,AH               ;ADJUST FOR STOSW
  200.      STOSW                   ;SET SECTOR NUMBER
  201.      LOOP     SURFA_30           ;COMPLETE THE BUFFER
  202. SURFA_35:
  203.      LEA     BX,XI1            ;DRIVE ENTRY
  204.      MOV     [BX].S_ATTR,LO        ;RESTORE ATTRIBUTE
  205.      LEA     BX,XI4            ;INTERLEAVE ENTRY
  206.      MOV     [BX].S_ATTR,LO        ;RESTORE ATTRIBUTE
  207.      WRITE     XI0               ;DRIVE + INTERLEAVE
  208.      LEA     BX,FM3            ;REPLY ENTRY
  209.      MOV     [BX].S_DATA,' '       ;CLEAR REPLY
  210.      CLS     LO,4,2,16,78           ;CLEAR THE SCREEN
  211.      WRITE     FM0               ;DISPLAY MESSAGE
  212.      READ     FM0               ;GET REPLY
  213.      LEA     BX,FM3            ;REPLY ENTRY
  214.      CMP     [BX].S_DATA,'Y'       ;CONTINUE??
  215.      JE     SURFA_40           ;YES
  216.      JMP     SURFA               ;RESTART
  217. SURFA_40:
  218.      CALL     READ_PARMS           ;FETCH DRIVE PARMS
  219.      MOV     CUR_HD,0           ;INITIALIZE
  220.      MOV     CUR_SEC,1           ; THE
  221.      MOV     CUR_CYL,0           ;  STARTING FIELDS
  222.      MOV     ERR_CNT,0           ;CLEAR THE ERROR COUNT
  223.      MOV     NUM_SEC,17           ;NUMBER OF SECTORS
  224.      CALL     UPD_CYL           ;DISPLAY CYLINDER NUMBER
  225.      CALL     UPD_ERR           ;DISPLAY ERROR COUNT
  226.      WRITE     XS2               ;STATUS
  227.      CLS     LO,4,2,16,78           ;CLEAR THE SCREEN
  228.      CALL     HIDE_CUR           ;HIDE THE CURSOR
  229. ; *********************************************************************
  230. ; *               BEGIN THE ANALYSIS                  *
  231. ; *********************************************************************
  232.      CALL     CTLR_DIAG           ;EXECUTE CTLR HDNOSTICS
  233.      JNC     SURFA_50           ;SUCESSFULL
  234.      PMSG     26,HI               ;FAILED
  235.      CALL     UPD_ERR           ;DISPLAY ERROR COUNT
  236.      JMP     SURFA_00           ;TERMINATE FORMAT
  237. SURFA_50:
  238.      PUSH     DS               ;ESTABLISG
  239.      POP     ES               ;  SEGMENT
  240. SURFA_60:
  241.      MOV     AH,0BH            ;CHECK FOR
  242.      INT     21H               ;  CONTROL BREAK
  243.      CALL     UPD_CYL           ;DISPLAY CURRENT CYLINDER
  244.      MOV     CX,5               ;NUMBER OF TIMES TO WRITE
  245. SURFA_65:
  246.      MOV     HD_CMD,WR_CMD           ;WRITE COMMAND
  247.      LEA     BX,DIAG_BUF           ;HD BUFFERER
  248.      MOV     NUM_SEC,1           ;NUMBER OF SECTORS
  249.      CALL     EXEC_CMD           ;WRITE THE SECTOR
  250.      JNC     SURFA_70           ;SUCESSFULL
  251.      CMP     AL,0FFH           ;CTLR BROKE??
  252.      JNE     SURFA_67           ;NO
  253.      JMP     SURFA_00           ;STOP
  254. SURFA_67:
  255.      PUSH     AX               ;SAVE AX
  256.      CALL     UPD_ERR           ;DISPLAY ERROR COUNT
  257.      POP     AX               ;RESTORE AX
  258.      CMP     AH,BSEC_ER           ;BAD SECTOR??
  259.      JE     SURFA_80           ;YES - SKIP VERIFY
  260.      CMP     AH,BTRK_ER           ;BAD TRACK??
  261.      JE     SURFA_80           ;YES - SKIP VERIFY
  262.      CALL     FLAG_TRK           ;FLAG THE TRACK
  263.      MOV     CUR_SEC,17           ;FORCE NEXT HEAD
  264.      JMP     SURFA_80           ;SKIP VERIFY
  265. SURFA_70:
  266.      MOV     HD_CMD,VER_CMD        ;VERIFY COMMAND
  267.      LEA     BX,DIAG_BUF           ;HD BUFFERER
  268.      MOV     NUM_SEC,1           ;NUMBER OF SECTORS
  269.      CALL     EXEC_CMD           ;VERIFY THE SECTOR
  270.      JNC     SURFA_75           ;SUCESSFULL
  271.      CALL     FLAG_TRK           ;FLAG THE TRACK
  272.      CALL     UPD_ERR           ;DISPLAY ERROR COUNT
  273.      MOV     CUR_SEC,17           ;FORCE NEXT HEAD
  274.      JMP     SURFA_80           ;CONTINUE
  275. SURFA_75:
  276.      LOOP     SURFA_70           ;ONE MORE TIME
  277. SURFA_80:
  278.      CALL     NEXT_SEC           ;NEXT SECTOR
  279.      JNC     SURFA_60           ;AND PROCESS IT
  280.      MOV     HD_CMD,SEEK_CMD       ;LETS
  281.      MOV     CUR_CYL,0           ; BRING
  282.      MOV     CUR_HD,0           ;  THE HEADS
  283.      CALL     EXEC_CMD           ;  HOME
  284.      PMSG     27,HI               ;FORMAT COMPLETE
  285.      JMP     SURFA_00           ;NEXT
  286. ; *********************************************************************
  287. ; *                E X I T                   *
  288. ; *********************************************************************
  289. EXIT:
  290.      RET                   ;RETURN
  291. SURFA     ENDP
  292. ; *********************************************************************
  293. ; *            DISPLAY CURRENT CYLINDER              *
  294. ; *********************************************************************
  295. UPD_CYL  PROC
  296.      PUSHALL
  297.      MOV     AX,CUR_CYL           ;FORMAT
  298.      LEA     BX,XC1            ; CYLINDER
  299.      CALL     CONV_ASCII           ;  DISPLAY
  300.      WRITE     XC0               ;CYLINDER
  301.      POPALL
  302.      RET                   ;RETURN
  303. UPD_CYL  ENDP
  304. ; *********************************************************************
  305. ; *               DISPLAY ERROR COUNT                  *
  306. ; *********************************************************************
  307. UPD_ERR  PROC
  308.      PUSHALL
  309.      XOR     AX,AX               ;CLEAR AX
  310.      MOV     AX,ERR_CNT           ;FORMAT
  311.      LEA     BX,XE1            ; ERROR COUNT
  312.      CALL     CONV_ASCII           ;  DISPLAY
  313.      WRITE     XE0               ;ERROR COUNT
  314.      POPALL
  315.      RET                   ;RETURN
  316. UPD_ERR  ENDP
  317. ; *********************************************************************
  318. ; *               FLAG BAD TRACK                  *
  319. ; *********************************************************************
  320. FLAG_TRK PROC
  321.      PUSHALL
  322.      MOV     AH,FMT_CMD           ;FORMAT COMMAND
  323.      MOV     AL,17               ;NUMBER OF SECTORS
  324.      CMP     PCT,00H           ;IBM/AT??
  325.      JE     FLAG_T00           ;YES
  326.      MOV     AH,FMD_CMD           ;FORMAT DRIVE
  327.      LEA     BX,XI4            ;FETCH
  328.      MOV     AL,[BX].S_DATA        ;  INTERLEAVE
  329.      AND     AL,0FH            ;MAKE IT A DIGIT
  330. FLAG_T00:
  331.      MOV     DX,CUR_CYL           ;CURRENT CYLINDER
  332.      XCHG     DH,DL               ;ADJUST IT
  333.      MOV     CX,6               ;SHIFT COUNT
  334.      SHL     DL,CL               ;ADJUST CYL HIGH
  335.      OR     DL,1               ;SET SECTOR NUMBER
  336.      MOV     CX,DX               ;CX SET
  337.      MOV     DH,CUR_HD           ;SET HEAD
  338.      MOV     DL,DR               ;DRIVE
  339.      OR     DL,80H            ;  NUMBER
  340.      LEA     BX,FMT_BUFF           ;FORMAT BUFFER
  341.      INT     13H               ;EXECUTE THE COMMAND
  342.      MOV     AX,CUR_CYL           ;FORMAT
  343.      LEA     BX,E02            ;  CYLINDER
  344.      CALL     CONV_ASCII
  345.      XOR     AX,AX               ;CLEAR AX
  346.      MOV     AL,CUR_HD           ;FORMAT
  347.      LEA     BX,E03            ;  HEAD
  348.      CALL     CONV_ASCII
  349.      SCROLL  LO,4,2,16,78           ;SCROLL
  350.      WRITE     E01               ;DISPLAY THE MESSAGE
  351.      CALL     LOGERR            ;PRINT THE MESSAGE
  352.      POPALL
  353.      RET                   ;RETURN
  354. FLAG_TRK ENDP
  355. CSEG     ENDS
  356.      END     HDSURF
  357.