*************************************************************
*                                                           *
* SETDRV SELECTS THE NEXT DRIVE TO BE USED IN READ/WRITE    *
* OPERATIONS. IF THE DRIVE HAS NEVER BEEN SELECTED BEFORE,  *
* A PARAMETER TABLE IS CREATED WHICH CORRECTLY DESCRIBES    *
* THE DISKETTE CURRENTLY IN THE DRIVE. DISKETTES CAN BE OF  *
* FOUR DIFFERENT SECTOR SIZES:                              *
*       1) 128 BYTES SINGLE DENSITY.                        *
*       2) 256 BYTES DOUBLE DENSITY.                        *
*       3) 512 BYTES DOUBLE DENSITY.                        *
*       4) 1024 BYTES DOUBLE DENSITY.                       *
*                                                           *
*************************************************************

SETDRV  MOV     A,C             ;SAVE THE DRIVE #
        STA     CPMDRV
        CPI     MAXDISK         ;CHECK FOR A VALID DRIVE #
        JNC     ZRET            ;ILLEGAL DRIVE #
        MOV     A,E             ;TEST IF DRIVE EVER LOGGED 
                                ;  IN BEFORE
        ANI     1
        JNZ     SETDRV1         ;BIT 0 OF E = 0 -> NEVER 
                                ;  SELECTED BEFORE
        MVI     A,1             ;SELECT SECTOR 1 OF TRACK 1
        STA     TRUESEC
        STA     CPMTRK
        CALL    FILL            ;FLUSH BUFFER AND REFILL
        JC      ZRET            ;TEST FOR ERROR RETURN
        CALL    DJSTAT          ;GET STATUS ON CURRENT DRIVE
        ANI     2CH             ;LOK AT SIDE AND DENSITY BITS
        MOV     E,A
        ANI     20H
        MOV     A,E
        JNZ     SETDR1
        ORI     10H
SETDR1: RAR
        PUSH    PSW             ;SAVE DJSTAT 1/2 SIDED INFO
        ANI     6
        LXI     H,XLTS          ;TABLE OF XLT ADDRESSES
        PUSH    H
        MOV     E,A
        MVI     D,0
        DAD     D
        PUSH    H               ;SAVE POINTER TO PROPER XLT
        CALL    GETDPB          ;GET DPH POINTER INTO DE
        XCHG                    ;
        POP     D
        MVI     B,2             ;NUMBER OF BYTES TO MOVE
        CALL    MOVLOP          ;MOVE THE ADDRESS OF XLT
        LXI     D,10            ;OFFSET TO DPB POINTER
        DAD     D               ;HL <- &DPH.DPB
        XCHG
        POP     H
        POP     PSW             ;OFFSET TO CORRECT DPB
        MOV     C,A
        MVI     B,0
        DAD     B               ;ADD TO TRANSLATE TABLE
                                ; TO POINT TO DENSITY
                                ; (THE DPB TABLE IS CLEVERLY 
                                ; LOCATED RIGHT AFTER THE
                                ; XLT TABLE)
        XCHG                    ;PUT DPB ADDRESS IN DPH
        MVI     B,2             ;MOVE DPB ADDRESS INTO DPH
        CALL    MOVLOP
SETDRV1 CALL    GETDPB          ;GET ADDRESS OF DPB IN HL
        LXI     B,17            ;OFFSET TO SECTOR SIZE
        DAD     B
        MOV     A,M             ;GET SECTOR SIZE
        ANI     7H
        STA     SECSIZ
        MOV     A,M
        RAR
        RAR
        RAR
        RAR
        ANI     0FH
        STA     SECPSEC
        XCHG                    ;HL <- DPH
        RET

ZRET    LXI     H,0             ;SELDRV ERROR EXIT
        RET

