************************************************************* * * * 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