home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / S / ZEN2.LBR / Z217DRVR.LIB < prev    next >
Text File  |  2000-06-30  |  11KB  |  592 lines

  1. ;***    Z217 DEVICE DRIVER
  2. ;
  3. ;    * * * N O T E * * *
  4. ;
  5. ;    THIS DRIVE ASSUMES A CELL SIZE OF 512 BYTES WITH 18 SECTORS PER TRACK.
  6. ;
  7. ;    ONLY UNIT 0 IS HANDLED.
  8. ;
  9. ;    ALTHOUGH THE CONTROLLER PROVIDES FOR 21 BIT LOGICAL SECTOR NUMBERS,
  10. ;    THIS DRIVER ONLY HANDLES 16 BIT LOGICAL SECTOR NUMBERS.  THEREFORE,
  11. ;    THE MAXIMUM SIZE OF DISK IS 65536 SECTORS (0-FFFFH).
  12. ;
  13.  
  14. ;**    DRIVER ENTRY JUMP VECTORS
  15. ;
  16.  
  17. DRVR217:
  18.     JMP    SEL217            ;SELECT
  19.     JMP    RDT217            ;READ TRACK
  20.     JMP    WRT217            ;WRITE TRACK
  21.     JMP    MNT217            ;MOUNT
  22.     JMP    FMT217            ;FORMAT
  23.     JMP    WPC217            ;WRITE PROTECT CHECK
  24.  
  25.  
  26.  
  27.  
  28. ;**    INITIALIZE DRIVE TABLES
  29. ;
  30. ;    ENTRY:    NONE
  31. ;    EXIT:    NONE
  32. ;    USES:    ALL
  33. ;
  34.  
  35. IN217:
  36.  
  37. ;    FILL IN COMMAND BLOCK
  38.  
  39.     LEA    DI,Z217BLK        ;ADDRESS OF NEXT COMMAND
  40.     CALL    TMA217
  41.     MOV    AL,Z217BLK+OFFSET WI01HT
  42.     MOV    Z217BLK+OFFSET WI01HN,AL
  43.     MOV    AL,Z217BLK+OFFSET WI01MT
  44.     MOV    Z217BLK+OFFSET WI01MN,AL
  45.     MOV    AL,Z217BLK+OFFSET WI01LT
  46.     MOV    Z217BLK+OFFSET WI01LN,AL
  47.  
  48. ;    CHECK IF CONTROLLER IS PRESENT
  49.  
  50.     LEA    DI,Z217BLK        ;ATTEMPT TO ISSUE SETUP COMMAND
  51.     CALL    SUP217
  52.     JC    IN2174            ; BR IF ERROR
  53.  
  54. ;    READ SBC AND SET DRIVE PARAMETERS
  55.  
  56.     LEA    DI,BUFFER        ;GET BUFFER ADDRESS
  57.     CALL    TMA217
  58.     CALL    WAIT2171        ;EXECUTE READ COMMAND
  59.     TEST    AL,WISERR        ;Q. ERROR
  60.     JNZ    IN2174            ; BR IF ERROR
  61.  
  62.     LEA    DI,BUFFER+OFFSET SBCSDP    ;ADDRESS OF SET DRIVE
  63.     CALL    SUP217            ; PARAMETERS COMMAND
  64.     JC    IN2174            ;  BR IF ERROR
  65.     CALL    WAIT2171        ;EXECUTE COMMAND
  66.     TEST    AL,WISERR        ;Q. ERROR
  67.     JNZ    IN2174            ; BR IF ERROR
  68.  
  69.     LEA    DI,Z217BLK        ;ADDRESS FOR REST OF DRIVER
  70.     CALL    SUP217
  71.     JNC    IN2175            ; BR IF NO ERROR
  72.  
  73. ;    MARK DRIVE AS IMAGINARY
  74.  
  75. IN2174:
  76.     MOV    CX,2            ;# OF Z217 DRIVES
  77.     LEA    BP,DPEBASE+DPEL*4    ;START ADDRESS OF Z217 DPE'S
  78.     ADD    BP,BBIOS
  79.  
  80. IN21741:
  81.     OR    DPEFLG2[BP],DPEIMG    ;FLAG DRIVE AS IMAGINARY
  82.     ADD    BP,DPEL            ;BUMP POINTER
  83.     LOOP    IN21741            ;LOOP AND MARK ALL DRIVES
  84.  
  85. ;    FILL IN DPE TABLES / DISK MAP TABLE
  86.  
  87. IN2175:
  88.     MOV    CH,2            ;# DRIVES
  89.     MOV    CL,0            ;STARTING UNIT #
  90.     MOV    DH,4            ;STARTING DRIVE MAP #
  91.     CALL    CBTFIL            ;DO FILL
  92.  
  93. ;    ASSIGN PARTITION IF BOOT UNIT
  94.  
  95.     PUSH    ES
  96.     MOV    ES,.MTRDSEG        ;GET ADDRESS OF MONITOR DATA AREA
  97.     CMP    ES: MTRBI,2        ;Q. Z217 BOOTED
  98.     POP    ES
  99.     JNE    IN2176            ; BR IF NOT
  100.  
  101.     LEA    BP,DPEBASE+4*DPEL    ;GET ADDRESS OF 1ST DPE FOR Z217
  102.     ADD    BP,BBIOS
  103.     OR    DPEFLAG[BP],DPEASGN    ;SHOW PARTITION ASSIGNED
  104.     MOV    AX,BBIOS-4
  105.     MOV    WORD PTR DPETRK[BP],AX    ;SET BEGINNING SECTOR OF PARTITION
  106.     MOV    AX,BBIOS-6
  107.     MOV    WORD PTR DPEUPB[BP],AX    ;SET LAST SECTOR # OF PARTITION
  108.  
  109. IN2176:
  110.     RET
  111.  
  112.  
  113.  
  114.  
  115. ;**    SELECT DRIVE FOR 1ST LOGIN
  116. ;
  117. ;    ENTRY:    'PHYDPE'=ADDRESS OF DPE FOR DRIVE
  118. ;        (BX)=POINTER TO BUFFER HEADER INFO
  119. ;    EXIT:    'PHYDPE'=STATUS
  120. ;            0=ERROR , OTHERWISE SAME AS ON ENTRY
  121. ;    USES:    NONE
  122. ;
  123.  
  124. SEL217:
  125.     OR    DSKOP,DSKOPS        ;INDICATE SELECT OP IN PROGRESS
  126.  
  127.     MOV    BUFTRK[BX],0        ;READ LABEL
  128.     CALL    SET217
  129.     MOV    DI,BUFBUF[BX]
  130.     CALL    RDS217
  131.     CMP    BUFERR[BX],0        ;Q. ERROR
  132.     JNZ    SET2179            ; BR IF YES
  133.  
  134.     MOV    SI,BUFBUF[BX]        ;CHECK CHECKSUM OF LABEL
  135.     ADD    SI,LABEL
  136.     CALL    CHKLAB
  137.     JNZ    SET2179            ; BR IF ERROR
  138.  
  139.     MOV    SI,BUFBUF[BX]        ;CHECK IF LABEL'S BEGINNING OF
  140.     MOV    DI,WORD PTR LABHTH+(OFFSET DPETRK)-(OFFSET DPEHTH) [SI]
  141.     CMP    DI,WORD PTR DPETRK[BP]    ;PARTITION SECTOR # MATCHES DRIVE TABLE
  142.     JNE    SET2179            ; BR IF NOT
  143.  
  144.     MOV    DI,WORD PTR LABHTH+(OFFSET DPEUPB)-(OFFSET DPEHTH) [SI]
  145.     CMP    DI,WORD PTR DPEUPB[BP]    ;CHECK IF LABEL'S LAST SECTOR # OF
  146.                     ; PARTITION MATCHES DRIVE TABLE
  147.     JNE    SET2179            ;  BR IF NOT
  148.  
  149.     MOV    AL,LABHTH+(OFFSET DPERPAB)-(OFFSET DPEHTH) [SI]
  150.     MOV    DPERPAB[BP],AL        ;CP/M RECORDS PER ALLOCATION BLOCK
  151.  
  152.     ADD    SI,OFFSET LABDPB    ;UPDATE DISK PARAMETER BLOCK VALUES
  153.     MOV    DI,DPEDPB[BP]
  154.     MOV    CX,DPBL
  155.     CLD
  156.     REP    MOVSB
  157.  
  158. SET2178:
  159.     AND    DSKOP,NOT DSKOPS    ;INDICATE SELECT OP COMPLETE
  160.     RET
  161.  
  162. SET2179:
  163.     MOV    PHYDPE,0        ;INDICATE ERROR
  164.     JMPS    SET2178
  165.  
  166.  
  167.  
  168.  
  169. ;**    READ TRACK
  170. ;
  171. ;    ENTRY:    (BX)=POINTER TO BUFFER HEADER INFO
  172. ;    EXIT:    'BUFERR[BX]=STATUS
  173. ;            0=NO ERROR , 1=ERROR
  174. ;    USES:    DI
  175. ;
  176.  
  177. RDT217:
  178.     CALL    SET217            ;SETUP
  179.     MOV    DI,BUFBUF[BX]        ;BUFFER ADDRESS
  180.  
  181. RDT2171:
  182.     CMP    PREREAD,0        ;Q. DOING PREREAD
  183.     JNE    RDT2172            ; BR IF YES
  184.     CMP    BUFERR[BX],0        ;Q. ABORT
  185.     JNE    RDT2173            ; BR IF YES
  186.  
  187. RDT2172:
  188.     CALL    RDS217            ;READ NEXT SECTOR
  189.  
  190. RDT2173:
  191.     ADD    DI,WICSZ        ;BUMP BUFFER POINTER
  192.     INC    PHYSEC            ;BUMP 'PHYSEC'
  193.     CMP    PHYSEC,WINSPT        ;Q. ALL SECTORS READ
  194.     JNE    RDT2171            ; BR IF NOT
  195.  
  196.     RET
  197.  
  198.  
  199.  
  200.  
  201. ;**    WRITE TRACK
  202. ;
  203. ;    ENTRY:    (BX)=POINTER TO BUFFER HEADER INFO
  204. ;    EXIT:    'BUFERR[BX]'=STATUS
  205. ;            0=NO ERROR , 1=ERROR
  206. ;    USES:    AX,SI,DI
  207. ;
  208.  
  209. WRT217:
  210.     CALL    SET217            ;SETUP
  211.     MOV    DI,BUFBUF[BX]        ;BUFFER ADDRESS
  212.  
  213. WRT2171:
  214.     MOV    SI,BUFSECF[BX]        ;CHECK IF PHYSICAL SECTOR IS DIRTY
  215.     ADD    SI,PHYSEC
  216.     TEST    BYTE PTR [SI],1
  217.     JZ    WRT2173            ; BR IF IT IS NOT
  218.  
  219.     MOV    BYTE PTR [SI],0        ;CLEAR DIRTY SECTOR FLAG
  220.     CMP    BUFERR[BX],0        ;Q. ABORT
  221.     JNE    WRT2173            ; BR IF YES
  222.     CALL    WRS217            ;WRITE SECTOR
  223.  
  224. WRT2173:
  225.     ADD    DI,WICSZ        ;BUMP BUFFER POINTER TO NEXT SECTOR
  226.     INC    PHYSEC            ;BUMP PHYSICAL SECTOR #
  227.     CMP    PHYSEC,WINSPT        ;Q. ALL TRACK WRITTEN
  228.     JNE    WRT2171            ; BR IF NOT
  229.  
  230.     RET
  231.  
  232.  
  233.  
  234.  
  235. ;**    MOUNT
  236. ;
  237. ;    ENTRY:    (BX)=POINTER TO BUFFER HEADER INFO
  238. ;    EXIT:    NONE
  239. ;    USES:    NONE
  240. ;
  241.  
  242. MNT217:
  243.     RET
  244.  
  245.  
  246.  
  247.  
  248. ;**    FORMAT TRACK
  249. ;
  250. ;    ENTRY:    NONE
  251. ;    EXIT:    NONE
  252. ;    USES:    NONE
  253. ;
  254.  
  255. FMT217:
  256.     RET
  257.  
  258.  
  259.  
  260.  
  261. ;**    WRITE PROTECT CHECK
  262. ;
  263. ;    ENTRY:    (BX)=ADDRESS OF BUFFER HEADER INFO
  264. ;    EXIT:    'BUFERR[BX]'=STATUS
  265. ;            0=R/W , 1=R/O
  266. ;    USES:    NONE
  267. ;
  268.  
  269. WPC217:
  270.     MOV    BUFERR[BX],0        ;ALWAYS R/W
  271.     RET
  272.  
  273.  
  274.  
  275.  
  276. ;*    READ SECTOR
  277. ;
  278. ;    ENTRY:    'PHYSEC'=PHYSICAL SECTOR #
  279. ;        'SEC217'=STARTING LOGICAL SECTOR # OF TRACK
  280. ;        (DI)=BUFFER POINTER
  281. ;    EXIT:    NONE
  282. ;    USES:    AL
  283. ;
  284.  
  285. RDS217:
  286.     OR    DSKOP,DSKOPR        ;INDICATE READ OP IN PROGRESS
  287.     MOV    HSTPTR,DI        ;SAVE BUFFER POINTER
  288.  
  289.     MOV    Z217BLK+OFFSET WI01OP,WIRDL    ;READ LOGICAL OP CODE
  290.     CALL    CLS217            ;CALCULATE LOGICAL SECTOR #
  291.     JC    RDS2172            ; BR IF ERROR
  292.     CALL    TMA217            ;CALCULATE DATA TMA ADDRESS
  293.  
  294.     CALL    WAIT217            ;DO I/O
  295.     TEST    AL,WISERR        ;Q. ERROR
  296.     JZ    RDS2173            ; BR IF NO ERROR
  297.  
  298. RDS2172:
  299.     CALL    ERR217            ;REPORT ERROR
  300.  
  301.     CMP    PREREAD,0        ;Q. IS THIS A PREREAD OPERATION
  302.     JNE    RDS2173            ; BR IF YES
  303.     CALL    ABTIGN            ;HANDLE ABORT/IGNORE
  304.  
  305. RDS2173:
  306.     MOV    DI,HSTPTR        ;RESTORE BUFFER POINTER
  307.     AND    DSKOP,NOT DSKOPR    ;INDICATE READ OP DONE
  308.     RET
  309.  
  310.  
  311.  
  312.  
  313. ;*    WRITE SECTOR
  314. ;
  315. ;    ENTRY:    'PHYSEC'=PHYSICAL SECTOR #
  316. ;        'SEC217'=STARTING LOGICAL SECTOR # OF TRACK
  317. ;        (DI)=BUFFER POINTER
  318. ;    EXIT:    NONE
  319. ;    USES:    AL
  320. ;
  321.  
  322. WRS217:
  323.     OR    DSKOP,DSKOPW        ;INDICATE WRITE OP IN PROGRESS
  324.     MOV    HSTPTR,DI        ;SAVE BUFFER POINTER
  325.  
  326.     MOV    Z217BLK+OFFSET WI01OP,WIWRL    ;WRITE LOGICAL OP CODE
  327.     CALL    CLS217            ;CALCULATE LOGICAL SECTOR #
  328.     JC    WRS2172            ; BR IF ERROR
  329.     CALL    TMA217            ;CALCULATE DATA TMA ADDRESS
  330.  
  331.     CALL    WAIT217            ;DO I/O
  332.     TEST    AL,WISERR        ;Q. ERROR
  333.     JZ    WRS2173            ; BR IF NO ERROR
  334.  
  335. WRS2172:
  336.     CALL    ERR217            ;REPORT ERROR
  337.  
  338.     CALL    ABTIGN            ;HANDLE ABORT/IGNORE
  339.  
  340. WRS2173:
  341.     MOV    DI,HSTPTR        ;RESTORE BUFFER POINTER
  342.     AND    DSKOP,NOT DSKOPW    ;INDICATE WRITE OP DONE
  343.     RET
  344.  
  345.  
  346.  
  347.  
  348. ;*    EXECUTE COMMAND AND WAIT FOR I/O COMPLETION
  349. ;
  350. ;    ENTRY:    'Z217BLK'=COMMAND BLOCK
  351. ;    EXIT:    (AL)=CONTROLLER HARDWARE STATUS
  352. ;    USES:    AL
  353. ;
  354.  
  355. WAIT217:
  356.     TEST    DPEFLAG[BP],DPEASGN    ;Q. PARTITION ASSIGNED
  357.     JNZ    WAIT2171        ; BR IF YES
  358.     TEST    DPEFLAG[BP],DPELSIO    ;Q. LOGICAL SECTOR I/O
  359.     JNZ    WAIT2171        ; BR IF YES
  360.  
  361.     MOV    AL,WISERR        ;INDICATE ERROR
  362.     MOV    Z217BLK+OFFSET WI01EEC,WIEPNA
  363.     RET
  364.  
  365. WAIT2171:
  366.     MOV    AL,WIEXEC        ;ISSUE EXECUTE COMMAND
  367.     OUT    WIPCMD,AL
  368.  
  369. WAIT2172:
  370.     IN    AL,WIPSTAT        ;WAIT FOR CONTROLLER TO BE DONE
  371.     TEST    AL,WISDONE
  372.     JZ    WAIT2172
  373.  
  374.     RET
  375.  
  376.  
  377.  
  378.  
  379. ;*    CALCULATE LOGICAL SECTOR # AND PLACE IN COMMAND BLOCK
  380. ;
  381. ;    ENTRY:    'PHYSEC'=PHYSICAL SECTOR # FOR TRACK
  382. ;        'PHYTRK'=LOGICAL SECTOR # OF 1ST SECTOR OF TRACK
  383. ;    EXIT:    'Z217BLK'=COMMAND BLOCK CONTAINS LOGICAL SECTOR #
  384. ;        'C' = 0 NO ERROR , 1=ERROR
  385. ;    USES:    AX
  386. ;
  387. ;    LOGICAL SECTOR # = 'PHYTRK' + 'PHYSEC'
  388. ;
  389.  
  390. CLS217:
  391.     MOV    AX,PHYTRK
  392.     ADD    AX,PHYSEC
  393.  
  394.     TEST    DPEFLAG[BP],DPELSIO    ;Q. LOGICAL SECTOR I/O
  395.     JNZ    CLS2171            ; BR IF YES
  396.  
  397.     CMP    AX,WORD PTR DPETRK[BP]    ;Q. SECTOR # WITHIN PARTITION
  398.     JB    CLS2172            ; BR IF NOT
  399.     CMP    AX,WORD PTR DPEUPB[BP]
  400.     JA    CLS2172            ;  BR IF NOT
  401.     CLC
  402.  
  403. CLS2171:
  404.     MOV    Z217BLK+OFFSET WI01LS,AL
  405.     MOV    Z217BLK+OFFSET WI01MS,AH
  406.     RET
  407.  
  408. CLS2172:
  409.     STC                ;INDICATE ERROR
  410.     MOV    Z217BLK+OFFSET WI01EEC,WIESNWP
  411.     MOV    Z217BLK+OFFSET WI01EMS,AH
  412.     MOV    Z217BLK+OFFSET WI01ELS,AL
  413.     RET
  414.  
  415.  
  416.  
  417.  
  418. ;*    CALCULATE DATA TMA ADDRESS
  419. ;
  420. ;    ENTRY:    (DS)=DATA SEGMENT
  421. ;        (DI)=DATA OFFSET
  422. ;    EXIT:    'Z217BLK'=COMMAND BLOCK CONTAINS DATA TMA ADDRESS
  423. ;    USES:    AX,DL
  424. ;
  425. ;    DATA TMA ADDRESS = (DS)*16 + (DI)
  426. ;
  427.  
  428. TMA217:
  429.     MOV    AX,DS
  430.     XOR    DL,DL
  431.  
  432.     SHL    AX,1
  433.     RCL    DL,1
  434.     SHL    AX,1
  435.     RCL    DL,1
  436.     SHL    AX,1
  437.     RCL    DL,1
  438.     SHL    AX,1
  439.     RCL    DL,1
  440.  
  441.     ADD    AX,DI
  442.     ADC    DL,0
  443.  
  444.     MOV    Z217BLK+OFFSET WI01HT,DL
  445.     MOV    Z217BLK+OFFSET WI01MT,AH
  446.     MOV    Z217BLK+OFFSET WI01LT,AL
  447.  
  448.     RET
  449.  
  450.  
  451.  
  452.  
  453. ;*    COMMON SETUP ROUTINE
  454. ;
  455. ;    ENTRY:    (BX)=ADDRESS OF BUFFER HEADER INFO
  456. ;    EXIT:    'PHYTRK'=LOGICAL SECTOR # OF 1ST SECTOR OF TRACK
  457. ;        'PHYSEC'=0
  458. ;    USES:    AX,DX
  459. ;
  460.  
  461. SET217:
  462.     MOV    BP,BUFDPE[BX]        ;GET ADDRESS OF DPE
  463.  
  464.     MOV    AX,BUFTRK[BX]        ;CALCULATE LOGICAL SECTOR #
  465.     MOV    DX,WINSPT        ; OF 1ST SECTOR ON TRACK
  466.     MUL    DX
  467.  
  468.     TEST    DPEFLAG[BP],DPELSIO    ;Q. LOGICAL SECTOR I/O
  469.     JNZ    SET2171            ; BR IF YES
  470.     ADD    AX,WORD PTR DPETRK[BP]    ;ADJUST FOR BEGINING OF PARTITION
  471.  
  472. SET2171:
  473.     MOV    PHYTRK,AX
  474.  
  475.     MOV    PHYSEC,0
  476.  
  477.     RET
  478.  
  479.  
  480.  
  481.  
  482. ;*    ISSUE SETUP COMMAND TO CONTROLLER
  483. ;
  484. ;    ENTRY:    (DI)=COMMAND BLOCK ADDRESS
  485. ;    EXIT:    PSW/C    0=OK , 1=ERROR
  486. ;    USES:    AX
  487. ;
  488.  
  489. SUP217:
  490.     CALL    TMA217            ;CONVERT ADDRESS TO 24 BITS
  491.  
  492.     MOV    AX,10*250        ;SET MAXIMUM TIME FOR ALL TO HAPPEN
  493.     CALL     NWDLY            ; TO 10 mS
  494.  
  495.     MOV    AL,WISETUP        ;ISSUE SETUP COMMAND
  496.     OUT    WIPCMD,AL
  497.  
  498. SUP2172:
  499.     CMP    TIMEFLG,0        ;Q. TIME UP
  500.     JNE    SUP2174            ; BR IF YES
  501.     IN    AL,WIPSTAT        ;INPUT HARDWARE STATUS
  502.     TEST    AL,WISBUSY        ;Q. CONTROLLER BUSY
  503.     JZ    SUP2172            ; BR IF NOT
  504.  
  505.     MOV    AL,Z217BLK+OFFSET WI01HT    ;SEND HIGH ADDRESS BYTE
  506.     OUT    WIPCMD,AL
  507.     MOV    AL,Z217BLK+OFFSET WI01MT    ;SEND MIDDLE ADDRESS BYTE
  508.     OUT    WIPCMD,AL
  509.     MOV    AL,Z217BLK+OFFSET WI01LT    ;SEND LOW ADDRESS BYTE
  510.     OUT    WIPCMD,AL
  511.  
  512. SUP2173:
  513.     CMP    TIMEFLG,0        ;Q. TIME UP
  514.     JNE    SUP2174            ; BR IF YES
  515.     IN    AL,WIPSTAT        ;INPUT HARDWARE STATUS
  516.     TEST    AL,WISBUSY        ;Q. STILL BUSY
  517.     JNZ    SUP2173            ; BR IF YES
  518.     TEST    AL,WISDONE        ;Q. I/O DONE
  519.     JZ    SUP2173            ; BR IF NOT DONE
  520.  
  521. ;
  522.     RET
  523.  
  524. ;
  525.  
  526. SUP2174:
  527.     STC                ;INDICATE ERROR
  528.     RET
  529.  
  530.  
  531.  
  532.  
  533. ;*    ERROR REPORTING
  534. ;
  535. ;    ENTRY:    'Z217BLK' CONTAINS ERROR INFORMATION
  536. ;    EXIT:    NONE
  537. ;    USES:    AL,CX,SI,DI
  538. ;
  539.  
  540. ERR217:
  541.     MOV    BUFERR[BX],1        ;INDICATE ERROR
  542.     MOV    AL,Z217BLK+OFFSET WI01EEC ;GET ERROR CODE
  543.  
  544.     TEST    DSKOP,DSKOPR+DSKOPW    ;IF DOING READ OR WRITE OPERATION
  545.     JZ    ERR2177
  546.     MOV    DI,BUFERRF[BX]        ; PLACE IN ERROR ARRAY
  547.     ADD    DI,PHYSEC
  548.     MOV    [DI],AL
  549.     JMPS    ERR2178
  550.  
  551. ERR2177:
  552.     CALL    ERRRPT            ;  OTHERWISE REPORT ERROR IMMEDIATELY
  553.  
  554. ERR2178:
  555.     TEST    DSKOP,DSKOPS        ;Q. DOING 1ST TIME SELECT
  556.     JNZ    ERR2179            ; BR IF YES
  557.     MOV    DI,BBIOS        ;COUNT HARD ERROR
  558.     INC    HECNT[DI]
  559.  
  560. ERR2179:
  561.     RET
  562.  
  563.  
  564.  
  565.  
  566.  
  567. ;*    LOCAL DATA AREA FOR DRIVER
  568.  
  569. WIX1    EQU    OFFSET $
  570.     DSEG
  571.     ORG    WIX1
  572.  
  573. Z217BLK    RB    0            ;COMMAND BLOCK
  574.     DB    WIRDL            ; OP CODE
  575.     DB    0            ; UNIT SELECT
  576.     DB    0,0            ; LOGICAL SECTOR #
  577.     DB    1            ; SECTOR COUNT
  578.     DB    0,0,0            ; TMA ADDRESS
  579.     DB    0,0,0            ; NEXT COMMAND ADDRESS
  580.     DB    0            ; FLAGS
  581.     DB    0,0,0,0            ; ERROR RETURN INFO
  582.     IF    (OFFSET $ - OFFSET Z217BLK) NE WI01BKL
  583. %:    Z217BLK IS NOT CORRECT LENGTH
  584.     ENDIF
  585.  
  586. ;
  587.  
  588. WIX2    EQU    OFFSET $
  589.     CSEG
  590.     ORG    WIX2
  591.  
  592.