; FROM: LEWIS MOSELEY, JR.      11/8/81
;
; TO:   CCS DISK CONTROLLER USERS
;
; SUBJECT: FIX FOR SPURIOUS SELECT ERROR PROBLEM
;
; Most users of the CCS Disk System (and the CCS Deblocking
; BIOS known as CCBIOS.ASM) have run into the problem of
; receiving spurious "BDOS ERROR ON A: SELECT" messages, when
; drive A: is a legitimate drive and should not give the error.
; After putting up with ths for a year or so, I decided to fix
; it.  Some experimemtation defined the problem a little more
; specifically:  the spurious SELECT error occurred when:
;   1.  a drive had been running a double-density disk, and
;   2.  a single-density disk was inserted, and
;   3.  a call to the BDOS RESET function was made.  (Note: RESETs
;       result in the error; REBOOTs do not.), and
;   4.  the drive was re-selected
;
; So, the response to the RESET command failed to recognize the
; change from double- to single-density.  The problem was traced
; to the IDRD subroutine, and the code was added to correct the
; problem.  The following IDRD subroutine should be inserted in
; place of the existing one:
;
;
IDRD5:  MVI     B,STEPI ;BUILD A STEP-IN COMMAND
       CALL    EOJA
IDRD:   LHLD    LUNIT
       MOV     A,H     ;GET THE CUNIT VALUE
       CMP     L       ;SEE IF SAME AS LUNIT
       RZ              ;RETURN IF SO
IDRD1:
;
;MODIFICATION LM6 OF 11/8/81, PART 1 (ADDITION TO EXISTING CODE)
;
;TRY EACH DENSITY TWICE BEFORE GIVING UP
;
       LXI     H,IDTRY
       MVI     M,3             ;TWO DENSITIES, TWICE EACH
                               ;(AND, YES, 3 IS CORRECT)
IDRD0:                          ;LOOP REENTRY POINT
;
;END LM6 MODS, PART 1
;
       MVI     C,80H   ;SET THE AUTO-WAIT BIT
       CALL    SETUP
       PUSH    H       ;SAVE POINTER
       LXI     H,HLWAIT  ;WAIT FOR HEADS TO SETTLE
IDRD3:  DCX     H
       MOV     A,H
       ORA     A
       JNZ     IDRD3
       LXI     H,IDSV  ;SET UP TO READ ADDRESS
       MVI     B,2     ;SET UP TO READ 6(8) BYTES OF DATA
       MVI     A,RDADD ;READ ADDRESS COMMAND
       DI
       CALL    RDAT
       POP     H       ;RESTORE POINTER
       JZ      IDRD2   ;JUMP IF GOOD READ
;
;MODIFICATION LM6, PART 2, OF 11/81  (REPLACES EXISTING CODE)
;
       LDA     IDTRY
       DCR     A               ;TRIED 4 TIMES YET?
       RM                      ;ERROR RETURN IF SO, Z-FLAG RESET
       STA     IDTRY           ;ELSE PUT BACK COUNTER
       MVI     A,40H
       XRA     M               ;TOGGLE DENSITY BIT (TO REG A)
       MOV     M,A             ;PUT IT BACK IN MEMORY
       JMP     IDRD0           ;AND TRY AGAIN
;
;END OF LM6, PART 2
;
IDRD2:  IN      DSCTR   ;GET THE TRACK NUMBER
       OUT     DTRCK   ;SET THE TRACK REGISTER
       CPI     2       ;INSURE NOT ON TRACK 0 OR 1
       JC      IDRD5   ;JUMP IF SO
       MOV     A,M     ;REGET SELBITS
       STA     LUNIT   ;UPDATE LAST USED UNIT
       STA     CUNIT
       INX     H       ;SET THE SECTOR SIZE
       LDA     IDSV+3
       MOV     M,A
       CMP     A       ;SET Z-FLAG FOR GOOD RETURN
       RET
;
;
;
;
;
; NOTE: IN THE DATA AREA AT THE END OF THE BIOS, ADD:
;
IDTRY:  DS      1               ;TRIES TO LOG IN DISK
;
       END OF MODS