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

  1.      PAGE     64,132            ;PAGE WIDTH,LENGTH
  2.      .SALL
  3.      TITLE     PC/AT DISK DIAGNOSTIC PROGRAM
  4. ; **********************************************************************
  5. ; *                                       *
  6. ; *    DECSRIPTION    A MENU DRIVEN HARD DISK DIAGNOSTIC PROGRAM      *
  7. ; *               FOR HARD DISKS ON A IBM PC/AT.               *
  8. ; *                                       *
  9. ; *    INPUTS           MENU INPUT                       *
  10. ; *                                       *
  11. ; *                                       *
  12. ; *    OUTPUTS        CAN DESTROY DATA ON THE HARD DISK           *
  13. ; *                                       *
  14. ; *                                       *
  15. ; **********************************************************************
  16. ;
  17.      PUBLIC  HDMAIN
  18. ;
  19. ; **********************************************************************
  20. ; *             PROGRAMS OR ROUTINES TO BE CALLED               *
  21. ; **********************************************************************
  22.      EXTRN     SCRMGR:NEAR           ;SCREEN MANAGER
  23.      EXTRN     HDRW:NEAR           ;WRITE/READ/VERIFY TEST
  24.      EXTRN     HDSEEK:NEAR           ;SEEK TEST
  25.      EXTRN     HDHS:NEAR           ;HEAD SELECT TEST
  26.      EXTRN     HDECC:NEAR           ;ECC TEST
  27.      EXTRN     HDALL:NEAR           ;RUN ALL TESTS
  28.      EXTRN     HDSURF:NEAR           ;SURFACE ANALYSIS
  29.      EXTRN     HDTFMT:NEAR           ;FORMAT TRACK
  30.      EXTRN     HDFMT:NEAR           ;FORMAT DRIVE
  31.      EXTRN     HDMSG:NEAR           ;MSG DISPLAY AND PRINT
  32.      EXTRN     PRT_MSG:NEAR
  33.      EXTRN     D_ERROR:NEAR
  34.      EXTRN     HDSHIP:NEAR           ;LAND THE HEADS
  35.      EXTRN     HDFSEC:NEAR           ;FLAG A SECTOR
  36.      EXTRN     HDSCAN:NEAR           ;QUICK DEFECT SCAN
  37. ; **********************************************************************
  38. ; *               PUBLIC SUBROUTINES                   *
  39. ; **********************************************************************
  40.      PUBLIC  CONV_ASCII,BOX_IT,BEEP,TRANS_KEY,READ_PARMS
  41.      PUBLIC  EXEC_CMD,DECODE_ERR,NEXT_SEC,NEXT_TRK
  42.      PUBLIC  NEXT_CYL,CTLR_DIAG,HIDE_CUR,WRITE_CMSG
  43. ;
  44.      IF1
  45.      INCLUDE HD.MAC
  46.      INCLUDE \SCRMGR\SCRNWORK.MAC
  47.      ENDIF
  48. ; **********************************************************************
  49. ; *                                       *
  50. ; *                   BEGIN                       *
  51. ; *                                       *
  52. ; **********************************************************************
  53. CSEG     SEGMENT PARA PUBLIC 'CODE'
  54.      ORG     100H
  55.      ASSUME  CS:CSEG
  56. HDMAIN PROC    NEAR
  57.      PUSH     CS               ;ESTABLISH
  58.      POP     DS               ;  DATA
  59.      ASSUME  DS:CSEG           ;    SEGMENT
  60.      LEA     AX,STACK_SSE           ;END OF THE STACK AREA
  61.      MOV     BX,CS               ;INITIALIZE
  62.      MOV     SS,BX               ;  STACK
  63.      MOV     SP,AX               ;    SEGMENT
  64.      JMP     BY_INFO           ;JMP AROUND COPYRIGHT
  65.      ID     HDMAIN
  66. ; **********************************************************************
  67. ; *                 STACK WORK AREA                   *
  68. ; **********************************************************************
  69. STACK_SS DB     512 DUP(0)           ;STACK AREA
  70. STACK_SSE EQU     $               ;END OF THE STACK AREA
  71. ; **********************************************************************
  72. ; *             EXTENDED KEY TABLE                   *
  73. ; **********************************************************************
  74. EX_KEY     LABEL     BYTE
  75.      DB     132 DUP(0FFH)
  76.      ORG     $-132
  77.      ORG     EX_KEY+13
  78.      DB     00               ;ENTER  KEY
  79.      ORG     EX_KEY+27
  80.      DB     41               ;ESCAPE KEY
  81.      ORG     EX_KEY+59
  82.      DB     01,02,03,04,05        ;FUNCTION KEYS 1 TO 5
  83.      DB     06,07,08,09,10        ;FUNCTION KEYS 6 TO 10
  84.      ORG     EX_KEY+73
  85.      DB     43               ;PAGE UP
  86.      ORG     EX_KEY+79
  87.      DB     42               ;END
  88.      ORG     EX_KEY+81
  89.      DB     44               ;PAGE DOWN
  90.      ORG     EX_KEY+84
  91.      DB     11,12,13,14,15        ;FUNCTION KEYS 11 TO 15     SHIFT
  92.      DB     16,17,18,19,20        ;FUNCTION KEYS 16 TO 20     SHIFT
  93.      ORG     EX_KEY+94
  94.      DB     21,22,23,24,25        ;FUNCTION KEYS 21 TO 25     CTRL
  95.      DB     26,27,28,29,30        ;FUNCTION KEYS 26 TO 30     CTRL
  96.      ORG     EX_KEY+104
  97.      DB     31,32,33,34,35        ;FUNCTION KEYS 31 TO 35     ALT
  98.      DB     36,37,38,39,40        ;FUNCTION KEYS 36 TO 40     ALT
  99.      DB     0FEH               ;CONTROL BREAK
  100.      ORG     EX_KEY+132
  101. ; **********************************************************************
  102. ; *                 PUBLIC FIELDS                   *
  103. ; **********************************************************************
  104.      PUBLIC  MAX_HD,MAX_CYL,MAX_SEC,CUR_HD,CUR_CYL,CUR_SEC
  105.      PUBLIC  DR,NUM_DR,ERR_CNT,FMT_BUFF,BROW,BCOL,BHEIGHT
  106.      PUBLIC  BWIDTH,BATTR,BCHAR,INL_TBL,HD_CMD,NUM_SEC,ERR_CODE
  107.      PUBLIC  DIAG_BUF,DATA_BUF,P_STAT,ALL_SW,BAD_SEC,FUNC
  108.      PUBLIC  RW_X,HS_X,SEEK_X,ECC_X,PCT
  109. ; **********************************************************************
  110. ; *                 WORKAREAS                       *
  111. ; **********************************************************************
  112. W16     DW     16
  113. B16     DB     16
  114. B10     DB     10
  115. MAX_HD     DB     0               ;MAX HEADS
  116. MAX_CYL  DW     0               ;MAX CYLINDERS
  117. MAX_SEC  DB     17               ;MAX SECTORS
  118. CUR_HD     DB     0               ;CURRENT HEAD
  119. CUR_CYL  DW     0               ;CURRENT CYLINDER
  120. CUR_SEC  DB     0               ;CURRENT SECTOR
  121. B_CYL     DW     0               ;LAST BAD SECTOR CYL
  122. B_HD     DB     0               ;LAST BAD SECTOR HEAD
  123. NUM_SEC  DB     0               ;NUMBER OF SECTORS
  124. HD_CMD     DB     0               ;HARD DISK COMMAND
  125. DR     DB     0               ;DRIVE NUMBER
  126. ERR_CODE DB     0               ;SAVED ERROR CODE
  127. FUNC     DB     0               ;FUNC CODE
  128. NUM_DR     DB     0               ;NUMBER OF INSTALLED DRIVES
  129. SNUM_DR  DB     0               ;SAVED NUMBER OF INSTALLED DRIVES
  130. ERR_CNT  DW     0               ;ERROR COUNT
  131. RW_X     DB     0               ;READ/WRITE/VERIFY FLAG
  132. HS_X     DB     0               ;HEAD SELECT FLAG
  133. SEEK_X     DB     0               ;SEEK FLAG
  134. ECC_X     DB     0               ;ECC FLAG
  135. PC_TYPE  LABEL     DWORD
  136.      DW     000EH,0FFFFH           ;LOCATION OF PC TYPE
  137. AT     EQU     0FCH               ;IBM AT
  138. PCT     DB     0               ;TYPE OF PC
  139. DWORK     DB     16 DUP(0)           ;WORK AREA
  140. CUR_DIAG DW     0               ;CURRENT DIAGNOSTIC
  141. SAVE_SP  DW     0               ;SAVED STACK POINTER
  142. P_STAT     DB     0FFH               ;PRINTER STATUS
  143. ALL_SW     DB     00H               ;RUN ALL TESTS SWITCH
  144. BAD_SEC  DW     0               ;BAD SECTOR COUNT
  145. ; **********************************************************************
  146. ; *                BOX PARAMETERS                   *
  147. ; **********************************************************************
  148. BROW     DB     0               ;STARTING ROW
  149. BCOL     DB     0               ;STARTING COLUMN
  150. BHEIGHT  DB     0               ;HIGHT
  151. BWIDTH     DB     0               ;WIDTH
  152. BATTR     DB     0               ;ATTRIBUTE
  153. BCHAR     DB     0               ;CHARACTER TO WRITE
  154. ; **********************************************************************
  155. ; *               INTERLEAVE TABLE                   *
  156. ; **********************************************************************
  157. INL_TBL  LABEL     BYTE
  158. INT_1     DB     1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
  159. INT_2     DB     1,10,2,11,3,12,4,13,5,14,6,15,7,16,8,17,9
  160. INT_3     DB     1,7,13,2,8,14,3,9,15,4,10,16,5,11,17,6,12
  161. INT_4     DB     1,14,10,6,2,15,11,7,3,16,12,8,4,17,13,9,5
  162. INT_5     DB     1,8,15,5,12,2,9,16,6,13,3,10,17,7,14,4,11
  163. INT_6     DB     1,4,7,10,13,16,2,5,8,11,14,17,3,6,9,12,15
  164. INT_7     DB     1,6,11,16,4,9,14,2,7,12,17,5,10,15,3,8,13
  165. INT_8     DB     1,16,14,12,10,8,6,4,2,17,15,13,11,9,7,5,3
  166. ; **********************************************************************
  167. ; *                                       *
  168. ; *                  MAIN SCREEN                   *
  169. ; *                                       *
  170. ; **********************************************************************
  171.   SFIELD A00,A01,,@LABEL,RV,05,20,'TESTS THAT WILL NOT DESTROY USER DATA'
  172.   SFIELD A01,A02,,@LABEL,LO,07,24,'F1.......WRITE/READ/VERIFY TEST'
  173.   SFIELD A02,A03,,@LABEL,LO,08,24,'F2.......SEEK TEST'
  174.   SFIELD A03,A04,,@LABEL,LO,09,24,'F3.......HEAD SELECT TEST'
  175.   SFIELD A04,A05,,@LABEL,LO,10,24,'F4.......ECC TEST'
  176.   SFIELD A05,A06,,@LABEL,LO,11,24,'F5.......RUN ALL TESTS'
  177.   SFIELD A06,A07,,@LABEL,LO,12,24,'F6.......PREPARE FOR RELOCATION'
  178.   SFIELD A07,A08,,@LABEL,LO,13,24,'F7.......DEFECT SCAN'
  179.   SFIELD A08,A09,,@LABEL,RV,15,22,'TESTS THAT WILL DESTROY USER DATA'
  180.   SFIELD A09,A10,,@LABEL,LO,17,24,'F8.......SURFACE ANALYSIS'
  181.   SFIELD A10,A11,,@LABEL,LO,18,24,'F9.......FORMAT DISK'
  182.   SFIELD A11,A12,,@LABEL,LO,19,24,'F10......FLAG DEFECTS'
  183.   SFIELD A12,A13,,@LABEL,LO,20,24,'A-F1.....FORMAT TRACK'
  184.   SFIELD A13,A14,,@LABEL,LO,22,24,'A-F9.....TOGGLE PRINTER ON/OFF'
  185.   SFIELD A14,A00,,@LABEL,LO,23,24,'A-F10....EXIT'
  186. ;
  187.   SFIELD D00,D00,,@EX,LO,24,81,' '    ;DUMMY INPUT
  188. ;
  189.   SFIELD P00,P00,,@LABEL,RV,03,33,'PRINTER ON'
  190.   SFIELD P01,P01,,@LABEL,RV,03,33,'PRINTER OFF'
  191. ; **********************************************************************
  192. ; *                 ERROR CODE TABLE                   *
  193. ; **********************************************************************
  194. ERR_TBL  LABEL     BYTE
  195.      DB     256 DUP(0)           ;FILL TABLE
  196.      ORG     ERR_TBL+01H
  197.      DB     1               ;BAD COMMAND
  198.      ORG     ERR_TBL+02H
  199.      DB     2               ;ADDRESS MARK NOT FOUND
  200.      ORG     ERR_TBL+04H
  201.      DB     3               ;NO RECORD FOUND
  202.      ORG     ERR_TBL+05H
  203.      DB     4               ;RESET FAILED
  204.      ORG     ERR_TBL+07H
  205.      DB     5               ;DRIVE INIT FAILED
  206.      ORG     ERR_TBL+09H
  207.      DB     6               ;READ/WRITE CROSSES 64K
  208.      ORG     ERR_TBL+0AH
  209. BS_FLAG  DB     7               ;BAD SECTOR FLAG
  210.      ORG     ERR_TBL+10H
  211.      DB     8               ;UNCORRECTABLE DATA ERROR
  212.      ORG     ERR_TBL+11H
  213.      DB     9               ;CORRECTABLE DATA CHECK
  214.      ORG     ERR_TBL+20H
  215.      DB     10               ;CONTROLLER ERROR
  216.      ORG     ERR_TBL+40H
  217.      DB     11               ;SEEK ERROR
  218.      ORG     ERR_TBL+80H
  219.      DB     12               ;TIME OUT
  220.      ORG     ERR_TBL+0AAH
  221.      DB     13               ;DRIVE NOT READY
  222.      ORG     ERR_TBL+0BBH
  223.      DB     14               ;UNDEFINED ERROR
  224.      ORG     ERR_TBL+0CCH
  225.      DB     15               ;WRITE FAULT
  226.      ORG     ERR_TBL+0E0H
  227.      DB     16               ;UNKOWN ERROR
  228.      ORG     ERR_TBL+0FFH
  229.      DB     17               ;SENSE ERROR
  230.      ORG     ERR_TBL+81H
  231.      DB     16               ;UNKOWN ERROR
  232.      ORG     ERR_TBL+82H
  233.      DB     10               ;CONTROLLER FAILED
  234.      ORG     ERR_TBL+83H
  235.      DB     18               ;SECTOR BUFFER ERROR
  236.      ORG     ERR_TBL+84H
  237.      DB     19               ;ECC DEVICE ERROR
  238.      ORG     ERR_TBL+85H
  239.      DB     20               ;CONTROL PROCESS ERROR
  240.      ORG     ERR_TBL+256
  241. ;
  242.   SFIELD E08,E09,,@LABEL,HI,16,02,'CONTROLLER DIAGNOSTIC FAILED - THE'
  243.   SFIELD E09,E08,,@LABEL,HI,16,37,'CONTROLLER MAY BE BAD'
  244. ;
  245.   SFIELD EX1,EX2,,@LABEL,HI,10,20,'THE HARD DISK(S) HAVE FAILED TO RESPOND'
  246.   SFIELD EX2,EX3,,@LABEL,HI,11,20,'CHECK THE FOLLOWING ITEMS AND TRY AGAIN'
  247.   SFIELD EX3,EX4,,@LABEL,HI,13,32,'DRIVE CONFIGURED ?'
  248.   SFIELD EX4,EX5,,@LABEL,HI,14,32,'DISK DRIVE POWER'
  249.   SFIELD EX5,EX6,,@LABEL,HI,15,32,'DISK DRIVE CABLES'
  250.   SFIELD EX6,EX7,,@LABEL,HI,16,32,'DISK DRIVE TERMINATOR'
  251.   SFIELD EX7,EX1,,@LABEL,HI,17,32,'DISK DRIVE ADDRESS'
  252. ; **********************************************************************
  253. ; *               COPYR1GHT MESSAGE                   *
  254. ; **********************************************************************
  255.  SFIELD X1,X2,,@LABEL,LO,01,21,'HARD DISK DIAGNOSTIC - VERSION 2.10'
  256.  SFIELD X2,X3,,@LABEL,RV,01,03,'  AT  '
  257.  SFIELD X3,X1,,@LABEL,LO,02,26,'COPYRIGHT (C) JIM BRACKING'
  258. ;
  259.      INCLUDE \SCRMGR\SCRNWORK.ASM
  260.      INCLUDE HDEQU.ASM
  261. ;
  262. ;
  263. FMT_BUFF DB     512 DUP(0)           ;FORMAT BUFFER
  264. DIAG_BUF DB     512 DUP(0)           ;ONE SECTOR OF DATA
  265. DATA_BUF DB     516 DUP(0)           ;DATA BUFFER
  266. BY_INFO:
  267. ; **********************************************************************
  268. ; *           ESTABLISH CONTROL BREAK INTERRUPT               *
  269. ; **********************************************************************
  270.      LEA     DX,CBREAK           ;SET CONTROL
  271.      MOV     AL,23H            ;  BREAK
  272.      MOV     AH,25H            ;  INTERRUPT
  273.      INT     21H               ;  ADDRESS
  274. ; **********************************************************************
  275. ; *              SET CONTROL BREAK ON                   *
  276. ; **********************************************************************
  277.      PUSH     DS               ;ESTABLISH EXTRA
  278.      POP     ES               ;  SEGMENT
  279.      MOV     AH,33H            ;SET CONTROL
  280.      MOV     AL,01H            ;  BREAK
  281.      MOV     DL,01H            ;  ON
  282.      INT     21H
  283. ;
  284.      MOV     AX,HD_DATA           ;ESTABLISH
  285.      MOV     ES,AX               ;  SEGMENT
  286.      MOV     AL,ES:HD_NUM           ;NUMBER OF INSTALLED DRIVES
  287.      MOV     SNUM_DR,AL           ;  SAVE IT
  288.      MOV     ES:HD_NUM,02H           ;SET # TO MAX
  289. ; **********************************************************************
  290. ; *          DETERMINE THE NUMBER OF INSTALLED DRIVES               *
  291. ; **********************************************************************
  292. INIT_10:
  293.      XOR     BX,BX               ;CLEAR BX
  294.      MOV     AX,1001H           ;TEST DRIVE READY
  295.      MOV     CX,0001H           ;CYL 0, SECTOR 1
  296.      MOV     DX,0080H           ;HEAD 0, DRIVE 0
  297.      INT     13H               ;EXECUTE THE COMMAND
  298.      JNC     INIT_20           ;ONE DIRVE
  299.      JMP     EXIT_ERR           ;NO DRIVES INSTALLED
  300. INIT_20:
  301.      INC     BX               ;ONE DRIVE
  302.      MOV     AX,1001H           ;TEST DRIVE READY
  303.      MOV     CX,0001H           ;CYL 0, SECTOR 1
  304.      MOV     DX,0081H           ;HEAD 0, DRIVE 1
  305.      INT     13H               ;EXECUTE THE COMMAND
  306.      JC     INIT_30           ;ONLY ONE DIRVE
  307.      INC     BX               ;TWO DRIVES INSTALLED
  308. INIT_30:
  309.      MOV     ES:HD_NUM,BL           ;NUMBER OF INSTALLED DRIVES
  310.      MOV     NUM_DR,BL           ;NUMBER OF INSTALLED DRIVES
  311. ;
  312. INIT_50:
  313.      MOV     AX,06DB6H           ;DATA PATTERN
  314.      MOV     CX,256            ;NUMBER OF WORDS
  315.      CLD                   ;FORWARD DIRECTION
  316.      LEA     DI,DIAG_BUF           ;OUTPUT
  317.      PUSH     CS               ;ESTABLISH
  318.      POP     ES               ;  SEGMENT
  319.      REP     STOSW               ;FILE THE BUFFER
  320. ;
  321.      LES     BX,CS:PC_TYPE           ;LOCATION OF MACHINE TYPE
  322.  CMP     BYTE PTR ES:[BX],AT           ;RUNNING ON A IBM AT??
  323.      JE     CO_MENU           ;YES
  324.      LEA     BX,X2               ;MSG ADDRESS
  325.  MOV     BYTE PTR S_DATA.[BX+2],'P'    ;MUST BE A
  326.  MOV     BYTE PTR S_DATA.[BX+3],'C'    ;  PC
  327.      MOV     PCT,0FFH           ;NOT AN IBM/AT
  328.      JMP     CO_MENU           ;CONTINUE
  329. ;
  330. EXIT_ERR:
  331.      CLS     LO,0,0,24,79           ;CLEAR THE SCREEN
  332.      WRITE     EX1               ;WRITE ERROR MSG
  333.      MOV     AX,4C00H           ;RETURN WITH ZERO RETURN CODE
  334.      INT     21H               ;BYE BYE
  335. EXIT:
  336.      CALL     CTLR_DIAG           ;RESET DRIVES
  337.      MOV     AX,HD_DATA           ;ESTABLISH
  338.      MOV     ES,AX               ;  SEGMENT
  339.      MOV     AL,SNUM_DR           ;RESTORE
  340.      MOV     ES:HD_NUM,AL           ;  DRIVE COUNT
  341.      CLS     LO,0,0,24,79           ;CLEAR THE SCREEN
  342.      MOV     AX,4C00H           ;RETURN WITH ZERO RETURN CODE
  343.      INT     21H               ;BYE BYE
  344. HDMAIN ENDP
  345. ; *********************************************************************
  346. ; *                                      *
  347. ; *               PROCESS MAIN MENU                  *
  348. ; *                                      *
  349. ; *********************************************************************
  350. CO_MENU  PROC
  351.      LEA     SI,CO_MENU           ;SAVE
  352.      MOV     CUR_DIAG,SI           ;  CURRENT DIAGNOSTIC
  353.      MOV     SAVE_SP,SP           ;SAVE STACK POINTER
  354.      CALL     WRITE_CMSG           ;FORMAT THE SCREEM
  355. CO_MENU_05:
  356.      WRITE     A01               ;DISPLAY THE MENU
  357.      READ     D00               ;GET THE SELECTION
  358.      PUSH     AX               ;SAVE AX
  359.      CLS     LO,4,1,23,78           ;FORMAT THE SCREEM
  360.      POP     AX               ;RESTORE AX
  361.      CALL     TRANS_KEY           ;TRANSLATE THE KEY
  362.      JC     CO_MENU_10           ;ERROR
  363.      CMP     AL,A_F10           ;EXIT??
  364.      JE     EXIT               ;YES
  365.      CMP     AL,A_F9           ;ALT_F9??
  366.      JNE     CO_MENU_07           ;NO
  367.      JMP     PRINT
  368. CO_MENU_07:
  369.      CMP     AL,F1               ;KEY
  370.      JB     CO_MENU_10           ; IN
  371.      CMP     AL,F10            ;  RANGE??
  372.      JA     CO_MENU_10
  373.      JMP     CO_MENU_30           ;CONTINUE
  374. CO_MENU_10:
  375.      CMP     AL,A_F1           ;KEY
  376.      JB     CO_MENU_20           ; IN
  377.      CMP     AL,A_F1           ;  RANGE
  378.      JA     CO_MENU_20           ;NO
  379.      SUB     AL,20               ;ADJUST FOR ALTERNATE KEY
  380.      JMP     CO_MENU_30           ;CONTINUE
  381. CO_MENU_20:
  382.      CALL     BEEP               ;SOUND THE MUSIC
  383.      JMP     CO_MENU_05           ;TRY AGAIN
  384. CO_MENU_30:
  385.      XOR     AH,AH               ;CLEAR AX
  386.      MOV     B_HD,0FFH           ;RESET BAD SEC HEAD
  387.      MOV     B_CYL,0FFFFH           ;RESET BAD SEC CYL
  388.      DEC     AL               ;MAKE IT RELITIVE TO ZERO
  389.      SHL     AL,1               ;ESTABLISH
  390.      MOV     SI,AX               ;  INDEX
  391.      MOV     CUR_DIAG,SI           ;SAVE CURRENT DIAGNOSTIC
  392.      MOV     SAVE_SP,SP           ;SAVE STACK POINTER
  393. CO_MENU_40:
  394.  CALL     WORD PTR CS:[SI+OFFSET SELECTION_TABLE]
  395.      JMP     CO_MENU           ;NEXT
  396. SELECTION_TABLE LABEL BYTE
  397.      DW     HDRW               ;WRITE/READ/VERIFY TEST
  398.      DW     HDSEEK            ;SEEK TEST
  399.      DW     HDHS               ;HEAD SELECT TEST
  400.      DW     HDECC               ;ECC TEST
  401.      DW     HDALL               ;RUN ALL TESTS
  402.      DW     HDSHIP            ;LAND THE HEADS
  403.      DW     HDSCAN            ;QUICK DEFECT SCAN
  404.      DW     HDSURF            ;SURFACE ANALYSIS
  405.      DW     HDFMT               ;FORMAT DRIVE
  406.      DW     HDFSEC            ;FLAG A BAD SECTOR
  407.      DW     HDTFMT            ;FORMAT A TRACK
  408. CO_MENU  ENDP
  409. ; *********************************************************************
  410. ; *                                      *
  411. ; *             CONTROL BREAK PROCESSING              *
  412. ; *                                      *
  413. ; *********************************************************************
  414. CBREAK     PROC
  415.      PUSH     CS               ;ESTABLISH
  416.      POP     DS               ;  DATA SEGMENT
  417.      MOV     SI,CUR_DIAG           ;CURRENT HDNOSTIC
  418.      CLI                   ;DISABLE INTERRUPTS
  419.      MOV     SP,SAVE_SP           ;RESTORE SP
  420.      STI                   ;ENABLE INTERRUPTS
  421.      CALL     WRITE_CMSG           ;FORMAT THE SCREEN
  422.      MOV     ALL_SW,00H           ;RESET SWITCH
  423.      JMP     CO_MENU_40           ;CONTINUE
  424. CBREAK     ENDP
  425. ; *********************************************************************
  426. ; *                                      *
  427. ; *              TOGGLE THE PRINTER                  *
  428. ; *                                      *
  429. ; *********************************************************************
  430. PRINT     PROC
  431.      MOV     AL,P_STAT           ;FETCH PRINTER STATUS
  432.      OR     AL,AL               ;PRINTER ON??
  433.      JZ     PRINT_10           ;YES - TURN IT OFF
  434.      XOR     AL,AL               ;TURN THE PRINTER ON
  435.      JMP     PRINT_20           ;CONTINUE
  436. PRINT_10:
  437.      MOV     AL,0FFH           ;TURN THE PRINTER OFF
  438. PRINT_20:
  439.      MOV     P_STAT,AL           ;SET PRINTER STATUS
  440.      JMP     CO_MENU           ;START AT THE TOP
  441. PRINT     ENDP
  442. ; *********************************************************************
  443. ; *                                      *
  444. ; *              CONTROLLER DIAGNOSTIC               *
  445. ; *                                      *
  446. ; *********************************************************************
  447. CTLR_DIAG PROC
  448.      PUSHALL
  449.      MOV     CX,5               ;MAX RETRY
  450. CTLR_DIAG_00:
  451.      MOV     HD_CMD,RS_CMD           ;RESET COMMAND
  452.      CALL     EXEC_XCMD           ;EXECUTE IT
  453.      MOV     HD_CMD,RS_CMD           ;RESET COMMAND
  454.      CALL     EXEC_XCMD           ;EXECUTE IT
  455.      JNC     CTLR_DIAG_05           ;SUCESSFULL
  456.      LOOP     CTLR_DIAG_00           ;TRY IT AGAIN
  457.      JMP     CTLR_DIAG_ERR           ;FAILED
  458. CTLR_DIAG_05:
  459.      MOV     CX,5               ;MAX RETRY
  460. CTLR_DIAG_10:
  461.      MOV     HD_CMD,CTLR_CMD       ;CTLR HD COMMAND
  462.      CALL     EXEC_XCMD           ;EXECUTE IT
  463.      JNC     CTLR_DIAG_15           ;SUCESSFULL
  464.      LOOP     CTLR_DIAG_10           ;TRY IT AGAIN
  465.      JMP     CTLR_DIAG_ERR           ;FAILED
  466. CTLR_DIAG_15:
  467.      MOV     CX,5               ;MAX RETRY
  468. CTLR_DIAG_20:
  469.      MOV     HD_CMD,RS_CMD           ;RESET COMMAND
  470.      CALL     EXEC_XCMD           ;EXECUTE IT
  471.      MOV     HD_CMD,RS_CMD           ;RESET COMMAND
  472.      CALL     EXEC_XCMD           ;EXECUTE IT
  473.      JNC     CTLR_DIAG_25           ;SUCESSFULL
  474.      LOOP     CTLR_DIAG_20           ;TRY IT AGAIN
  475.      JMP     CTLR_DIAG_ERR           ;FAILED
  476. CTLR_DIAG_25:
  477.      MOV     CX,5               ;MAX RETRY
  478. CTLR_DIAG_30:
  479.      MOV     HD_CMD,WRP_CMD        ;WRITE THE
  480.      CALL     EXEC_XCMD           ;  DRIVE PARMS
  481.      MOV     HD_CMD,RCAL_CMD       ;RECALIBRATE COMMAND
  482.      CALL     EXEC_XCMD           ;EXECUTE IT
  483.      JNC     CTLR_DIAG_35           ;SUCESSFULL
  484.      LOOP     CTLR_DIAG_30           ;TRY IT AGAIN
  485.      JMP     CTLR_DIAG_ERR           ;FAILED
  486. CTLR_DIAG_35:
  487.      MOV     CX,1000           ;MAX RETRY
  488. CTLR_DIAG_40:
  489.      MOV     HD_CMD,TRDY_CMD       ;TEST DRIVE READY COMMAND
  490.      CALL     EXEC_XCMD           ;EXECUTE IT
  491.      JNC     CTLR_DIAG_60           ;SUCESSFULL
  492.      LOOP     CTLR_DIAG_40           ;TRY IT AGAIN
  493.      JMP     CTLR_DIAG_ERR           ;FAILED
  494. CTLR_DIAG_ERR:
  495.      WRITE     E08               ;DISPLAY ERROR MSG
  496.      STC                   ;FAILED
  497. CTLR_DIAG_60:
  498.      POPALL
  499.      RET                   ;RETURN
  500. CTLR_DIAG ENDP
  501. ; *********************************************************************
  502. ; *                                      *
  503. ; *            EXECUTE CONTROLLER COMMANDS              *
  504. ; *                                      *
  505. ; *********************************************************************
  506. EXEC_XCMD PROC
  507.      PUSHALL
  508.      MOV     AH,HD_CMD           ;FETCH COMMAND
  509.      MOV     AL,01               ;NUMBER OF SECTORS
  510.      MOV     CX,0001H           ;CURRENT CYLINDER
  511.      MOV     DH,00H            ;SET HEAD
  512.      MOV     DL,DR               ;DRIVE
  513.      OR     DL,80H            ;  NUMBER
  514.      INT     13H               ;ISSUE THE COMMAND
  515.      POPALL
  516.      RET                   ;RETURN
  517. EXEC_XCMD ENDP
  518. ; *********************************************************************
  519. ; *                                      *
  520. ; *              EXECUTE THE COMMAND                  *
  521. ; *                                      *
  522. ; *********************************************************************
  523. EXEC_CMD PROC
  524.      PUSHALL
  525.      MOV     AH,HD_CMD           ;FETCH COMMAND
  526.      MOV     AL,NUM_SEC           ;NUMBER OF SECTORS
  527.      MOV     DX,CUR_CYL           ;CURRENT CYLINDER
  528.      XCHG     DH,DL               ;ADJUST IT
  529.      MOV     CX,6               ;SHIFT COUNT
  530.      SHL     DL,CL               ;ADJUST CYL HIGH
  531.      OR     DL,CUR_SEC           ;SET SECTOR NUMBER
  532.      MOV     CX,DX               ;CX SET
  533.      MOV     DH,CUR_HD           ;SET HEAD
  534.      MOV     DL,DR               ;DRIVE
  535.      OR     DL,80H            ;  NUMBER
  536.      INT     13H               ;EXECUTE THE COMMAND
  537.      JNC     EXEC_100           ;SUCESSFULL
  538.      CMP     AH,BSEC_ER           ;BAD SECTOR FLAG??
  539.      JNE     EXEC_00           ;NO
  540. EXEC_0:
  541.      PUSH     AX               ;SAVE AX
  542.      INC     BAD_SEC           ;UPDATE COUNT
  543.      EMSG     7               ;DISPLAY MSG
  544.      MOV     ERR_CODE,BSEC_ER      ;LET CALLER KNOW
  545.      INC     ERR_CNT           ;UPDATE ERROR COUNT
  546.      POP     AX               ;RESTORE AX
  547.      STC                   ;SET CARRY
  548.      JMP     EXEC_20           ;EXIT
  549. EXEC_00:
  550.      CMP     AH,BTRK_ER           ;BAD TRACK FLAG??
  551.      JE     EXEC_0            ;YES
  552.      CMP     HD_CMD,CTLR_CMD       ;CTLR HD??
  553.      JNE     EXEC_10           ;NO
  554.      MOV     DX,HD_P1           ;READ ERROR
  555.      IN     AL,DX               ;  PORT
  556.      OR     AL,80H            ;FOR HD COMMAND
  557.      MOV     AH,AL               ;SAVE ERR
  558. EXEC_10:
  559.      MOV     AL,AH               ;ERROR CODE
  560.      CMP     FUNC,ECC_F           ;ECC TEST??
  561.      JNE     EXEC_15           ;NO
  562.      CMP     AL,11H            ;CORECTED DATA??
  563.      JE     EXEC_100           ;YES
  564. EXEC_15:
  565.      PUSH     AX               ;SAVE AX
  566.      CALL     DECODE_ERR           ;FIND AND DISPLAY ERR MSG
  567.      POP     AX               ;RESTORE ERROR CODE
  568.      CMP     AL,CTLR_ER           ;CONTROLLER ERROR??
  569.      JNE     EXEC_18           ;NO
  570.      CALL     CTLR_DIAG           ;EXEC CTLR HD
  571.      JNC     EXEC_18           ;SUCESSFULL
  572.      MOV     AL,0FFH           ;CTLR NOT WORKING
  573.      JMP     EXEC_20           ;AND EXIT
  574. EXEC_18:
  575.      MOV     AL,ERR_CODE           ;RESTORE ERROR CODE
  576. EXEC_20:
  577.      STC                   ;INDICATE ERROR
  578.      POPALL
  579.      RET                   ;RETURN
  580. EXEC_100:
  581.      CLC                   ;CLEAR CARY
  582.      POPALL
  583.      RET                   ;RETURN
  584. EXEC_CMD ENDP
  585. ; *********************************************************************
  586. ; *                                      *
  587. ; *               DECODE THE ERROR                  *
  588. ; *                AL = ERROR CODE                  *
  589. ; *                                      *
  590. ; *********************************************************************
  591. DECODE_ERR PROC
  592.      PUSHALL
  593.      XOR     AH,AH               ;CLEAR AH
  594.      LEA     SI,ERR_TBL           ;ERROR CODE TABLE
  595.      ADD     SI,AX               ;INDEX
  596.      MOV     AL,[SI]           ;FETCH TRANSLATED ERROR CODE
  597.      MOV     ERR_CODE,AL           ;SAVE ERROR CODE
  598.      CMP     HD_CMD,02H           ;CYL VALID??
  599.      JB     DECODE_10           ;NO
  600.      CMP     HD_CMD,08H           ;CYL VALID??
  601.      JB     DECODE_20           ;YES
  602.      CMP     HD_CMD,0AH           ;CYL VALID??
  603.      JB     DECODE_10           ;NO
  604.      CMP     HD_CMD,10H           ;CYL VALID??
  605.      JB     DECODE_20           ;YES
  606. DECODE_10:
  607.      PMSG     AL               ;DISPLAY THE MESSAGE
  608.      JMP     DECODE_30           ;CONTINUE
  609. DECODE_20:
  610.      EMSG     AL               ;DISPLAY THE MESSAGE
  611. DECODE_30:
  612.      INC     ERR_CNT           ;ADD 1 TO ERROR COUNT
  613.      POPALL
  614.      RET                   ;RETURN
  615. DECODE_ERR ENDP
  616. ; *********************************************************************
  617. ; *                                      *
  618. ; *              FETCH THE DRIVE PARMS               *
  619. ; *                  DR = DRIVE NO.                  *
  620. ; *                                      *
  621. ; *********************************************************************
  622. READ_PARMS PROC
  623.      PUSHALL
  624.      MOV     AH,RDP_CMD           ;READ DRIVE PARMS
  625.      MOV     AL,1               ;ONE SECTOR
  626.      XOR     DX,DX               ;CLEAR DX
  627.      MOV     CX,1               ;CYL 0 SEC 1
  628.      MOV     DL,DR               ;DRIVE NUMBER
  629.      OR     DL,80H            ;HARD DISK REQUEST
  630.      INT     13H               ;FETCH THE DRIVE PARMS
  631.      MOV     MAX_HD,DH           ;SET MAX HEADS
  632.      MOV     DX,CX               ;SAVE CX
  633.      MOV     CX,6               ;SHIFT COUNT
  634.      SHR     DL,CL               ;ADJUST CYL HIGH
  635.      XCHG     DH,DL               ;ADJUST IT
  636.      INC     DX               ;RETRIVE THE HD CYLINDER
  637.      MOV     MAX_CYL,DX           ;SAVE IT
  638.      POPALL
  639.      RET                   ;RETURN
  640. READ_PARMS ENDP
  641. ; *********************************************************************
  642. ; *                                      *
  643. ; *                  NEXT SECTOR                  *
  644. ; *                                      *
  645. ; *********************************************************************
  646. NEXT_SEC PROC
  647.      MOV     AL,CUR_SEC           ;FETCH CURRENT SECTOR
  648.      INC     AL               ;NEXT SECTOR
  649.      CMP     AL,MAX_SEC           ;NEXT TRACK??
  650.      JBE     NEXT_S10           ;NO
  651.      CALL     NEXT_TRK           ;NEXT TRACK
  652.      JC     NEXT_S20           ;ALL DONE
  653.      MOV     AL,1               ;FIRST SECTOR
  654. NEXT_S10:
  655.      MOV     CUR_SEC,AL           ;SET CURRENT SECTOR
  656.      CLC                   ;CLEAR CARRY
  657. NEXT_S20:
  658.      RET                   ;AND RETURN
  659. NEXT_SEC ENDP
  660. ; *********************************************************************
  661. ; *                                      *
  662. ; *                  NEXT TRACK                  *
  663. ; *                                      *
  664. ; *********************************************************************
  665. NEXT_TRK PROC
  666.      MOV     AL,CUR_HD           ;FETCH CURRENT HEAD
  667.      INC     AL               ;NEXT HEAD
  668.      CMP     AL,MAX_HD           ;NEXT CYLINDER??
  669.      JBE     NEXT_T10           ;NO
  670.      CALL     NEXT_CYL           ;NEXT CYLINDER
  671.      JC     NEXT_T20           ;ALL DONE
  672.      XOR     AX,AX               ;HEAD 0
  673. NEXT_T10:
  674.      MOV     CUR_HD,AL           ;SET CURRENT HEAD
  675.      CLC                   ;CLEAR CARRY
  676. NEXT_T20:
  677.      RET                   ;AND RETURN
  678. NEXT_TRK ENDP
  679. ; *********************************************************************
  680. ; *                                      *
  681. ; *                  NEXT CYLINDER                  *
  682. ; *                                      *
  683. ; *********************************************************************
  684. NEXT_CYL PROC
  685.      MOV     AX,CUR_CYL           ;FETCH CURRENT CYLINDER
  686.      INC     AX               ;NEXT CYLINDER
  687.      CMP     AX,MAX_CYL           ;ALL DONE??
  688.      JBE     NEXT_C10           ;NO
  689.      STC                   ;INDICATE ALL DONE
  690.      RET                   ;AND RETURN
  691. NEXT_C10:
  692.      MOV     CUR_CYL,AX           ;SET CURRENT CYLINDER
  693.      CLC                   ;CLEAR CARRY
  694.      RET                   ;AND RETURN
  695. NEXT_CYL ENDP
  696. ; *********************************************************************
  697. ; *                                      *
  698. ; *              CONVERT TO ASCII                  *
  699. ; *              AX = INPUT                      *
  700. ; *              BX = OUTPUT ENTRY                  *
  701. ; *                                      *
  702. ; *********************************************************************
  703. CONV_ASCII PROC
  704.      PUSHALL
  705.      PUSH     AX               ;SAVE AX
  706.      XOR     CX,CX               ;CLEAR CX
  707.      LEA     DI,[BX].S_DATA        ;DATA FIELD
  708.      MOV     CL,[BX].S_LEN           ;LENGTH
  709.      MOV     AL,' '                ;PAD CHARACTER
  710.      CLD                   ;FORWARD DIRECTION
  711.      REP     STOSB               ;CLEAR THE FIELD
  712.      MOV     SI,10               ;DIVISOR
  713.      LEA     DI,[BX].S_DATA        ;POINT TO
  714.      MOV     CL,[BX].S_LEN           ;  END OF
  715.      ADD     DI,CX               ;  THE DATA AREA
  716.      DEC     DI               ;LAST BYTE
  717.      POP     AX               ;RESTORE AX
  718. CONV_10:
  719.      XOR     DX,DX               ;CLEAR DX
  720.      DIV     SI               ;DIVIDE BY 10
  721.      OR     DL,30H            ;MAKE IT AN ASCII NUMBER
  722.      MOV     [DI],DL           ;AND SAVE IT
  723.      DEC     DI               ;NEXT BYTE
  724.      OR     AX,AX               ;LAST ONE??
  725.      JNZ     CONV_10           ;NO
  726.      POPALL
  727.      RET                   ;RETURN TO CALLER
  728. CONV_ASCII ENDP
  729. ; *********************************************************************
  730. ; *                                      *
  731. ; *               HIDE THE CURSOR                  *
  732. ; *                                      *
  733. ; *********************************************************************
  734. HIDE_CUR PROC
  735.      PUSH     BX               ;SAVE BX
  736.      PUSH     DX               ;SAVE DX
  737.      MOV     AH,2               ;SET CURSOR
  738.      MOV     DX,1951H           ;ROW 25 COL 81
  739.      XOR     BX,BX               ;PAGE 0
  740.      INT     10H               ;HIDE THE CURSOR
  741.      POP     DX               ;RESTORE DX
  742.      POP     BX               ;RESTORE BX
  743.      RET                   ;RETURN
  744. HIDE_CUR ENDP
  745. ; *********************************************************************
  746. ; *                                      *
  747. ; *               TRANSLATE THE KEY                  *
  748. ; *                                      *
  749. ; *********************************************************************
  750. TRANS_KEY PROC
  751.      PUSHALL
  752.      XOR     AH,AH               ;CLEAR AH
  753.      MOV     SI,AX               ;ESTABLISH INDEX
  754.      MOV     AL,EX_KEY[SI]           ;GET KEY CODE
  755.      CMP     AL,ESC_KEY           ;ESCAPE KEY??
  756.      JE     TRANS_EXIT           ;YES
  757.      CMP     AL,ENT_KEY           ;ENTER KEY??
  758.      JE     TRANS_EXIT           ;YES
  759.      CMP     AL,F1               ;FUNCTION KEY??
  760.      JB     TRANS_ERR           ;NO
  761.      CMP     AL,F10            ;FUNCTION KEY??
  762.      JBE     TRANS_EXIT           ;YES
  763.      CMP     AL,C_BRK           ;CONTROL BREAK??
  764.      JE     TRANS_EXIT           ;YES
  765.      CMP     AL,C_F1           ;CTRL_F1??
  766.      JE     TRANS_EXIT           ;YES
  767.      CMP     AL,A_F1           ;ALT-F1??
  768.      JE     TRANS_EXIT           ;YES
  769.      CMP     AL,A_F9           ;GOOD KEY??
  770.      JB     TRANS_ERR           ;NO
  771.      CMP     AL,A_F10           ;ALT-F10??
  772.      JBE     TRANS_EXIT           ;YES
  773. TRANS_ERR:
  774.      STC                   ;ERROR
  775.      JMP     TRANS_RSTREGS           ;EXIT
  776. TRANS_EXIT:
  777.      CLC                   ;SUCESSFULL
  778. TRANS_RSTREGS:
  779.      POPALL
  780.      RET                   ;AND RETURN
  781. TRANS_KEY ENDP
  782. ; *********************************************************************
  783. ; *                                      *
  784. ; *                SOUND THE MUSIC                  *
  785. ; *                                      *
  786. ; *********************************************************************
  787. BEEP     PROC
  788. BEEP_00:
  789.      PUSHALL
  790.      CLI                   ;DISABLE INTERRUPTS
  791.      IN     AL,61H            ;GET KEYBOARD/SPEAKER CTL DATA
  792.      PUSH     AX               ;AND SAVE IT
  793.      MOV     BX,300            ;DURATION OF TONE
  794. BEEP_05:
  795.      AND     AL,0FCH           ;TURN OFF TIMER GATE AND SPEAKER
  796.      OUT     61H,AL            ;WRITE NEW CTL DATA
  797.      MOV     CX,48H            ;HALF CYCLE TIME FOR TONE
  798. BEEP_10:
  799.      LOOP     BEEP_10           ;SPEAKER OFF
  800.      OR     AL,02H            ;TURN ON
  801.      OUT     61H,AL            ;  SPEAKER
  802.      MOV     CX,48H            ;HALF CYCLE TIME FOR TONE
  803. BEEP_20:
  804.      LOOP     BEEP_20           ;LET US HEAR THE MUSIC
  805.      DEC     BX               ;TIMES GROWING SHORTER
  806.      JNZ     BEEP_05           ;DO IT AGAIN
  807.      POP     AX               ;RESTORE AX
  808.      OUT     61H,AL            ;RESTORE KEYBOARD/SPEAKER CTL DATA
  809.      STI                   ;ENABLE INTERRUPTS
  810.      POPALL
  811.      RET                   ;AND RETURN
  812. BEEP     ENDP
  813. ; **********************************************************************
  814. ; *                                       *
  815. ; *                 DRAW BOX SUBROUTINE               *
  816. ; *                                       *
  817. ; **********************************************************************
  818. BOX_IT     PROC
  819.      PUSHALL
  820. ; **********************************************************************
  821. ; *              DISPLAY THE TOP LINE                   *
  822. ; **********************************************************************
  823.      MOV     BCHAR,ULEFT           ;LEFT CORNER
  824.      MOV     BH,BROW           ;ROW
  825.      MOV     BL,BCOL           ;COLUMN
  826.      MOV     CL,1               ;COUNT
  827.      CALL     WRITE_IT           ;WRITE UPPER LEFT CORNER
  828.      INC     BL               ;NEXT COLUMN
  829.      MOV     BCHAR,HORZ           ;HORZT CHAR
  830.      MOV     CL,BWIDTH           ;WIDTH
  831.      SUB     CL,2               ;ADJUST IT
  832.      JNZ     BOX_00            ;CONTINUE
  833.      MOV     CL,1               ;SET COUNT TO 1
  834.      MOV     BCHAR,URIGHT           ;UPPER RIGHT CORNER
  835.      CALL     WRITE_IT           ;DISPLAY IT
  836.      JMP     BOX_10            ;CONTINUE
  837. BOX_00:
  838.      CALL     WRITE_IT           ;DISPLAY IT
  839.      ADD     BL,BWIDTH           ;POINT TO
  840.      SUB     BL,2               ; UPPER RIGHT CORNER
  841.      MOV     BCHAR,URIGHT           ;UPPER RIGHT CORNER
  842.      MOV     CL,1               ;LENGTH
  843.      CALL     WRITE_IT           ;DISPLAY IT
  844. ; **********************************************************************
  845. ; *               DISPLAY THE VERTICAL LINES               *
  846. ; **********************************************************************
  847. BOX_10:
  848.      XOR     CX,CX               ;CLEAR CX
  849.      MOV     CL,BHEIGHT           ;VERTICAL HEIGHT
  850.      SUB     CL,2               ;ALLOW FOR TOP + BOTTOM
  851.      JZ     BOX_30            ;NO VERTICAL LINES
  852.      MOV     BCHAR,VERT           ;VERTICAL LINE
  853. BOX_20:
  854.      PUSH     CX               ;SAVE CX
  855.      INC     BH               ;NEXT ROW
  856.      MOV     BL,BCOL           ;COLUMN
  857.      MOV     CL,1               ;LENGTH
  858.      CALL     WRITE_IT           ;WRITE LEFT VERTICAL LINE
  859.      ADD     BL,BWIDTH           ;LEFT
  860.      DEC     BL               ;  LINE
  861.      CALL     WRITE_IT           ;WRITE IT
  862.      POP     CX               ;RESTORE CX
  863.      LOOP     BOX_20            ;NEXT VERTICAL LINE
  864. ; **********************************************************************
  865. ; *              DISPLAY THE BOTTOM LINE               *
  866. ; **********************************************************************
  867. BOX_30:
  868.      MOV     BCHAR,LLEFT           ;LOWER LEFT CORNER
  869.      INC     BH               ;NEXT ROW
  870.      MOV     BL,BCOL           ;COLUMN
  871.      MOV     CL,1               ;COUNT
  872.      CALL     WRITE_IT           ;WRITE UPPER LEFT CORNER
  873.      INC     BL               ;NEXT COLUMN
  874.      MOV     BCHAR,HORZ           ;HORZT CHAR
  875.      MOV     CL,BWIDTH           ;WIDTH
  876.      SUB     CL,2               ;ADJUST IT
  877.      JNZ     BOX_40            ;CONTINUE
  878.      MOV     CL,1               ;SET COUNT TO 1
  879.      MOV     BCHAR,LRIGHT           ;LOWER RIGHT CORNER
  880.      CALL     WRITE_IT           ;DISPLAY IT
  881.      JMP     BOX_50            ;CONTINUE
  882. BOX_40:
  883.      CALL     WRITE_IT           ;DISPLAY IT
  884.      ADD     BL,BWIDTH           ;POINT TO
  885.      SUB     BL,2               ; LOWER RIGHT CORNER
  886.      MOV     BCHAR,LRIGHT           ;LOWER RIGHT CORNER
  887.      MOV     CL,1               ;LENGTH
  888.      CALL     WRITE_IT           ;DISPLAY IT
  889. BOX_50:
  890.      POPALL
  891.      RET                   ;RETURN
  892. BOX_IT     ENDP
  893. WRITE_IT PROC
  894.      PUSHALL
  895.      WRITEC  BCHAR,BATTR,BH,BL,CL
  896.      POPALL
  897.      RET                   ;RETURN
  898. WRITE_IT ENDP
  899. ; **********************************************************************
  900. ; *                                       *
  901. ; *                 FORMAT THE SCREEN                   *
  902. ; *                                       *
  903. ; **********************************************************************
  904. WRITE_CMSG PROC
  905.      PUSHALL
  906.      CLS     LO,0,0,24,79           ;CLEAR THE SCREEN
  907.      BOX     0,0,25,80,LO           ;OUTLINE
  908.      BOX     0,0,4,80,LO           ; THE
  909.      WRITEC  0CCH,LO,3,0,1           ;  SCREEN
  910.      WRITEC  0B9H,LO,3,79,1
  911.      WRITE X1               ;WRITE THE COPY WRIGHT MESSAGE
  912.      CMP     P_STAT,00H           ;PRINTER ON??
  913.      JNE     WRITE_CMSG_00           ;NO
  914.      WRITE     P00               ;MSG
  915.      WRITEC  011H,RV,3,32,1        ;LEFT ARROW
  916.      WRITEC  010H,RV,3,43,1        ;RIGHT ARROW
  917.      JMP     WRITE_CMSG_10           ;EXIT
  918. WRITE_CMSG_00:
  919.      WRITE     P01               ;MSG
  920.      WRITEC  011H,RV,3,32,1        ;LEFT ARROW
  921.      WRITEC  010H,RV,3,44,1        ;RIGHT ARROW
  922. WRITE_CMSG_10:
  923.      POPALL
  924.      RET                   ;RETURN
  925. WRITE_CMSG ENDP
  926. CSEG     ENDS
  927.      END     HDMAIN
  928.