home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol172 / disk3.asm < prev    next >
Encoding:
Assembly Source File  |  1984-05-30  |  10.6 KB  |  574 lines

  1. TITLE    'CPM+ DISK IO MODULE FOR XCOMP HARD DISK CONTROLLER'
  2. ;
  3. ;This is a self contained module to link in a Xcomp controler to CPM+. It
  4. ;is setup for a 10 Mg byte miniscribe at the moment
  5. ;
  6.  
  7. ;    John Monahan        (201) 783 1548
  8. ;
  9.     ; DEFINE LOGICAL VALUES:
  10. TRUE        EQU    -1
  11. FALSE        EQU    NOT TRUE
  12. ;
  13.     ; DETERMINE IF BANK SELECTING:
  14. BANKED        EQU    TRUE        ;FULL BLOWN VERSION
  15. ;
  16. ;
  17. BELL    EQU    07H
  18. CR    EQU    0DH
  19. LF    EQU    0AH
  20. MAXCYL    EQU    500            ;<---WILL ALLOW A MAX OF ONLY 8 MBYTES
  21. LZONE    EQU    656
  22. ;
  23. ;   DRIVE COMMANDS
  24. ;
  25. SKCMD    EQU    3        ;SEEK
  26. SKOUT    EQU    1        ;SEEK OUTWARD
  27. NOPC    EQU    40H        ;NO PRE-COMPENSATION
  28. LOWRT    EQU    80H        ;LOW WRITE CURRENT
  29. VSA    EQU    8        ;SEEK VERIFY START ADDRESS
  30. VCA    EQU    1BH        ;SEEK VERIFY COMMAND ADDRESS
  31. ;
  32. ;   DRIVE STATUS
  33. ;
  34. READY    EQU    1        ;DRIVE READY
  35. WRTFLT    EQU    2        ;WRITE FAULT
  36. TK00    EQU    4        ;TRACK ZERO
  37. RAWINDX    EQU    20H        ;RAW INDEX
  38. ;
  39. ;   CONTROLLER COMMANDS
  40. ;
  41. BANK0    EQU    0        ;BANK 0 SELECT
  42. BANK1    EQU    1        ;BANK 1 SELECT
  43. DBENB    EQU    2        ;DATA BUFFER ENABLE
  44. CBENB    EQU    4        ;COMPARE BUFFER ENABLE
  45. START    EQU    8        ;START COMMAND
  46. ;
  47. ;   DRIVE/CONTROLLER I/O
  48. ;
  49. CBASE    EQU    70H        ;BASE ADR OF THE CONTROLLER
  50. DRCSR    EQU    CBASE        ;DRIVE COMMAND/STATUS
  51. EXTCMD    EQU    CBASE+1        ;EXTENDED COMMNAND REGISTER
  52. LOSC    EQU    CBASE+2        ;SEEK COUNT, LSB
  53. HISC    EQU    CBASE+3        ;  * MSB
  54. CTCSR    EQU    CBASE+4        ;CONTROLLER COMMAND/STATUS
  55. CTBFR    EQU    CBASE+5        ;CONTROLLER BUFFER ADDRESS
  56. CTDP    EQU    CBASE+6        ;CONTROLLER DATA PORT
  57.  
  58.  
  59.     ; DEFINE PUBLIC LABELS:
  60.     PUBLIC    DPH0            ;DISK PARAMETER HEADERS
  61.  
  62.     ; DEFINE EXTERNAL LABELS:
  63.     EXTRN    @ADRV,@RDRV
  64.     EXTRN    @DMA,@TRK,@SECT
  65.     EXTRN    @CBNK
  66.     EXTRN    @DBNK            ;BANK FOR DMA OPERATION
  67.     EXTRN    @ERMDE            ;BDOS ERROR MODE
  68.     EXTRN    ?WBOOT            ;WARM BOOT VECTOR
  69.     EXTRN    ?PMSG            ;PRINT MESSAGE @<HL> UP TO 00, SAVES
  70.                     ; [BC] AND [DE]
  71.     EXTRN    ?PDERR            ;PRINT BIOS DISK ERROR HEADER
  72.     EXTRN    ?CONIN,?CONO        ;CONSOLE IN AND OUT
  73.     EXTRN    ?CONST            ;CONSOLE STATUS
  74.     EXTRN    ?BNKSL            ;SELECT PROCESSOR MEMORY BANK
  75.  
  76.     EXTRN    ?SMSG            ;MY ROUTINE TO SPEAK A MESSAGE
  77.                     ;YOU CAN REMOVE REFERENCES TO THIS
  78.  
  79.     ; INCLUDE CP/M 3.0 DISK DEFINITION MACROS:
  80.     MACLIB    CPM3
  81.  
  82.     ; INCLUDE Z-80 MACRO LIBRARY:
  83.     MACLIB    Z80
  84.  
  85.  
  86.     IF    BANKED
  87.     DSEG            ;PUT IN OP SYS BANK IF BANKING
  88.     ELSE
  89.     CSEG            ;ELSE KEEP IN COMMON MEMORY
  90.     ENDIF
  91.  
  92.     ; EXTENDED DISK PARAMETER HEADER FOR DRIVE 0:
  93.     DW    HDWRT        ;HARD DISK WRITE ROUTINE
  94.     DW    HDRD        ;HARD DISK READ ROUTINE
  95.     DW    HDLOGIN        ;HARD DISK LOGIN PROCEDURE
  96.     DW    HDINIT        ;HARD DISK DRIVE INITIALIZATION ROUTINE
  97.     DB    0        ;RELATIVE DRIVE 0 ON THIS CONTROLLER
  98.     DB    0        ;MEDIA TYPE:
  99.                 ;  HI BIT SET : DRIVE NEEDS RECALIBRATING
  100. DPH0:    DPH    0,HD$DPB,0,
  101.  
  102.     ; MAKE SURE DPB'S ARE IN COMMON MEMORY:
  103.     CSEG
  104.  
  105.     ; 256 BYTE SECTORS ON HARD DISK
  106. HD$DPB:    DPB    256,32,1000,2048,1024,2,8000H
  107.  
  108.     IF    BANKED
  109.     DSEG            ;CAN SET BACK TO BANKED SEGMENT IF BANKING
  110.     ENDIF
  111.  
  112.     ;;;;; HDINIT:
  113. HDINIT    RET            ;DO NOT INITILIZE HARD DISK YET
  114. ;
  115.     ;;;;; HDLOGIN
  116. ;------    INITILIZE THE XCOMP HARD DISK CONTROLLER (MUST DOWNLOAD MICROCODE) ---
  117. HDLOGIN:
  118.     CALL    XTKZ             ;RESTORE
  119.     JNZ    RESERR
  120.     LXI    H,SAYSIGNON
  121.     CALL    ?SMSG        ;SPEAK MESSAGE
  122.     XRA    A        ;RETURN WITH NO ERROR
  123.     RET
  124.  
  125. RESERR:    LXI    H,MSGH2        ;RESTORE FAILED
  126.     CALL    ?PMSG
  127.     ORI    1
  128.     RET
  129. ;
  130.     ;;;;; HDWRT
  131.     ; ROUTINE WRITES 1 SECTOR TO THE DISK:
  132. ;
  133. HDWRT:    XRA    A
  134.     STA    ERFLG
  135.     CALL    GETDMA        ;GET DMA ADR, SET POINTERS
  136.  
  137.     IF    BANKED
  138.     JMP    ADJBNNN
  139.  
  140.     CSEG
  141.  
  142. ADJBNNN:LDA    @CBNK
  143.     PUSH    PSW
  144.     LDA    @DBNK
  145.     CALL    ?BNKSL
  146.     OUTIR
  147.     POP    PSW
  148.     CALL    ?BNKSL
  149.     JMP    ADJDDD
  150.  
  151.     DSEG
  152.  
  153.     ELSE
  154.     OUTIR
  155.     ENDIF
  156.  
  157. ADJDDD:    CALL    XWRT
  158.     LDA    ERFLG
  159.     RET
  160.  
  161. XWRT:    LXI    H,WTBL        ;GET COMMAND TABLE
  162.     CALL    DORW        ;EXICUTE WR/RD COMMANDS
  163.     JMP    XR1
  164.  
  165.     ;;;;; HDRD
  166.     ; ROUTINE READS 1 PHYSICAL SECTOR FROM THE DRIVE:
  167. ;
  168. HDRD:    XRA    A
  169.     STA    ERFLG             ;CLEAR THE ERROR FLAG
  170.     CALL    XREAD             ;READ A BLOCK
  171.     CALL    GETDMA             ;GET DMA ADR, SET POINTERS
  172.  
  173.     IF    BANKED
  174.     JMP    ADJBNKS
  175.  
  176.     CSEG            ;MUST HAVE THE FOLLOWING CODE IN COMMON
  177.  
  178. ADJBNKS:LDA    @CBNK
  179.     PUSH     PSW
  180.     LDA    @DBNK        ;MUST HAVE THIS CODE IN COMMON
  181.     CALL    ?BNKSL        ;NOW DMA ADDRESS IS AT THE CORRECT BANK
  182.     IN    CTDP             ;PRIME DATA INPUT
  183.     NOP
  184.     INIR             ;BLOCK INPUT
  185.     POP    PSW
  186.     CALL    ?BNKSL
  187.     JMP    ADJDON
  188.  
  189.     DSEG
  190.  
  191.     ELSE
  192.     IN    CTDP             ;PRIME DATA INPUT
  193.     NOP
  194.     INIR             ;BLOCK INPUT
  195.     ENDIF
  196.  
  197. ADJDON:    LDA    ERFLG             ;ERROR FLAG
  198.     RET
  199. ;
  200. XREAD:    LXI    H,RTBL         ;SEEK SECTOR COMMAND TABLE IS SENT TO CONTROLLER
  201.     CALL    DORW         ;SEND IT
  202. XR1:    MVI    A,0
  203.     RZ             ;RIF READ/WRITE OK
  204.     INR    A
  205.     STA    ERFLG        ;SET ERROR FLAG
  206.     RET    
  207. ;
  208. DORW:    SHLD    CTA         ;SAVE CMD TBL ADR
  209.     CALL    XSEK         ;SEEK TO NEW TRACK (IF REQUIRED)
  210.     RNZ             ;RIF SEEK FAILED
  211.     CALL    XSEL         ;HEAD SELECT
  212.     LHLD    CTA
  213. ;
  214. DO0:    MOV    A,M
  215.     STA    RETRY        ;SET RETRY COUNT
  216.     INX    H
  217.     MOV    A,M
  218.     OUT    CTCSR         ;ENB CMP BFR
  219.     INX    H
  220.     MOV    A,M
  221.     OUT    CTBFR         ;SET CMP BFR ADR
  222.     INX    H
  223.     SHLD    CTA         ;SAVE CMD TBL ADR
  224. ;
  225.     LXI    H,RCA         ;REAL TK ADR
  226.     MVI    B,3
  227. DO1:    MOV    A,M         
  228.     OUT    CTDP         ;PUT HDR INFO INTO CMP BFR
  229.     INX    H
  230.     DCR    B
  231.     JNZ    DO1
  232.     LDA    @SECT
  233.     OUT    CTDP         ;SET SECT ADR FOR COMPARE
  234. ;
  235. DO2:    CALL    XRDY         ;DRIVE READY ?
  236.     RNZ             ;  RIF NO
  237.     LHLD    CTA          ;CMD TBL ADR
  238.     MOV    A,M         ;A = CNTL BANK
  239.     INX    H
  240.     MOV    B,A
  241.     OUT    CTCSR         ;SLCT CNTL BANK
  242.     MOV    A,M
  243.     OUT    CTBFR         ;SET START ADR
  244.     INX    H
  245.     MOV    A,B
  246.     ORI    START
  247.     OUT    CTCSR         ;START R/W CMD
  248. ;
  249. DO3:    CALL    WFD         ;WAIT FOR READ/WRITE TO FINISH
  250.     RC             ;ABORT IF TIMEOUT
  251.     ANA    M         ;TEST CTLR STATUS (0=OK)
  252.     MOV    B,A
  253.     IN    DRCSR         ;DRIVE STATUS
  254.     ANI    WRTFLT
  255.     CNZ    CLRDF        ;CIF CLEAR DRIVE FAULT
  256.     ORA    B         ;SET/CLEAR ERROR FLAG (0=OK)
  257.     RZ             ;RIF READ/WRITE OK
  258.     LXI    H,RETRY
  259.     DCR    M         ;DECR RETRY COUNT
  260.     JNZ    DO2         ;JIF RETRY READ/WRITE
  261. ;
  262. ;   SET ERROR FLAG
  263. ;
  264. SEF:    MVI    A,1         ;A = ERROR FLAG
  265.     ORA    A         ;SET 8080 FLAGS
  266.     RET             ;TAKE ERROR EXIT
  267. ;
  268. ;    ---WAIT FOR DONE---
  269. ;
  270. WFD:    PUSH    H
  271.     LXI    H,0        ;TIMEOUT DELAY COUNT
  272. ;
  273. WFD1:    IN    CTCSR         ;CTLR STATUS
  274.     RRC    
  275.     JC    WFD2         ;WAIT FOR DONE
  276.     DCX    H
  277.     MOV    A,H
  278.     ORA    L
  279.     JNZ    WFD1
  280. ;
  281.     OUT    CTCSR
  282.     POP    H
  283.     MVI    A,1
  284.     ORA    A
  285.     STC
  286.     RET
  287. ;
  288. WFD2:    POP    H
  289.     IN    CTCSR         ;GET NON-CHANGING STATUS
  290.     MOV    B,A    
  291.     XRA    A
  292.     OUT    CTCSR         ;STOP CTLR
  293.     MOV    A,B
  294.     RET    
  295. ;    
  296. ;   SETS THE CONTROLLER BUFFER ADDRESS TO THE CORRECT
  297. ;   STARTING POINT. ALSO SETS B=256 & H/L=@DMA
  298. ;
  299. GETDMA:    LHLD    @DMA
  300.     MVI    C,CTDP         ;FOR BLOCK I/O
  301.     MVI    B,0         ;B = COUNT (256 BYTES)
  302.     MVI    A,DBENB
  303.     OUT    CTCSR         ;ENB DATA BFR
  304.     MVI    A,0
  305. GET1:    OUT    CTBFR         ;SET CTLR DATA BFR ADR
  306.     RET    
  307. ;
  308. ;    ---REZERO---
  309. ;
  310. XTKZ:    LXI    H,0
  311.     SHLD    RCA
  312.     CALL    TZT        ;TEST IF TRK 0
  313.     RZ
  314. ;
  315.     LXI    H,511        ;#OF CYLINDERS WE CAN COUNT ON CONTROLLER
  316.     CALL    RTZ        ;SEEK OUT
  317.     RC            ;ABORT DRIVE NOT READY
  318.     RZ            ;IS AT 0
  319.     LXI    H,LZONE+10-511
  320.     CALL    RTZ        ;TRY SECOND PUMP
  321.     RC
  322.     RZ
  323.     JMP    SEF        ;ABORT RESTORE FAILED
  324. ;
  325. ;    SEEK OUTWARD
  326. ;
  327. RTZ:    CALL    XRDY
  328.     STC
  329.     RNZ
  330.     MOV    A,L
  331.     OUT    LOSC        ;SET LSB OF SEEK COUNT
  332.     MOV    A,H
  333.     OUT    HISC        ;SET MSB
  334.     MVI    A,SKOUT
  335.     OUT    EXTCMD        ;SET SEEK DIRECTION OUTWARD
  336.     MVI    A,SKCMD
  337.     OUT    DRCSR        ;ISSUE SEEK
  338.     CALL    WSC
  339.     RC
  340. ;
  341. TZT:    IN    DRCSR        ;GET DRIVE STATUS
  342.     ANI    TK00
  343.     XRI    TK00
  344.     RET
  345. ;
  346. ;
  347. ;    ---SEEK---
  348. ;
  349. XSEK:    MVI    A,3
  350.     STA    SKRTC         ;SET SEEK RETRY COUNT
  351. ;
  352. XSEK1:    LHLD    @TRK         ;REQUESTED TRACK
  353.     MVI    B,1
  354.     CALL    DRS         ;SHIFT H/L RIGHT ONCE 
  355.     LXI    D,MAXCYL
  356.     CALL    TSUB
  357.     RAL
  358.     JNC    SEF        ;ABORT IF INVALID ADDRESS
  359. XSEK2:    XCHG            ;[DE] = NEW CYLINDER ADDRESS
  360.     LHLD    RCA        ;LOAD UP CURRENT REAL ADR
  361.     XCHG
  362.     SHLD    RCA        ;SAVE NEW ADDRESS
  363.     XCHG
  364.     CALL    SUBT        ;GET DIFFERENCE
  365.     RZ            ;RETURN IF SAME
  366.     MVI    B,1        ;DIR = OUT
  367.     RAL
  368.     JNC    XSEK3        ;OK SEEK OUTWARD
  369. ;
  370.     MVI    B,3        ;SEEK INWARD
  371.     MOV    A,L
  372.     CMA            ;MAKE SEEK POSITIVE
  373.     MOV    L,A
  374.     MOV    A,H
  375.     CMA
  376.     MOV    H,A
  377.     INX    H
  378. ;
  379. XSEK3:    MOV    A,B        ;GO TO SEEKING INWARD
  380.     STA    SKDIR
  381.     LXI    D,512
  382.     CALL    TSUB
  383.     RAL
  384.     JNC    XSEK4        ;JIF DOUBLE PUMP IS REQ
  385.     CALL    PSK        ;DO PARTIAL SEEK
  386.     RNZ
  387.     JMP    XSEK5
  388. ;
  389. XSEK4:    DCX    D        ;[DE] =511
  390.     CALL    SUBT        ;[HL]-[DE]
  391.     SHLD    RSKNT        ;SAVE RESIDUAL COUNT
  392.     XCHG
  393.     CALL    PSK
  394.     RNZ            ;ABORT IF SEEK FAILED
  395.     LHLD    RSKNT
  396.     CALL    PSK        ;SEND THE REST
  397.     RNZ
  398. ;
  399. ;                ;SEEK VERIFY
  400. XSEK5:    MVI    A,3
  401.     STA    VSRTC        ;SET RETRY COUNT
  402.     MVI    A,CBENB
  403.     OUT    CTCSR        ;ENABLE BANK ZERO CMP BFR
  404.     MVI    A,VCA
  405.     OUT    CTBFR        ;SET CMP BFR ADR
  406.     LHLD    RCA        ;REAL (CURR) CYL ADR
  407.     MOV    A,L
  408.     OUT    CTDP        ;SET CYL ADR, LSB
  409.     MOV    A,H
  410.     OUT    CTDP        ;SET CYL ADR, MSB
  411. XSEK6:    MVI    A,VSA
  412.     OUT    CTBFR        ;SET M/CODE START ADR
  413.     MVI    A,START
  414.     OUT    CTCSR        ;START VERIFY
  415.     CALL    WFD        ;WAIT FOR DONE
  416.     ANI    0CH        ;TEST CTLR STATUS
  417.     RZ            ;RIF VERIFY OK
  418.     LXI    H,VSRTC
  419.     DCR    M        ;DECR RETRY COUNT
  420.     JNZ    XSEK6        ;JIF RETRY SEEK VERIFY
  421.                 ; VERIFY FAILED
  422.     CALL    XTKZ        ;RESTORE
  423.     LXI    H,SKRTC
  424.     DCR    M        ;DECR RETRY COUNT
  425.     JNZ    XSEK1        ;JIF RETRY SEEK
  426.                 ; UNRECOVERABLE SEEK ERROR
  427.     ORI    1        ;SET ERROR FLAG
  428.     RET            ;ABORT
  429. ;
  430. ;   PARTIAL SEEK
  431. ;
  432. PSK:    CALL    XRDY        ;DRIVE READY ?
  433.     RNZ            ;ABORT, DRIVE NOT RDY
  434.     MOV    A,L
  435.     OUT    LOSC        ;SET SEEK COUNT, LSB
  436.     MOV    A,H
  437.     OUT    HISC        ;   * MSB
  438.     LDA    SKDIR
  439.     OUT    EXTCMD        ;SET SEEK DIRECTION
  440.     MVI    A,3
  441.     OUT    DRCSR        ;ISSUE SEEK CMD
  442. ;
  443. ;     ---> FALL THRU TO 'WSC' <---
  444. ;
  445. ;    ---WAIT FOR SEEK COMPLETE---
  446. ;
  447. ;
  448. WSC:    PUSH    H        ;SAVE REGS
  449.     PUSH    B
  450.     LXI    H,0        ;TIME-OUT DELAY COUNT
  451.     MVI    B,6        ;XCOMP HAD 3 NEED 6 FOR 5MHz
  452. ;
  453. WSC1:    IN    DRCSR        ;DRIVE STATUS
  454.     RAL
  455.     JC    WSC2        ;JIF SEEK DONE
  456.     DCX    H        ;DECR DELAY COUNT
  457.     MOV    A,H
  458.     ORA    L
  459.     JNZ    WSC1        ;JIF CON'T WAITING
  460.     DCR    B
  461.     JNZ    WSC1
  462.                 ; TIME-OUT ERROR
  463.     POP    B        ;RESTORE REGS
  464.     POP    H
  465.     MVI    A,1
  466.     ORA    A        ;SET CPM ERROR FLAG
  467.     STC            ;SET INTERNAL ERROR FLAG
  468.     RET
  469. ;
  470. WSC2:    POP    B        ;RESTORE REGS
  471.     POP    H
  472.     XRA    A        ;SET FLAG = OK
  473.     RET
  474. ;
  475. ;
  476. ;
  477. ;    ---CLEAR DRIVE FAULT---
  478. ;
  479. CLRDF:    XRA    A
  480.     OUT    EXTCMD         ;DE-SELECT THE DRIVE (FALL THRU TO 'XSEL' TO
  481.                  ;RE-SELECT THE DRIVE)
  482. ;
  483. ;    ---HEAD SELECT---
  484. ;
  485. XSEL:    LDA    @TRK         ;REQUESTED TRACK
  486.     ANI    1         ;2 HEADS
  487.     STA    RHD         ;SAVE REAL HEAD #
  488.     ADD    A         ;SHIFT HEAD # LEFT TWICE FOR H/W
  489.     ADD    A
  490.     ORI    1         ;TO MAINTAIN DRIVE SLCT
  491.     OUT    EXTCMD         ;SELECT HEAD 0 OR 1
  492.     RET    
  493. ;
  494. ;    ---DRIVE READY TEST---
  495. ;
  496. XRDY:    IN    DRCSR         ;DRIVE STATUS
  497.     ANI    1         ;DRIVE RDY BIT
  498.     XRI    1         ;  MAKE IT LO-TRUE
  499.     RZ             ;RIF DRIVE READY
  500.     LXI    H,MSGH1         ;ERROR MSG
  501.     CALL    ?PMSG
  502.     ORI    1         ;SET ERROR FLAG
  503.     RET    
  504. ;
  505. ;
  506. ;   SHIFTS THE CONTENTS OF H/L RIGHT 'N' TIMES.
  507. ;
  508. DRS:    PUSH    PSW         ;SAVE 'A'
  509. DRS1:    MOV    A,H         ;MSB
  510.     ORA    A         ;CLEAR CY
  511.     RAR    
  512.     MOV    H,A
  513.     MOV    A,L         ;LSB
  514.     RAR    
  515.     MOV    L,A
  516.     DCR    B         ;B = SHIFT COUNT
  517.     JNZ    DRS1
  518.     POP    PSW         ;RESTORE 'A'
  519.     RET    
  520. ;
  521. SUBT:    MOV    A,L        ;16 BIT SUBTRACTION
  522.     SUB    E
  523.     MOV    L,A
  524.     MOV    A,H
  525.     SBB    D
  526.     MOV    H,A
  527.     ORA    L
  528.     MOV    A,H
  529.     RET
  530. ;
  531. TSUB:    PUSH    H        ;SAVE [HL]
  532.     CALL    SUBT
  533.     POP    H
  534.     RET
  535. ;
  536. ;------------------------- DATA STORAGE AREA -------------------------------
  537. ;
  538. ;    --- COMMAND TABLE TO SEEK SECTOR/TRACK ---
  539. ;
  540. ;
  541. WTBL:    DB    5         ;RETRY COUNT
  542.     DB    5         ;CMP BFR ENB
  543.     DB    0E6H         ;CMP BFR ADR
  544.     DB    BANK1         ;CNTL BANK
  545.     DB    0D3H         ;START ADR
  546.     DB    0EH         ;STATUS MASK
  547. ;
  548. RTBL:    DB    10         ;RETRY COUNT
  549.     DB    4         ;CMP BFR ENB
  550.     DB    0EAH         ;CMP BFR ADR
  551.     DB    BANK0         ;CNTL BANK
  552.     DB    0D7H         ;START ADDRESS
  553.     DB    0EH         ;STATUS MASK
  554. ;
  555. MSGH1:    DB    BELL,CR,LF,'Drive not Ready',0
  556. MSGH2:    DB    BELL,CR,LF,'Restore Failed',0
  557. SAYSIGNON: DB    'HHARD  DISK ON DRIVE AEE ',0
  558. ;
  559. RCA:    DS    2         ;REAL TRACK ADDRESS
  560. RHD:    DS    1         ;  HEAD
  561. RSA:    DS    1         ;  SECTOR
  562. ;
  563. RETRY:    DS    1         ;RETRY COUNT
  564. CTA:    DS    2         ;COMMAND TABLE ADDRESS
  565. ERFLG:    DS    1         ;ERROR FLAG
  566. SKRTC:    DS    1        ;SEEK RETRY COUNT
  567. VSRTC:    DS    1        ;SEEK VERIFY COUNT
  568. SKDIR:    DS    1        ;SEEK DIRECTION
  569. RSKNT:    DS    2        ;RESIDUAL SEEK COUNT
  570. SPARE:    DS    2
  571. ;
  572. ;
  573.  
  574.