* * * THIS ROUTINE IS CALLED PRIOR TO DRIVER OPERATIONS * TO SET UP THE DRIVER PARAMETERS RELATING TO UNIT AND * TRACK. * * SET CURRENT UNIT INTO RUNIT * SUNIT LDA TUNIT GET DESIRED UNIT CALL USET SET DESIRED DRIVE AND UNIT IN "A" STA RUNIT SAVE IT FOR THE DRIVER ROUTINES OUT COMPT SELECT THE DRIVE OUT ADRLO RESET HEAD UNLOAD TIMER CALL DRLOP SEE IF DRIVE IS READY * * TEST IF DIFFERENT UNIT...IF SO THEN WAIT FOR INDEX MARK * LDA TUNIT GET DESIRED UNIT ANI 7 IN CASE OF ERROR LXI H,CUNIT POINT TO LAST CURRENT UNIT CMP M COMPARE MOV M,A SAVE THIS AS CURRENT JZ SETUN * * NEW UNIT, WAIT FOR TWO INDEX MARKS * CALL IFIND WAIT FOR INDEX ON UNIT CHANGE MVI C,84 CALL DELAY GET OFF IT AND GO AROUND DISK ONCE * * GET CURRENT TRACK FOR THIS DRIVE * SETUN CALL SETU1 GET THIS TRACK STA CTRCK SET IT AS CURRENT RET * * * STORE "A" AS CURRENT TRACK AND RETURN WITH * TRACK TABLE VALUE IN "A". HL POINT TO VALUE * * SETU1 STA CTRCK SAVE IT LXI H,UNTAB POINT TO UNIT TABLE LDA CUNIT GET UNIT CPI 8 JNC SUNER SERIOUS - ILLEGAL UNIT ORA A CLEAR THE !"#$%"! CARRY BIT RAR . DIVIDE BY TWO TO GET DRIVE SPECIFICATION ADD L POINT TO PROPER ONE MOV L,A MOV A,M GET TRACK POINTER FROM IT RET * * * CALCULATE PHYSICAL DRIVE AND UNIT FROM NUMBER IN "A" * USET ANI 7 IN CASE OF ERROR AND CLEAR CARRY LXI B,0D030H LOWER AND UPPER UNIT RRC . PUT BIT ZERO IN CARRY RLC . RESTORE A JNC STDRV ODD UNIT IF NO CARRY MOV B,C SELECT EVEN UNIT (0,2,4) * STDRV ANI 6 STRIP OFF UNUSED LOWER BIT RLC . MOVE DRIVE SELECT TO PROPER POSITION CMA . DOUG'S DELIGHT ANI 0CH ONLY KEEP THE DRIVE SELECT ORA B ADD IN THE UNIT ORI 3 NO STEP OR DIRECTION RET * ****************** * * * * THIS ROUTINE CALCULATES THE TRANSFER SIZE FROM THE * HEADER INFORMATION AND SETS THE NUMBER OF SECTORS * INTO OHPRO. * * IF A "WRITE" TRANSFER IS LESS THAN 108 BYTES THE * PHYSICAL (AS OPPOSED TO LOGICAL) LENGTH IS INCREASED. * (HELPS THE POOR OLD CONTROLLER) * BLKLN LHLD TBCNT GET COUNT FROM TRANSFER DESCRIPTOR CALL AFCALC CALCULATE NUMBER OF SECTORS JZ BRON BRANCH IF EXACTLY A BLOCK SIZE * * FIND OUT IF REMAINDER IS => 108 * BREM MOV A,E CMA . COMPLEMENT "DE" MOV E,A MOV A,D CMA MOV D,A LONG DRAWN OUT PROCESS INX D TWO'S COMPLEMENT * DAD D PUT REMAINDER IN HL MOV A,H TEST HIGH BITS ORA A JNZ BRON HAS TO BE ENOUGH MOV A,L LOW PART COUNTS FOR THE TEST CPI 108 FUDGE IF NOT THIS BIG JC BMORE IF NOT GO TEST IF READ FIRST * * LOGICAL AND PHYSICAL ARE THE SAME THROUGH HERE * BRON LHLD TBCNT SHLD OHSIZ OUTGOING HEADER SIZE * BSECT SHLD DRLEN TRANSFER LENGTH FOR THE DRIVER LDA OHPRO OUTGOING HEADER PROTECTION WORD ANI 80H CLEAR PREVIOUS COUNT ORA C ADD IN THE SECTOR COUNT STA OHPRO PUT IT BACK RET * * * FUDGE THE TRANSFER LENGTH FOR WRITES....... * WE MUSN'T LEAVE THE SECTOR MARK HANGING!! * BMORE LDA DOPER GET THE OPERATION CPI WDATA IS IT A WRITE OPERATION? JNZ BRON READS DON'T NEED FUDGE LHLD TBCNT SHLD OHSIZ LOGICAL COUNT TO HEADER LXI D,108 ADD THE FUDGE FACTOR DAD D ADD EM UP JMP BSECT FILL EM IN * * ******************* * * * * READ VALID HEADER BUT STILL NOT DESIRED SECTOR * * * IF BDSK2 IS <> "FFFF" THEN PASS THE SECTOR COUNT OF * THE JUST READ HEADER TO THE GIVEN ADDRESS FOR A DELAY * OF (9ms * COUNT) BEFORE RETURN. (IT CAN DO USEFUL * WORK DURING THE DELAY) * * IF THE UNSUCCESFUL ATTEMPTS PASSES 18 THEN DISABLE THE * ADDRESS AND TRY FOR 25 MORE TIMES WITH THE INTERNAL * PROCESSING ROUTINE. * SCTER LDA DSECN GET ATTEMPT COUNT INR A STA DSECN CPI 25 JNC FMTER ERROR IF GREATER THAN 25 * * PROCESS THE SECTOR ATTEMPT * IF 0 SCTRP LXI H,-1 LHLD BDSK2 GET ADDRESS FLAG INX H MOV A,H ORA L JNZ SCTR0 BRANCH IF PRESENT ENDF SCTRP EQU $ * * WAIT FOR SREDY * WAITS IN STAPT GET CONTROLLER STATUS ANI SREDY JZ WAITS LOOP UNTIL SREADY GOES HI RET * * IF 0 * * THE ADDRESS IS SET, SEE IF WE SHOULD BRANCH * SCTR0 LDA DSECN CPI 19 JZ SCPT1 IF 19 THEN DISABLE IT LDA IHPRO GET READ IN SECTOR COUNT ANI 0FH MOV C,A LXI D,RETI1 JUST RETURN TO CALL+1 CALL INTS3 SECTOR ATTEMPT COUNT JMP WAITS * ENDF * * * ROUTINE ALLOWS INTERRUPT PROCESSING OF THE * SREDY FLAG * WAITI LXI D,WAINT CALL INTST JMP WAITS * * TEST FLAG FOR HANDLER * WAINT IN STAPT ANI SREDY JMP RETIN GOES TO WAITS IF OK * IF 0 * SCPT1 LXI H,-1 SHLD BDSK2 XRA A STA DSECN CLEAR THE COUNT AND GO ROUND AGAIN JMP WAITS ENDF * PAGE ****************** * * * * TEST IF DRIVE IS READY AND RETURN IF OK * DRLOP IN STAPT ANI DREDY RZ . FALL THROUGH IF DRIVE ISN'T READY * * * DRIVE NOT READY * * GIVE MESSAGE AND WAIT FOR DRIVE READY (CONTINUE * OPERATION OR CHARACTER FROM TERMINAL FOR ABORT.) * DRERR CALL DRER0 JZ DTABT IF TRAP RETURN IS ZERO THEN GO BACK TO ERRL1 OUT ADRLO KEEP THE HEADS DOWN IN STAPT JMP DRLOP GO UP AND TEST AGAIN * * DRER0 LHLD DSKRD SEE IF USER IS HANDLING ERROR MOV A,L ORA H JZ DRER1 REPORT TO SYSTEM CONSOLE PCHL . GO TO HL...USER RETURNS TO DRERR CALL * * DRER1 CALL OUST OUTPUT MESSAGE DB CR DB LF ASC "DRIVE NOT READY DW 0A0DH DB 0 CALL CONIN READ BYTE FROM CONSOLE ANI 7FH JZ USRES RETURN TO DOS IF CTRL-SHIFT-P RET * * * GO BACK THROUGH A LEVEL ONE ERROR TRAP * DTABT CALL RFCB1 CLEAR FRADD SO FCB WON'T BE RESTORED CALL ERRL1 DB ERRED DRIVE NOT READY ****************** * * * DISK ERROR PROCESSOR * FMTER CALL DEREP CAN'T FIND SECTOR DB ERCFS * BLKER CALL DEREP SIZE CONFLICT DB ERBSC * FIERR CALL DEREP FID CONFLICT DB ERFIC * SZCON CALL DEREP SECTOR CONFLICT DB ERSCC * TRYER CALL DEREP DTRIES DB ERCRC * ERTRK CALL DEREP DB ERCFT * LOKER CALL DEREP SYSTEM LOCKED DB ERLOK * ****************** * * * DISK ERROR REPORT ROUTINE * * CONTROL GOES TO ERRL0 EVENTUALLY * CALL WITH CALL+1 = ERROR # * DEREP CALL DREP PRINT ID, TRACK, ETC. LDA NOERR SEE IF READ-BACK-CHECK ORA A JZ ERRL0 NO, JUST GIVE ERROR CALL ERRL0 DB ERRBC READ-BACK CHECK FAILED * * * SUBROUTINE TO PRINT FILE ID, TRACK, IHFID, IHSIZ * AS A PREFIX TO AN ABORT MESSAGE * BUT,... SKIP IF ERROR IS USER TRAPPED * DREP LHLD FERR MOV A,H ORA L IS SOMEONE ELSE HANDLING THE ERROR? RNZ . YES, NOTHING TO DO CALL OUST SAY SOMETHING DB CR DB LF ASC "DSK:" DB 0 * CALL O16N PRINT # POINTED TO BY CALL+1, ALSO BLANK DW TFID CALL O16N DW TDAD TRACK AND SECTOR CALL O16N DW IHFID CALL O16N DW IHSIZ RET * ****************** * * * ERROR HANDLER FOR SYSTEM * * *** NOTE *** * * EOPR AND ERCD GET MODIFIED BY THE SYSTEM * ERRP9 CALL UTILTY DO THE ERROR TYPEOUT DB UXOP JMP SRE50 ERROR!!! EOPR DB -1 DOS OPERATION ERCD DB -1 ERROR CODE JMP SRE50 JUST IN CASE OF SCREWUPS * * *