* * * * <<<< LOADER DRIVER >>> * * * VER 3.1 WORK VERSION 3-12-77 * * * * * DRIVER ENTRY POINTS * * HDATR CALL LDATN CLEAR ERROR CONTROL FLAGS HDOVE CALL LHDVE SET UP TO READ HEADER HDATA CALL LHDAT READ THE NEXT HEADER * ANI 0CH CRC ERROR OR ABORT? JNZ LDATE PROCESS THE ERROR LXI H,LTBCNT TIME FUDGE IN STAPT ANI TRCOM BE SURE THE TRANSFER IS COMPLETE JZ LDATE PROCESS THE ERROR IN STAPT ANI 0CH ONE MORE ERROR TEST JNZ LSERR * * CHECK TRACK AND SECTOR * LDA LIHTRK GET READ TRACK CMP C BETTER BE THE SAME! JNZ LTKER LDA LIHSEC NOW THE SECTOR CMP B JNZ LNOSE TRY,TRY AGAIN * * TEST HEADER PARAMETERS * LDA LIHSIZ GET SPECIFIED SIZE CMP M IS IT THE SAME? JNZ ERR2 INX H LDA LIHSIZ+1 OTHER PORTION GETS TESTED NOW CMP M JNZ ERR2 * * BYTE COUNT IS OK NOW CHECK FILE ID * INX H LDA LIHFID CMP M JNZ ERR3 INX H LDA LIHFID+1 CMP M JNZ ERR3 * * WE EVEN CHECK THE SECTOR COUNT * LDA LOHPRO ANI 15 STRIP OFF HIGH BIT MOV B,A LDA LIHPRO GET READ IN VALUE ANI 15 CMP B JNZ ERR4 IF NOT THE SAME * * ALL SYSTEMS GO!!! 5,4,3....... * LHLD LTBUF SEND TRANSFER ADDRESS TO CONTROLLER MOV A,L OUT ADRLO MOV A,H OUT ADRHI LHLD DRLEN GET TRANSFER LENGTH MOV A,L OUT BYTLO SEND IT TO THE CONTROLLER MOV A,H OUT BYTHI LDA DOPER GET THE OPERATION OUT TRAPT GIVE THE COMMAND * * NOW WAIT FOR TRANSFER * LCCHK IN STAPT ANI 1FH CC, ABORT, SR OR TC? JZ LCCHK ANI 0CH ABORT OR CRC ERROR? JNZ LSERR * CALL LWAIT WAIT FOR SREADY IN STAPT SR,ABORT OR TC ANI 0CH ABORT OR CRC AGAIN RZ * * ERROR ROUTINES * LSERR MVI A,0FFH OUT TRAPT CANCEL LAST COMMAND LDATE CALL LERRP JMP HDOVE * * LTKER CALL LTERR PROCESS THE TRACK ERROR JMP HDOVE AND RETURN * LWAIT IN STAPT GET CONTROLLER STATUS ANI SREDY RNZ JMP LWAIT LOOP UNTIL SREADY GOES HIGH * * DATA ERROR FOUND...PROCESS COUNT * LERRP CALL LWAIT WAIT FOR SREDY LDA DTRIES CPI 5 CNC LERRN DONE FIVE.. GO SEEK INR A STA DTRIES RET * LERRN XRA A STA DTRIES RESTORE TRIES LDA DNERR ORA A JM LFIRS FIRST ONE DIRECTION JNZ ERR5 GIVE UP THIS IS THE THIRD TIME THROUGH INR A STA DNERR THEN THE OTHER MOV A,C SUI 2 BACK DOWN TWO TRACKS JP LERRO XRA A DON'T GO LOWER THAN ZERO LERRO MOV C,A JMP LEEKT SEEK TO THIS TRACK AND RETRY OPERATION * LFIRS XRA A STA DNERR SET FOR NEXT DIRECTION MOV A,C ADI 2 STEP UP TWO TRACKS CPI 77 JC LERRO MVI A,76 NO MORE OUT THAN 76 JMP LERRO * * WASN'T THE RIGHT SECTOR * LNOSE CALL LWAIT WAIT FORR2RIVE READY LDA DSECN GET READ ATTEMPTS INR A COUNT UP STA DSECN STORE IT CPI 21 HOW MANY? JC HDATA TOO MANY? JMP ERR1 YUP * * * ERROR FLAG SET UP USED BY RDSKH & LWDSH * LDATN XRA A START WITH NO TRIES STA DTRIES CMA STA DNERR SET IN/OUT SEEK SWITCH STA DTERR MINUS TRACK ERRORS RET * * SET UP FOR HEADER SEARCH * LHDVE XRA A STA DSECN SET NO SECTORS TRIED CALL LECHK GO TO PROPER TRACK LDA LTSEC GET DESIRED SECTOR MOV B,A AND CARRY IT AROUND IN "B" RET * * * READ NEXT HEADER * * ON RETURN ALL INFORMATION IS IN LIHEAD * LHDAT MVI A,HELEN HEADER LENGTH OUT BYTLO TO THE CONTROLLER XRA A OUT BYTHI NOW THE HIGH COUNT LXI H,LIHEAD TRANSFER ADDRESS MOV A,L OUT ADRLO MOV A,H OUT ADRHI * CALL LWAIT BE SURE CONTROLLER IS READY MVI A,READH READ HEADER COMMAND OUT TRAPT GIVE IT.... * HDLOP IN STAPT GET STATUS ANI 0FH LOOP FOR ANY FLAGS SET RNZ . GO BACK IF ANY JMP HDLOP KEEP LOOPING * * * LWDSH * * WRITE HEADER FOLLOWED BY DATA BLOCK * LWDSH LHLD LOHFID OUTGOING FILE ID SHLD LTFID SET THE TRANSFER DESCRIPTOR MVI A,WDATA STA DOPER SET OPERATION FOR LATER CALL LBLKL TRANSFER PARAMETERS CALL LUNIT PREPARE THE UNIT * * SET UP THE HEADER * LXI H,LOHEA LDA LTSEC GET SECTOR MOV M,A MOV B,A KEEP IN "B" ALSO LDA LTTRK INX H MOV M,A PUT IN THE TRACK * CHECK FOR WRITE OVER INDEX LDA LOHPRO NUMBER OF SECTORS REQUIRED BY TRANSFER ANI 15 STRIP OFF HIGH BIT ADD B THE DESIRED SECTOR CPI 17 15 WITH 1 IS 16 JNC ERR4 ERROR...WOULD TRY TO WRITE OVER INDEX * * NOW FIND THE SECTOR BEFORE THE DESIRED ONE * CALL LDATN HERE WE GO, SET FIELDS LHOVE CALL LHDVE LHEAD CALL LHDAT READ THE NEXT HEADER ANI 0CH ABORT OR CRC ERROR? JNZ LCRCE * LHLOP IN STAPT ANI 7 TC, SREDY OR ABORT JZ LHLOP IN STAPT ANI TRCOM BE SURE TRANSFER IS COMPLETE JZ LCRCE IN STAPT ANI 0CH ABORT OR CRC AGAIN JNZ LCRCE * * NOW CHECK HEADER VALUES * LDA LIHTRK GET READ TRACK NUMBER CMP C JNZ LHTER WE'RE ON THE WRONG TRACK LDA LIHPRO NUMBER OF SECTORS ANI 15 MOV E,A SAVE IN E * * CHECK FOR DIREC TRACK (SECTOR HANDLING IS SPECIAL) * MOV A,C DESIRED TRACK IS IN C CPI DIRDT JZ LONFIN PROCESS SPECIAL IF DIRECTORY TRACK * LDA LIHSEC GET READ IN SECTOR ADD E CALCULATE NEXT SECTOR ANI 15 MASK OFF 16 CARRY LSECO CMP B IS IT THE ONE WE WANT? JNZ LNSEC IF NOT TRY AGAIN * * NOW WRITE THE HEADER * CALL LWAIT MVI A,HELEN BYTE COUNT OUT BYTLO XRA A NO HIGH BYTES OUT BYTHI LXI H,LOHEA HERE'S WHERE WE GET IT FROM MOV A,L OUT ADRLO LOW TRANSFER ADDRESS MOV A,H OUT ADRHI HIGH TRANSFER ADDRESS * MVI A,WRITH WRITE HEADER COMMAND OUT TRAPT * LLOP2 IN STAPT ANI 7 JZ LLOP2 WAIT FOR TC,ABORT OR SREADY ANI ABERR ABORT? JNZ LCRCE CALL LWAIT WAIT FOR SREADY IN STAPT BE SURE OF THIS ONE ANI ABERR JNZ LCRCE MVI C,4 CALL DELAY JMP HDATR ALL DONE GO WRITE DATA !! HEAD RECOVERY?? * * PROCESS CALCULATION FOR TRACK ONE * * SECTORS ARE WRITTEN IN A 0,8,1,9,2,10,3....SEQUENCE * LONFIN LDA LTSEC GET DESIRED SECTOR CPI 8 TEST IF ADD OR SUBTRACT JNC LVER8 IF SUBTRACT * ORA A TEST IF SECTOR ZERO JZ LFIFT ADI 7 8-1,9-2,10-3..... * LONF1 MOV B,A SAVE NEW DESIRED VALUE LDA LIHSEC GET READ IN SECTOR JMP LSECO AND DO COMPARE * LFIFT MVI A,15+8 SECTOR 0 NEEDS FIFTEEN LVER8 SUI 8 0-8,1-9,2-10..... JMP LONF1 * * * PROCESS TRACK ERROR * LTERR CALL LWAIT LDA DTERR ORA A SET FLAGS JM LONCM IF FIRST TIME TRY THE DIFFERENCE INR A STA DTERR INCREMENT THE COUNT DCR A JZ LEEK0 RESTORE AND RETURN IF SECOND TIME CPI 6 JUST FIVE TIMES JNC ERR6 RET * LONCM XRA A STA DTERR SET AS SECOND TIME LDA LIHTRK GET READ IN TRACK CPI 77 SEE IF REASONABLE JNC LEEK0 IF NOT THEN RESTORE STA CTRCK MAKE IT THE CURRENT ONE RET . AND TRY AGAIN * * * DRIVE AND DRIVER INITIALIZATION ROUTINES * * THIS ROUTINE INITIALIZES ALL DRIVES AND SETS THE * TRACK COUNT VALUES IN THE UNIT TABLE TO ZERO. * LDRI MVI B,4 NUMBER OF POSSIBLE DRIVES LXI H,UNTAB * LDRI1 MVI M,0 CLEAR THE UNIT TABLE INX H DCR B JNZ LDRI1 * GET NUMBER OF DRIVES*2 TO RESTORE MVI A,2 ONLY TWO MOV D,A SAVE IN "D" DCR D * LDRI2 DCR D RM . IN CASE OF ERROR MOV A,D STA CUNIT FOR LEEK0 PUSH D CALL LEEK0 POP D DCR D DOUBLE DECREMENT FOR RESTORE DRIVES RM . RETURN WHEN DONE JMP LDRI2 * * * ROUTINE TO SEEK TRACK ZERO AND RESET THE * TRACK COUNTER. * LEEK0 LDA CUNIT GET CURRENT UNIT CALL LUSET GET PROPER COMMAND OUT COMPT SELECT THE DRIVE ANI 0EFH SET RESTORE LOW OUT COMPT NEXT SEEK WILL CLEAR THE RESTORE XRA A STA CTRCK SET CURRENT TRACK AS ZERO * LKDON IN STAPT WAIT FOR SEEK COMPLETE ANI SKCOM RZ . WHEN FINISHED JMP LKDON * * * THIS ROUTINE SEEKS TO THE TRACK GIVEN IN LTTRK * LECHK CALL LRLOP GET DRIVE STATUS LDA LTTRK GET DESIRED TRACK MOV C,A WE KEEP IT HERE * LEEKT LDA CTRCK GET CURRENT TRACK SUB C THE DIFFERENCE RZ . ALL DONE IF EQUAL JP LECH1 * CMA . DO THE COMPLEMENT FOR NEGATIVE RESULTS INR A MOV B,A "B" HAS NUMBER TO MOVE LDA RUNIT GET PROPER COMMAND ANI 0FDH BIT "1" LOW JMP LECH2 * LECH1 MOV B,A LDA RUNIT THE PROPER ONE * LECH2 OUT COMPT SET THE DIRECTION ANI 0FEH TURN ON THE STEP BIT LECH3 OUT COMPT GIVE THE STEPS DCR B JNZ LECH3 GIVE B STEPS * MOV A,C GET TRACK STA CTRCK MAKE IT THE CURRENT ONE JMP LKDON WAIT FOR SEEK COMPLETE FLAG * * * * THIS ROUTINE IS CALLED PRIOR TO DRIVER OPERATIONS * TO SET UP THE DRIVER PARAMETERS RELATING TO UNIT AND * TRACK. * * SET CURRENT UNIT INTO RUNIT * LUNIT LDA LTUNIT GET DESIRED UNIT CALL LUSET 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 LRLOP SEE IF DRIVE IS READY CALL LWAIT WAIT FOR SREADY * * TEST IF DIFFERENT UNIT...IF SO THEN WAIT FOR INDEX MARK * LDA LTUNIT GET DESIRED UNIT LXI H,CUNIT POINT TO LAST CURRENT UNIT CMP M COMPARE MOV M,A SAVE THIS AS CURRENT JZ LETUN * LIFIN IN STAPT GET STATUS ANI INDEX TEST FOR INDEX JNZ LIFIN LOOP UNTIL LOW * * GET CURRENT TRACK FOR THIS DRIVE * LETUN LXI H,UNTAB POINT TO UNIT TABLE LDA LTUNIT GET UNIT ANI 7 IN CASE OF ERROR RAR . DIVIDE BY TWO TO GET DRIVE SPECIFICATION * * NOTE: UNTAB CAN'T PASS 256 PAGE BOUNDERY * ADD L POINT TO PROPER ONE MOV L,A MOV A,M GET TRACK POINTER FROM IT STA CTRCK STORE IT AS CURRENT TRACK LDA LTTRK GET DESIRED TRACK MOV M,A SET IT AS NEW POINTER (SEEK COMES LATER) RET * * * CALCULATE PHYSICAL DRIVE AND UNIT FROM NUMBER IN "A" * LUSET ANI 7 IN CASE OF ERROR LXI B,0D030H LOWER AND UPPER UNIT RRC . PUT BIT ZERO IN CARRY RLC . RESTORE A JNC LTDRV MOV B,C SELECT EVEN UNIT (0,2,4) * LTDRV ANI 6 STRIP OFF UNUSED LOWER BIT RLC . MOVE DRIVE SELECT TO PROPER POSITION CMA ANI 0CH 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 LOHPRO. * LBLKL LHLD LTBCNT GET COUNT FROM TRANSFER DESCRIPTOR MVI C,1 START WITH ONE SECTOR LXI D,-256 FIRST SECTOR IS 256 * LBSUB DAD D SUBTRACT AMOUNT IN THIS SECTOR MOV A,H ORA A JM LBREM GOT ENOUGH--NEED TO FUDGE? ORA L JZ LBRON ZERO IS RIGHT ON!!! LXI D,-320 NOW THE BIG SECTORS INR C ONE MO SECTOR JMP LBSUB DO THE MO * LBREM LXI D,320-65 FIND OUT IF REMAINDER IS => 65 DAD D MOV A,H ORA H JM LMORE IF NEGATIVE NOT BIG ENOUGH * LBRON LHLD LTBCNT SHLD LOHSIZ OUTGOING HEADER SIZE LTSET SHLD DRLEN TRANSFER LENGTH FOR THE DRIVER LDA LOHPRO OUTGOING HEADER PROTECTION WORD ANI 80H CLEAR PREVIOUS COUNT ORA C ADD IN THE SECTOR COUNT STA LOHPRO PUT IT BACK RET * * FUDGE THE TRANSFER LENGTH FOR WRITES....... * WE MUSN'T LEAVE THE SECTOR MARK HANGING!! * LMORE LHLD LTBCNT SHLD LOHSIZ TRUE COUNT TO HEADER LXI D,65 ADD THE FUDGE FACTOR DAD D ADD EM UP JMP LTSET FILL EM IN * * * LCRCE CALL LERRP PROCESS THE ERROR JMP LHOVE AND DO IT OVER * * LHTER CALL LTERR PROCESS THE TRACK ERROR JMP LHOVE * * LNSEC CALL LWAIT LDA DSECN INR A PROCESS SECTOR ATTEMPT COUNT STA DSECN CPI 30 JC LHEAD READ THE NEXT * * ERROR PROCESSOR * ERR1 MVI A,FORER CAN'T FIND SECTOR DB 1 * ERR2 MVI A,SIZER SIZE CONFLICT DB 1 * ERR3 MVI A,FIDER FID CONFLICT DB 1 * ERR4 MVI A,SECER SECTOR CONFLICT DB 1 * ERR5 MVI A,TRIER DTRIES * DB 1 ERR6 MVI A,TRKER * LHLD LTSEC GET SECTOR AND TRACK TO HL MOV B,A STORE ERROR IN B LDA DOPER GET OPERATION ADI 0A3H MAKE IT READABLE LRRET HLT * * DRIVE NOT READY * * GIVE MESSAGE AND WAIT FOR DRIVE READY (CONTINUE * OPERATION OR CHARACTER FROM TERMINAL FOR ABORT.) * LRERR CALL OUST OUTPUT MESSAGE ASC "DRIVE NOT READY DW 0A0DH DB 0 CALL CONIN READ BYTE FROM CONSOL CPI CR JNZ LRRET RETURN TO DOS IF NOT * LRLOP IN STAPT SEE IF NOW READY ANI DREDY RZ . DRIVE IS READY JMP LRERR * * THIS IS THE END *