/ P?S/8 RK8E 4-DRIVE NON-SYSTEM HANDLERS / P?S/8 RK-8/E NON-SYSTEM HANDLERS FOR ADDRESSING FOUR FULL DRIVES. / LAST EDIT: 01-APR-1986 05:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / THESE ARE CO-RESIDENT HANDLERS FOR THE RK-8/E AND UP TO FOUR DRIVES. FUTURE / VERSIONS MAY SUPPORT THE RKS8E/RK8L 8 DRIVE HARDWARE. EACH ENTRY ADDRESSES / TWO COMPLETE DISKS: RK8E01 TREATS DISK 0 AS LOGICAL UNITS 0-3 AND DISK 1 / AS LOGICAL UNITS 4-7; RK8E23 TREATS DISK 2 AS LOGICAL UNITS 0-3 AND DISK 3 / AS LOGICAL UNITS 4-7. /CALLING SEQUENCE: / CDF MYFLD /SET CALLER'S DATA FIELD / CIF HNDFLD /SET HANDLER'S INSTRUCTION FIELD / JMS I (HANDLER) /RK8E01 FOR DISK 0-1, RK8E23 FOR DISK 2-3 / PARAM /PARAMETER POINTER / ERRORRETURN /RETURNS HERE WITH DISK STATUS IN AC IF ERROR / GOODRETURN /RETURNS HERE WITH CLEAR AC IF I/O OK PAGE /START ON A GOOD BOUNDARY HERE= . /REMEMBER ASSEMBLY ADDRESS / RK-8/E DEFINITIONS. RKCODE= 74^10+6000 /DEVICE CODE OF RK-8/E DSKP= RKCODE+1 /SKIP ON DONE DCLR= RKCODE+2 /CLEAR STATUS DLAG= RKCODE+3 /LOAD AND GO DLCA= RKCODE+4 /LOAD CURRENT ADDRESS DRST= RKCODE+5 /READ STATUS DLDC= RKCODE+6 /LOAD COMMAND DMAN= RKCODE+7 /MAINTAINENCE / MISCELLANEOUS DEFINITIONS. NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 REVISIO="A&77 /REVISION OF HANDLER(S) RKLENGT=6260 /LENGTH OF LOGICAL UNIT ON RK-8/E XLIST OFF IFNDEF OFF IFNDEF ON IFNDEF RK8E01 IFNDEF RK8E23 XLIST ON / DEVICE HANDLER HEADER BLOCK. *"R&177;*"K&177;*"8&177 /GROUP NAME *-2 /GROUP COUNT *"R&177;*"K&177;*"A&177 /DEVICE NAME *RK8E01&177 /RELATIVE ENTRY POINT *RKLENGTH-1 /LENGTH (HIGHEST BLOCK) *REVISION /REVISION OF HANDLER *"R&177;*"K&177;*"B&177 /DEVICE NAME *RK8E23&177 /RELATIVE ENTRY POINT *RKLENGTH-1 /LENGTH (HIGHEST BLOCK) *REVISION /REVISION OF HANDLER *HERE /RESET ORIGIN / THE FOLLOWING LITERALS ARE BEING GENERATED NOW SO THAT THE LAST TWO / LOCATIONS ON THIS PAGE LOOK LIKE THIS: / *.!177-1 /GET NEAR END OF PAGE /RKINIT,.-. /WILL CONTAIN OUR ACTUAL LOAD ADDRESS / TAD RKINIT /GET LOAD ADDRESS AND FALL THROUGH TO NEXT PAGE RKINIT= .!177-1 /INITIALIZE HEADER FOO= (TAD RKINIT) /GENERATE ADD INSTRUCTION FOO= (.-.) /GENERATE HEADER / ENTRY POINT FOR DISK[0-1] HANDLER. RK8E01, .-. /DISK 0, 1 ENTRY POINT CLA /CLEAN UP TAD RK8E01 /GET OUR CALLER DCA RK8E23 /MAKE IT LOOK LIKE THEIRS JMP RKCOMMON /CONTINUE THERE / ENTRY POINT FOR DISK[2-3] HANDLER. RK8E23, .-. /DISK 2, 3 ENTRY POINT NL0002 /SET DRIVE PAIR BIT RKCOMMO,CLL RAL /MOVE TO BIT[9] DCA RKPAIR /SAVE DRIVE PAIR BIT NL7775 /SETUP THE DCA RKTRYCOUNTER /RETRY COUNTER RDF /GET CALLING FIELD TAD (CDF) /FORM CDF CALLING FIELD DCA RKERCDF /STORE IN-LINE IN ERROR HANDLER RKTRY, TAD I RK8E23 /GET CALLER'S PARAMETER ADDRESS DCA RKEXIT /STASH THE POINTER TAD I RKEXIT /GET THE TRANSFER ADDRESS DCA RKBUFFER /STASH IT ISZ RKEXIT /BUMP TO NEXT TAD I RKEXIT /GET THE FUNCTION WORD DCA RKFUNCTION /STASH IT ISZ RKEXIT /BUMP TO NEXT TAD I RKEXIT /GET THE BLOCK NUMBER CLL RAR /%2 DCA RKSECTOR /SAVE AS LOGICAL SECTOR TAD RKFUNCTION /GET FUNCTION WORD AND (3700) /JUST PAGE BITS SNA /SKIP IF ANY NL4000 /ELSE MAKE 40 PAGE CALL VALUE DCA RKPAGCT /STORE PAGE COUNT TAD RKFUNCTION /GET THE FUNCTION WORD AGAIN AND (4) /JUST HIGHEST UNIT BIT CLL RAR /BECOMES LOWER PHYSICAL DRIVE BIT DCA RKDISK /STASH THE LOWER DRIVE BIT TAD RKFUNCTION /GET THE FUNCTION WORD AGAIN RTR /LOWEST UNIT BIT TO AC[0], MIDDLE UNIT BIT TO LINK SPA CLA /SKIP IF EVEN UNIT TAD (1454) /ELSE ADD ON A UNIT LENGTH (%2 AT PRESENT) SZL /SKIP IF NOT A DOUBLE UNIT TAD (3130) /ELSE ADD ON DOUBLE UNIT LENGTH (%2 AT PRESENT) CLL RAL /ADJUST TO PROPER THIRTEEN BIT SIZE TAD RKSECTOR /ADD ON BASIC SECTOR FROM BLOCK NUMBER DCA RKSECTOR /SAVE FINAL DESIRED SECTOR TAD RKFUNCTION /GET THE FUNCTION AGAIN AND (4070) /REMOVE ALL BUT READ/WRITE AND FIELD BITS SZL /HIGHEST SECTOR BIT SET? IAC /YES, SET LOW-ORDER COMMAND BIT DCA RKFUNCTION /SAVE COMMAND VALUE NL0001 /SETUP ODDNESS MASK AND I RKEXIT /GET THE BIT TAD (CIF CDF-CDF^2) /GET (CIF CDF)-CDF*2 CLL RAR /PUT ODDNESS BIT INTO LINK; SET AC TO PROPER OFFSET TAD RKERCDF /NOW HAVE CIF CDF RETURN FIELD DCA RKEXIT /STORE FOR EXIT LATER RKOCDF, JMS RKINIT /WILL BE CDF OUR FIELD RKLOC, JMP I (RKODDCHK-RKLOC)/CONTINUE THERE / WAIT ROUTINE. RKWAIT, .-. /I/O WAIT ROUTINE DLDC /LOAD PASSED COMMAMD TAD RKSECTOR /GET LATEST SECTOR DLAG /LOAD IT AND START COMMAND DSKP /FLAG UP? JMP .-1 /NO, WAIT FOR IT DRST /YES, GET RETURNED STATUS CLL RAL /GET RID OF DONE BIT SNA CLA /SKIP IF ANY ERRORS JMP I RKWAIT /ELSE RETURN DRST /GET THE STATUS AGAIN DCA RKSTATUS /SAVE IT TAD RKSTATUS /GET IT BACK AND (401) /JUST RECALIBRATE BITS SZA CLA /SKIP IF OTHER PROBLEM IAC /ELSE MAKE IT RECALIBRATE IAC /SET CLEAR BIT AT LEAST DCLR /CLEAR CONTROLLER OR RECALIBRATE DRST /GET STATUS NOW CLL RTL /MOVE "IN MOTION" BIT TO LINK SZA CLA /SKIP IF ALL ELSE OK JMP RKERCDF /ELSE BARF! SZL /DONE YET? JMP .-6 /NO, KEEP WAITING RKERCDF,.-. /WILL BE CDF CALLING FIELD ISZ RKTRYCOUNTER /TOO MANY ERRORS? JMP RKTRY /NO, TRY AGAIN TAD RKSTATUS /YES, GET STATUS AGAIN SKP /DON'T BUMP RETURN ADDRESS / COMES HERE IF NO ERRORS. RKDONE, ISZ RK8E23 /BUMP TO GOOD RETURN RKEXIT, .-. /WILL BE CIF CDF RETURN FIELD ISZ RK8E23 /BUMP RETURN ADDRESS JMP I RK8E23 /RETURN TO CALLER RKBUFFE,.-. /TRANSFER ADDRESS RKDISK, .-. /HIGH-ORDER-UNIT-BIT-DERIVED DRIVE BIT RKFUNCT,.-. /FUNCTION WORD RKPAGCT,.-. /PAGE COUNTER RKPAIR, .-. /PHYSICAL DRIVE PAIR BIT RKSECTO,.-. /SECTOR NUMBER RKSTATU,.-. /DRIVE STATUS DURING ERROR SAVED HERE RKTRYCO,.-. /RETRY COUNTER / RELOCATION ADDRESS(ES) FOR THIS PAGE. RKREL0= (RKODDCHK-RKLOC)/POINTER TO RKODDCHK PAGE / ONCE-ONLY INITIALIZATION CODE. / THE AC CONTAINS THE ACTUAL VALUE OF "RKLOC" RELOCATED TO THE BASE PAGE WE / WERE LOADED INTO. ALL ADDRESS CONSTANTS MUST BE UPDATED TO REFLECT THIS. / THIS PAGE AND THE FOLLOWING PAGE WILL BECOME THE WORK BUFFER FOR / ALL HALF-SECTOR OPERATIONS. RKHBUFF=. /HALF-SECTOR WORK BUFFER HERE RKHBUFF,DCA RKHBUFFER /SAVE RELOCATION VALUE RKTEMP, SZL /LINK ON? ISZ RKXZAP /YES, MAKE IT SET THE LINK LATER RIF /GET OUR FIELD TAD (CDF) /MAKE IT CDF OUR FIELD DCA RKTFLD /STORE IN-LINE RKTFLD, .-. /WILL BE CDF OUR FIELD RKRLINS,TAD RKRLST /GET A RELOCATABLE ADDRESS SNA /END OF LIST? JMP RKDOIT /YES, CONTINUE THERE TAD RKHBUFFER /NO, ADD ON RELOCATION FACTOR DCA RKTEMP /STASH THE CORRECTED POINTER TAD I RKTEMP /GET THE RELOCATABLE ADDRESS TAD RKHBUFFER /RELOCATE IT DCA I RKTEMP /STORE BACK CORRECTED VALUE ISZ RKRLINSTRUCTION /BUMP TO NEXT ELEMENT JMP RKRLINSTRUCTION /CONTINUE THERE RKDOIT, TAD RKTFLD /GET CDF OUR FIELD DCA I (RKOCDF-RKLOC) /STORE IT THERE TAD RKTFLD /GET IT AGAIN DCA I (RKPCDF-RKLOC) /STORE WHERE NEEDED RKXZAP, CLA /**** ZAPPED **** CLA IAC CLL RAR /LOAD ORIGINAL LINK VALUE JMP I (RKOCDF-RKLOC) /REJOIN ORIGINAL CODE / RELOCATION LIST. RKRLST= . /RELOCATABLE ADDRESSES START HERE RKREL0-RKLOC /POINTER TO RKODDCHK (RKOCDF-RKLOC)-RKLOC /POINTER TO RKOCDF (RKPCDF-RKLOC)-RKLOC /POINTER TO RKPCDF RKRL0-RKLOC /POINTER TO RKBUFF RKRL1-RKLOC /POINTER TO RKDISK RKRL2-RKLOC /POINTER TO RKDONE RKRL3-RKLOC /POINTER TO RKFUNCTION RKRL4-RKLOC /POINTER TO RKHBUFFER RKRL5-RKLOC /POINTER TO RKPAGCT RKRL6-RKLOC /POINTER TO RKPAIR RKRL7-RKLOC /POINTER TO RKSECTOR RKRL10-RKLOC /POINTER TO RKWAIT 0 /THIS ENDS THE LIST PAGE ZBLOCK 200 /REST OF HALF-SECTOR OPERATIONS BUFFER / SECOND CODE PAGE OF HANDLER. RKODDCH,DCA RKCHKBIT /ALWAYS CHECK THE FIRST TIME! DCA RKBAKUP /CLEAR INITIAL BACKUP FACTOR SZL /IS IT AN ODD HALF? JMP RKSODD /YES, DO ODD HALF THERE RKSLUP, TAD I (RKBUFFER-RKLOC) /GET THE TRANSFER ADDRESS DLCA /LOAD IT TAD I (RKPAGCT-RKLOC) /GET THE CURRENT PAGE COUNT TAD RK7700/(-100) /COMPARE TO ONE PAGE TRANSFER SNA CLA /SKIP IF LARGER JMP RK1PAGE /JUMP IF SINGLE PAGE RK1READ,TAD RKCHKBIT /GET CHECK BIT IN CASE SECONDARY TRANSFER TAD I (RKFUNCTION-RKLOC) /GET BASIC COMMAND TAD I (RKPAIR-RKLOC) /ADD ON PHYSICAL DISK EXTENSION BIT TAD I (RKDISK-RKLOC) /ADD ON DRIVE BIT DUE TO HIGH-ORDER UNIT BIT RKWRENT,JMS I (RKWAIT-RKLOC) /START IT UP AND WAIT FOR COMPLETION RKODREN,ISZ I (RKSECTOR-RKLOC) /BUMP UP DISK SECTOR SKP /DIDN'T OVERFLOW ISZ I (RKFUNCTION-RKLOC) /ELSE BUMP COMMAND HIGH-SECTOR BIT TAD I (RKBUFFER-RKLOC) /GET TRANSFER ADDRESS TAD (400) /GET NORMAL TWO PAGE INCREMENT TAD RKBAKUP /GET BACKUP FACTOR DCA I (RKBUFFER-RKLOC) /SAVE UPDATED VALUE DCA RKBAKUP /CLEAR POSSIBLE HALF-SECTOR BACKUP TAD I (RKPAGCT-RKLOC) /GET PAGE COUNTER TAD RK7600/(-200) /SUBTRACT TWO PAGES SPA SNA /SKIP IF NOT DONE JMP RKOVER /JUMP IF DONE DCA I (RKPAGCT-RKLOC) /ELSE STORE UPDATED VALUE BACK TAD I (RKSECTOR-RKLOC) /GET NEXT SECTOR AND (37) /JUST ON-TRACK BITS SZA CLA /SKIP IF NEW TRACK NEEDED TAD (1000) /ELSE ALLOW NON-CHECK FOR SPEED'S SAKE DCA RKCHKBIT /STORE NEW CHECK BIT VALUE JMP RKSLUP /GO DO NEXT RK1PAGE,TAD I (RKFUNCTION-RKLOC) /GET READ/WRITE FUNCTION SPA CLA /SKIP IF ONE PAGE READ JMP RK1WRITE /JUMP IF ONE PAGE WRITE TAD (100) /GET "HALF-SECTOR" BIT JMP RK1READ /CONTINUE THERE RKOVER, CLA CLL /CLEAN UP JMP I (RKDONE-RKLOC) /FINISH IT THERE RKSODD, TAD I (RKPAGCT-RKLOC) /GET CURRENT PAGE COUNT TAD (100) /ADD ONE PAGE TO COUNTER DECREMENT LATER DCA I (RKPAGCT-RKLOC) /STORE IT BACK TAD RK7600/(-200) /SETUP THE DCA RKBAKUP /BACKUP FACTOR TAD I (RKFUNCTION-RKLOC) /GET READ/WRITE FUNCTION WORD SMA CLA /SKIP IF WRITING JMP RKODDRD /JUMP IF READING RKODDWR,TAD (200) /ODD WRITING AFFECTS SECOND HALF RK1WRIT,TAD (RKHBUFFER-RKLOC) /GET WORK BUFFER POINTER DCA RKTOPTR /SAVE DESTINATION POINTER JMS RKWRKREAD /READ CURRENT SECTOR INTO WORK BUFFER DCA RKFRCDF /SAVE SOURCE CDF INSTRUCTION TAD I (RKBUFFER-RKLOC) /GET TRANSFER ADDRESS DCA RKFRPTR /SAVE SOURCE POINTER RIF /GET OUR FIELD TAD (CDF) /MAKE INTO CDF INSTRUCTION DCA RKTOCDF /SAVE DESTINATION CDF INSTRUCTION JMS RKMOVE /MOVE USER PAGE INTO WORK BUFFER TAD (RKHBUFFER-RKLOC) /GET WORK BUFFER ADDRESS DLCA /LOAD IT NL4000 /SET WRITE BIT TAD RKWCMD /TURN FORMER READ INTO WRITE JMP RKWRENT /GO WRITE IT THERE RKODDRD,JMS RKWRKREAD /READ CURRENT SECTOR INTO WORK BUFFER DCA RKTOCDF /SAVE DESTINATION CDF INSTRUCTION TAD I (RKBUFFER-RKLOC) /GET THE TRANSFER ADDRESS DCA RKTOPTR /SAVE DESTINATION POINTER TAD (RKHBUFFER-RKLOC) /GET WORK BUFFER ADDRESS TAD (200) /WANT SECOND HALF FOR ODD READ DCA RKFRPTR /SAVE SOURCE POINTER RIF /GET OUR FIELD TAD (CDF) /TURN INTO CDF INSTRUCTION DCA RKFRCDF /SAVE SOURCE CDF INSTRUCTION JMS RKMOVE /MOVE SECOND WORK PAGE TO USER BUFFER JMP RKODRENT /CONTINUE THERE RKWRKRE,.-. /WORK BUFFER READ ROUTINE TAD (RKHBUFFER-RKLOC) /GET WORK BUFFER ADDRESS DLCA /LOAD IT NL0001 /SETUP HIGH-ORDER SECTOR BIT MASK AND I (RKFUNCTION-RKLOC) /GET HIGH-ORDER SECTOR BIT TAD I (RKPAIR-RKLOC) /GET PHYSICAL DISK EXTENSION BIT TAD I (RKDISK-RKLOC) /GET DRIVE BIT DUE TO HIGH-ORDER UNIT BIT RIF /GET OUR TRANSFER FIELD BITS DCA RKWCMD /SAVE FOR WRITING LATER TAD RKWCMD /GET IT BACK JMS I (RKWAIT-RKLOC) /GO READ LATEST SECTOR INTO WORK BUFFER TAD I (RKFUNCTION-RKLOC) /GET FUNCTION WORD AND (70) /JUST TRANSFER FIELD BITS TAD (CDF) /MAKE INTO CDF INSTRUCTION JMP I RKWRKREAD /RETURN RKMOVE, .-. /WORK BUFFER MOVE ROUTINE TAD RK7600/(-200) /SETUP THE DCA RKWRKREAD /MOVE COUNT RKFRCDF,.-. /WILL BE SOURCE CDF INSTRUCTION TAD I RKFRPTR /GET A WORD RKTOCDF,.-. /WILL BE DESTINATION CDF INSTRUCTION DCA I RKTOPTR /PUT A WORD ISZ RKFRPTR /BUMP SOURCE POINTER RK7600, CLA!400 /JUST IN CASE; THIS CAN'T SKIP! ISZ RKTOPTR /BUMP DESTINATION POINTER RK7700, SMA CLA /JUST IN CASE; THIS CAN'T SKIP! ISZ RKWRKREAD /DONE ALL YET? JMP RKFRCDF /NO, KEEP GOING RKPCDF, .-. /WILL BE CDF OUR FIELD JMP I RKMOVE /RETURN RKBAKUP,.-. /BACKUP FACTOR FOR ODD SINGLE TRANSFERS RKCHKBI,.-. /HEADER CHECK BIT RKFRPTR,.-. /SOURCE POINTER FOR MOVE ROUTINE RKTOPTR,.-. /DESTINATION POINTER FOR MOVE ROUTINE RKWCMD, .-. /COMMAND TO REFERENCE WORK BUFFER / RELOCATION ADDRESSES FOR THIS PAGE. RKRL0= (RKBUFFER-RKLOC) /POINTER TO RKBUFFER RKRL1= (RKDISK-RKLOC) /POINTER TO RKDISK RKRL2= (RKDONE-RKLOC) /POINTER TO RKDONE RKRL3= (RKFUNCTION-RKLOC) /POINTER TO RKFUNCTION RKRL4= (RKHBUFFER-RKLOC) /POINTER TO RKHBUFFER RKRL5= (RKPAGCT-RKLOC) /POINTER TO RKPAGCT RKRL6= (RKPAIR-RKLOC) /POINTER TO RKPAIR RKRL7= (RKSECTOR-RKLOC) /POINTER TO RKSECTOR RKRL10= (RKWAIT-RKLOC) /POINTER TO RKWAIT PAGE $ /THAT'S ALL FOLK!