/ P?S/8 RX01 NON-SYSTEM HANDLER / LAST EDIT: 17-DEC-1986 23:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / P?S/8 NON-SYSTEM HANDLER FOR SINGLE-DENSITY 8" FLOPPY DISKS ON VARIOUS / HARDWARE CONFIGURATIONS: / A) RX01 AND COMPATIBLES (DSD-210, ETC.). / B) RX02 WITH SINGLE-DENSITY DISKS AND COMPATIBLES (ALSO RX03). / C) ANY OF THE ABOVE ON VT78, VT278 (DECMATE I), PC278 (DECMATE II). / SUPPORTS DOUBLE-SIDED DISKS ON RX03. / SUPPORTS SECONDARY DRIVES (UNITS 2 AND 3) ON VT78/VT278/PC278 AND DSD-210. / USES DEC OS/8 COMPATIBLE (12-BIT MODE) SINGLE-DENSITY DISK FORMAT FOR / FILE CONVERSION, ETC. COMPATIBILITY. / CALLING SEQUENCE: / CDF MYFLD /SET CALLER'S DATA FIELD / CIF HNDFLD /SET HANDLER'S INSTRUCTION FIELD / JMS I (RXAHND) /CALL THE HANDLER / PARAM /PARAMETER POINTER / ERRORRETURN /RETURNS HERE WITH STATUS IN AC / GOODRETURN /RETURNS HERE WITH CLEAR AC IF I/O OK / PARAMETER LIST BREAKDOWN: / PARAM= . /PARAMETER LIST HERE / ADDRESS /TRANSFER ADDRESS / FUNCTION /FUNCTION WORD / BLOCK /LOGICAL BLOCK FOR TRANSFER / FUNCTION WORD BREAKDOWN: / BIT[0]: READ IF 0, WRITE IF 1 / BITS[1-5]: PAGE COUNT, 40 IF 0 / BITS[6-8]: TRANSFER FIELD / BITS[9-11]: LOGICAL UNIT / BIT[9] IS IGNORED ON ALL SYSTEMS. / BIT[10] IS IGNORED ON ALL SYSTEMS WITH ONLY 1-2 DRIVES. PAGE /START ON A NEW PAGE HERE= . /WHERE WE ARE NOW XLIST OFF IFNDEF OFF IFNDEF ON XLIST ON / DEFINITIONS. XLIST OFF XLIST ON NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7777= CLA CMA /LOAD AC WITH 7777 REVISIO="F&77 /REVISION OF HANDLER XLIST OFF IFNDEF RSECALC IFNDEF RXAHND IFNDEF RXHEAD XLIST ON RXLENGT=114^32%2 /LENGTH OF RX01 (ONE SIDE) XLIST OFF IFNDEF RXSECSW IFNDEF RXSEL IFNDEF RXSYNC IFNDEF RXWAIT XLIST ON / RX8B DEFINITIONS. DEVCODE=75^10+6000 /SKELETON IOT CODE OF DISK SEL= DEVCODE+0 /LOAD DRIVE PAIR PER AC[11] LCD= DEVCODE+1 /LOAD COMMAND REGISTER XDR= DEVCODE+2 /TRANSFER DATA REGISTER STR= DEVCODE+3 /SKIP ON, CLEAR TRANSFER FLAG SER= DEVCODE+4 /SKIP ON, CLEAR ERROR FLAG SDN= DEVCODE+5 /SKIP ON, CLEAR DONE FLAG INTR= DEVCODE+6 /INTERRUPT ENABLE/DISABLE PER AC[11] INIT= DEVCODE+7 /INITIALIZE CONTROLLER, RECALIBRATE DRIVES / DEVICE HANDLER HEADER BLOCK. *"R&177;*"X&177;*"A&177 /GROUP NAME *-1 /GROUP COUNT *"R&177;*"X&177;*"A&177 /DEVICE NAME *RXAHND&177 /ENTRY POINT *RXLENGTH-1 /HIGHEST BLOCK *REVISION /REVISION OF HANDLER *HERE /RESTORE 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 /RSECT, .-. /WILL CONTAIN OUR ACTUAL LOAD ADDRESS / TAD RSECT /GET LOAD ADDRESS AND FALL THROUGH TO NEXT PAGE RSECT= .!177-1 /INITIALIZE HEADER RTRACK= (TAD RSECT) /GENERATE ADD INSTRUCTION RSECT= (.-.) /GENERATE HEADER / ENTRY POINT FOR HANDLER. RXAHND, .-. /ACTUAL HANDLER ENTRY POINT NL7775 /SETUP THE DCA RXTRYCOUNTER /ERROR RETRY COUNTER RXAGAIN,TAD I RXAHND /GET PARAMETER LIST POINTER DCA RXEXIT /STASH THE POINTER TAD I RXEXIT /GET THE TRANSFER ADDRESS DCA RXBUFFER /STASH IT ISZ RXEXIT /BUMP TO NEXT TAD I RXEXIT /GET FUNCTION WORD AND RX70/(70) /JUST FIELD BITS TAD RXCDF/(CDF) /MAKE INTO CDF TRANSFER INSTRUCTION DCA RXCDFBUFFER /STORE IN-LINE TAD I RXEXIT /GET FUNCTION WORD AGAIN RAL /MOVE UP AND RX7600/(7600) /JUST PAGE BITS SZA /SKIP IF FULL FIELD TRANSFER CIA /ELSE INVERT FOR WORD COUNT DCA RXWC /SAVE WORD COUNT CML RTL /0 IF WRITING, 2 IF READING DCA RXFUNCTION /SAVE AS BASIC FUNCTION TAD I RXEXIT /GET FUNCTION WORD AGAIN AND (3) /JUST UNIT BITS CLL RTL;IAC;RTL /FORM UNIT^20+4 DCA RXUNIT /SAVE AS UNIT VALUE ISZ RXEXIT /BUMP TO NEXT TAD I RXEXIT /GET BLOCK NUMBER CLL RAL /*2 FOR LOGICAL SECTOR NUMBER DCA RXSECTOR /STASH IT RDF /GET CALLING FIELD TAD RXCDF/(CDF) /FORM CDF CALLING FIELD DCA RXERR /STORE IN-LINE FOR POSSIBLE ERROR USE NL0002 /SET CIF BIT TAD RXERR /FORM CIF CDF CALLING FIELD DCA RXEXIT /STORE IN-LINE FOR EXIT LATER RXSTATU,JMS RSECT /ERROR STATUS; INITIALIZED TO CAUSE HANDLER /INITIALIZATION; WILL BE HARMLESS "AND" RXLOC, JMS I (RXSYNC-RXLOC) /GET DONE FLAG TO COME UP RECODE, DCA RXSTATUS /ERROR CODE; INITIALIZED TO CANCEL ONCE-ONLY CODE RXUNZAP,TAD RXUNIT /GET THE UNIT; **** ZAPPED **** 0000 JMS I (RXSEL-RXLOC) /GO SELECT PROPER PAIR OF DRIVES DCA I (RXSECSW-RXLOC) /CAUSE PRIMARY SECTOR AND TRACK CALCULATION JMS I (RSECALC-RXLOC) /CALCULATE FIRST SECTOR NEEDED TAD RXFUNCTION /GET READ/WRITE FUNCTION SZA CLA /SKIP IF WRITE JMP RXREAD /JUMP IF READ RXSILOA,TAD RXFUNCTION /GET FUNCTION WORD; 0 IF LOAD, 2 IF EMPTY LCD /LOAD THE COMMAND TAD RXM100/(-100) /SETUP THE DCA RXSCTCNT /SECTOR COUNTER RXTRNLO,JMS TRWAIT /WAIT FOR TRANSFER FLAG TO COME UP RXCDFBU,.-. /WILL BE CDF TRANSFER FIELD TAD I RXBUFFER /GET A WORD XDR /SEND (OR RECEIVE) IT DCA I RXBUFFER /PUT A WORD (EXTRANEOUS IF WRITING) ISZ RXBUFFER /BUMP TO NEXT RXCDF, CDF /CONSTANT 6201; THIS CAN BE SKIPPED ISZ RXSCTCNT /DONE WITH SECTOR YET? JMP RXTRNLOOP /NO, KEEP GOING JMS DNWAIT /WAIT FOR DONE FLAG TAD RXWC /GET CURRENT WORD COUNT TAD (-7701) /COMPARE TO LIMIT SNA /SKIP IF NOT DONE JMP RXDONE /ELSE EXIT ON READ DONE DCA RXWC /SAVE UPDATED VALUE AND KEEP GOING RXREAD, JMS I (RXHEAD-RXLOC) /CHECK FOR SECOND HEAD USAGE TAD (1000) /SET SECOND HEAD BIT TAD RXFUNCTION /GET FUNCTION VALUE TAD RXUNIT /GET UNIT BITS AND CONVERT TO READ OR WRITE LCD /LOAD THE READ (OR WRITE) COMMAND JMS TRWAIT /WAIT FOR TRANSFER FLAG TO COME UP TAD RSECT /GET CALCULATED SECTOR XDR /SEND IT JMS TRWAIT /WAIT FOR TRANSFER FLAG TO COME UP TAD RTRACK /GET CALCULATED TRACK XDR /SEND IT ISZ RXSECTOR /BUMP TO NEXT LOGICAL SECTOR JMS I (RSECALC-RXLOC) /CALCULATE NEXT SECTOR FOR NEXT TRANSFER JMS DNWAIT /WAIT FOR READ (OR WRITE) TO FINISH ISZ RXWC /DONE WRITING? JMP RXSILOAD /NO, KEEP GOING / COMES HERE IF NO ERRORS. RXDONE, ISZ RXAHND /BUMP EXTRA TIME FOR GOOD RETURN DCA RXSTATUS /STASH EXIT STATUS RXOUT, TAD (77)/(16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND TO RAISE THE DONE FLAG RXM100, -100 /CONSTANT 7700; THIS CLEARS THE AC RX70, 70 /CONSTANT 0070; THIS CAN BE SKIPPED ISZ RXAHND /BUMP AROUND ARGUMENT AT LEAST TAD RXSTATUS /GET EXIT STATUS RXEXIT, .-. /WILL BE CIF CDF RETURN FIELD JMP I RXAHND /RETURN / COMES HERE ON ERROR. RXERR, .-. /WILL BE CDF CALLING FIELD ISZ RXTRYCOUNTER /TOO MANY ERRORS? JMP RXAGAIN /NO, TRY AGAIN / TOO MANY ERRORS, SO TAKE ERROR RETURN. JMP RXOUT /CONTINUE THERE / WAIT FOR DONE ROUTINE. DNWAIT, .-. /WAIT FOR DONE ROUTINE NL7777 /INDICATE DONE IS CALLING JMS I (RXWAIT-RXLOC) /CALL WAIT ROUTINE JMP I DNWAIT /RETURN / WAIT FOR TRANSFER FLAG ROUTINE. TRWAIT, .-. /WAIT FOR TRANSFER FLAG ROUTINE RX7600, CLA!400 /INDICATE TRANSFER IS CALLING JMS I (RXWAIT-RXLOC) /CALL WAIT ROUTINE JMP I TRWAIT /RETURN RXBUFFE,.-. /TRANSFER ADDRESS RXFUNCT,.-. /READ/WRITE FUNCTION RXSCTCN,.-. /SECTOR BUFFER COUNTER RXSECTO,.-. /LOGICAL SECTOR RXTRYCO,.-. /RETRY COUNTER RXUNIT, .-. /UNIT BITS+4 STORED HERE RXWC, .-. /WORD COUNTER / RELOCATION ADDRESSES FOR THIS PAGE. RXRL0= (RSECALC-RXLOC) /POINTER TO RSECALC RXRL1= (RXHEAD-RXLOC) /POINTER TO RXHEAD RXRL2= (RXSECSW-RXLOC) /POINTER TO RXSECSW RXRL3= (RXSEL-RXLOC) /POINTER TO RXSEL RXRL4= (RXSYNC-RXLOC) /POINTER TO RXSYNC RXRL5= (RXWAIT-RXLOC) /POINTER TO RXWAIT PAGE / ONCE-ONLY INITIALIZATION CODE. / THE AC CONTAINS THE ACTUAL VALUE OF "RXLOC" RELOCATED TO THE BASE PAGE WE / WERE LOADED INTO. ALL ADDRESS CONSTANTS MUST BE UPDATED TO REFLECT THIS. IFNZRO .&177 RXPAG2, DCA RXPAG2 /SAVE RELOCATION VALUE RXTEMP, RIF /GET OUR FIELD TAD (CDF) /MAKE INTO CDF INSTRUCTION DCA RXTEM2 /STORE IN-LINE RXTEM2, .-. /WILL BE CDF OUR FIELD RXRLINS,TAD RXRLST /GET A RELOCATABLE ADDRESS SNA /END OF LIST? JMP RXDOIT /YES, CONTINUE THERE TAD RXPAG2 /NO, ADD ON RELOCATION FACTOR DCA RXTEMP /STASH THE CORRECTED POINTER TAD I RXTEMP /GET RELOCATABLE ADDRESS TAD RXPAG2 /RELOCATE IT DCA I RXTEMP /STORE CORRECTED VALUE BACK ISZ RXRLINS /BUMP TO NEXT LIST ELEMENT JMP RXRLINS /KEEP GOING RXDOIT, JMS RXSYNC /GET DONE FLAG UP / NL0000 /SETUP FOR NORMAL PAIR JMS RXSEL /SELECT IT NOW TAD I (RXUNIT-RXLOC) /GET CURRENT UNIT+4 TAD RX406/(412-4) /TURN INTO "READ STATUS" VALUE LCD /LOAD THE COMMAND JMS RXTMSETUP /SETUP TIME-OUT SDN /DONE YET? JMP RXSTIMOUT /NO, CHECK IF WAITING TOO LONG XDR /YES, GET THE STATUS AND RX60/(60) /JUST DENSITY, DENSITY ERROR BITS SZA CLA /SKIP IF RX01 JMP RXHEDOK /JUMP IF RX02 OR RX03 TAD RX7200/(CLA) /GET CLEARING INSTRUCTION DCA RX01ZAP /PREVENT SECOND HEAD LOGIC RXHEDOK,TAD RXTEM2 /GET OUR CDF INSTRUCTION DCA I (RXOCDF-RXLOC) /STORE IN-LINE TAD RXTEM2 /GET IT AGAIN DCA I (RXWCDF-RXLOC) /STORE IN-LINE TAD RXTEM2 /GET IT AGAIN DCA RXSCDF /STORE IN-LINE TAD (40) /SET ALTERNATE PAIR BIT JMS RXSEL /ATTEMPT TO SELECT OTHER PAIR TAD RX16/(16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND RXTST, SDN /DONE FLAG UP? JMP RXTMOUT /NO, TIME IT OUT RXNORM, /NL0000 /SETUP FOR NORMAL PAIR JMS RXSEL /SELECT NORMAL PAIR JMP I RXPAG2 /GO BACK TO THE NOW FIXED-UP CODE / COMES HERE WHILE WAITING FOR THE ALTERNATE PAIR OF DISKS TO SELECT. RXTMOUT,ISZ RXTMCNT /WAITED TOO LONG? JMP RXTST /NO, KEEP GOING / NL0000 /SETUP FOR NORMAL PAIR JMS RXSEL /SELECT NORMAL PAIR NOW INIT /RESET THE HARDWARE DCA I (RXUNZAP-RXLOC) /PREVENT ALTERNATE PAIR SELECT LATER JMS RXTMSETUP /SETUP TIME-OUT SDN /DONE YET? JMP RXSTIMOUT /NO, CHECK IF WAITING TOO LONG JMP RXNORM /YES, CONTINUE THERE RXSEL, .-. /SELECTION ROUTINE RXSCDF, .-. /WILL BE CDF OUR FIELD AND (40) /JUST PAIR BIT CLL RTR;RTR;STL RAR /MOVE OVER PASSED VALUE AND SET PC278 BIT SEL /SELECT THE PAIR SEL /SELECT IT AGAIN TO BE SURE CLA /CLEAN UP SDN /CLEAR DONE FLAG NOW RX16, 16 /CONSTANT 0016; THIS CAN BE SKIPPED SER /CLEAR ERROR FLAG NOW RX60, 60 /CONSTANT 0060; THIS CAN BE SKIPPED JMP I RXSEL /RETURN RXSYNC, .-. /DISK DONE FLAG SYNC ROUTINE SDN /SKIP ON, CLEARING THE DONE FLAG NOW (IF POSSIBLE) RX406, 406 /CONSTANT 0406; THIS CAN BE SKIPPED TAD RX16/(16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND JMS RXTMSETUP /SETUP TIME-OUT STR /TRANSFER FLAG UP? RXTCNT, SKP CLA /SKIP IF NOT XDR /TRANSFER A WORD IF TRANSFER FLAG IS UP SDN /DONE FLAG UP? JMP RXSTIMOUT /NO, CHECK IF WAITING TOO LONG CLA /CLEAN UP JMP I RXSYNC /RETURN RXHEAD, .-. /SECOND HEAD CHECK ROUTINE TAD I (RXSECTOR-RXLOC)/GET CURRENT SECTOR CLL /CLEAR LINK FOR TEST TAD (-114^32) /COMPARE TO ONE-SIDE LIMIT RX01ZAP,SNL CLA /**** RX01 **** CLA ISZ RXHEAD /BUMP RETURN IF ONE SIDE ONLY JMP I RXHEAD /RETURN / TIME-OUT ROUTINE. RXTMSET,.-. /TIME-OUT SETUP ROUTINE RX7200, CLA /CLEAN UP TAD RXTCNT/(-170) /SETUP THE DCA RXSEL /TIME-OUT COUNTER / COMES HERE IF THE FLAG(S) IS(ARE) NOT UP YET. RXSTIMO,ISZ RXTEMP /WAITED ENOUGH? JMP I RXTMSETUP /NO, KEEP GOING ISZ RXSEL /WAITED TOO MUCH? JMP I RXTMSETUP /NO, KEEP GOING JMP I (FLGBARF-RXLOC) /YES, CONTINUE THERE / RELOCATION LIST. RXRLST= . /RELOCATABLE ADDRESSES START HERE PRTRACK-RXLOC /POINTER TO RTRACK RXRL0-RXLOC /POINTER TO RSECALC RXRL1-RXLOC /POINTER TO RXHEAD RXRL2-RXLOC /POINTER TO RXSECSW RXRL3-RXLOC /POINTER TO RXSEL RXRL4-RXLOC /POINTER TO RXSYNC RXRL5-RXLOC /POINTER TO RXWAIT (FLGBARF-RXLOC)-RXLOC /POINTER TO FLGBARF (RXOCDF-RXLOC)-RXLOC /POINTER TO RXOCDF (RXSECTOR-RXLOC)-RXLOC /POINTER TO RXSECTOR (RXUNIT-RXLOC)-RXLOC /POINTER TO RXUNIT (RXUNZAP-RXLOC)-RXLOC /POINTER TO RXUNZAP (RXWCDF-RXLOC)-RXLOC /POINTER TO RXWCDF RXREL0-RXLOC /POINTER TO RECODE RXREL1-RXLOC /POINTER TO RSECT RXREL2-RXLOC /POINTER TO RXERR RXREL3-RXLOC /POINTER TO RXHEAD RXREL4-RXLOC /POINTER TO RXSECTOR RXREL5-RXLOC /POINTER TO RXSTATUS RXREL6-RXLOC /POINTER TO RXSTIMOUT RXREL7-RXLOC /POINTER TO RXTMSETUP RXREL8-RXLOC /POINTER TO RXUNIT RXTMCNT,0 /THIS ENDS THE LIST PAGE / THE FIRST LITERAL ON THE PAGE MUST BE (60). FOO= AND (60) /GENERATE LITERAL NOW IFNZRO FOO&177-177 IFNZRO .&177 PRTRACK,RTRACK-RXLOC /POINTER TO RTRACK **** RELOCATE **** RSECALC,.-. /SECTOR CALCULATION ROUTINE RXOCDF, .-. /WILL BE CDF OUR FIELD ISZ RSTATUS /ARE WE CALCULATING LAST SECTOR ON FIRST SIDE? RXSECSW,SKP CLA /CLEAN UP AND SKIP IF NOT; **** FIRST CALL **** 0000 JMP RX7770 /JUMP IF SWITCHING DISKETTE SIDES OR FIRST CALL ISZ I (RSECT-RXLOC) /BUMP TO THE ISZ I (RSECT-RXLOC) /NEXT SECTOR TAD I (RSECT-RXLOC) /GET THE SECTOR NOW TAD (-33) /COMPARE TO LIMIT SPA /SKIP IF TOO FAR JMP RX7700 /JUMP IF NOT SZA /SKIP IF GOING TO EVEN SECTORS ON SAME TRACK RXSETSE,ISZ I PRTRACK/(RTRACK)/ELSE BUMP TRACK SINCE AC CONTAINS (SECTOR) ONE SNA /SKIP IF GOING TO SECTOR ONE NEXT NL0002 /ELSE WE'RE GOING TO SECTOR TWO DCA I (RSECT-RXLOC) /STORE NEW SECTOR NUMBER / COMES HERE WITH NEGATIVE AC IF WE MERELY ADDED TWO TO THE PREVIOUS SECTOR / TO CALCULATE LATEST SECTOR. THIS WILL PREVENT EXECUTION OF "RX3", AS "RX7700" / WILL SKIP AND CLEAR THE AC. THIS DOES NOT COMPROMISE SPEED WHICH MIGHT BE / IMPORTANT (VT-8/E RUNNING OR SLOW CPU, I. E. VT-78). RX7700, SMA CLA /CONSTANT 7700; THIS CLEARS THE AC RX3, 3 /CONSTANT 0003; THIS CAN BE SKIPPED JMP I RSECALC /RETURN / COMES HERE TO INITIALLY CALCULATE ABSOLUTE SECTOR AND TRACK, OR AT END OF / DISKETTE FIRST SIDE DURING SECONDARY CALCULATION. RX7770, SPA SNA SZL CLA /CONSTANT 7770; THIS CLEARS THE AC RX100, 100 /CONSTANT 0100; THIS CAN BE SKIPPED TAD (SKP CLA) /SETUP THE SECONDARY DCA RXSECSW /ROUTINE FOR LATER CALLS TAD I (RXSECTOR-RXLOC)/GET SECTOR NUMBER TAD (-114^32) /TURN INTO COUNTER LIMITING SECONDARY ROUTINE USAGE DCA RSTATUS /STASH THE COUNTER TAD RX7770/(-10) /SETUP THE DCA RXWAIT /SHIFT COUNTER JMS I (RXHEAD-RXLOC) /CHECK FOR TWO-HEAD OPERATION TAD (-114^32) /REDUCE LOGICAL SECTOR IF ON SECOND HEAD TAD I (RXSECTOR-RXLOC)/USE LOGICAL SECTOR AT LEAST RXDIVLP,CLL RAL /MOVE UP TAD (-15^400) /COMPARE TO -13*256 SNL /SKIP IF NOT TOO LARGE TAD (15^400-1) /RESTORE IF TOO LARGE IAC /ADD ONE TO QUOTIENT OR JUST FINISH RESTORING ISZ RXWAIT /DONE YET? JMP RXDIVLP /NO, KEEP GOING CLL RAR /GET LOW-ORDER QUOTIENT BIT TO LINK DCA RXWAIT /STORE FOR NOW TAD RXWAIT /GET IT BACK AND (177) /REMOVE REMAINDER BITS RX3600, DCA I PRTRACK/(RTRACK)/STASH THE QUOTIENT TAD RXWAIT /GET IT AGAIN AND RX3600/(3600) /JUST REMAINDER BITS SZL /SKIP IF EVEN TAD RX100/(100) /ELSE ADD ONE MORE CLL RTR;RTR;RTR /MOVE DOWN TO AC[7-11] IAC /INCREMENT TO FINAL VALUE JMP RXSETSECTOR /CONTINUE THERE TO STORE SECTOR AND BUMP TRACK RXWAIT, .-. /WAIT ROUTINE RXWCDF, .-. /WILL BE CDF OUR FIELD DCA RSECALC /SAVE PASSED VALUE JMS I (RXTMSETU-RXLOC)/SETUP TIME-OUT ROUTINE STR /TRANSFER FLAG UP? JMP TRYDONE /NO, TRY DONE FLAG ISZ RSECALC /YES, WAS THAT EXPECTED? JMP I RXWAIT /YES, RETURN / COMES HERE IF WRONG FLAG COMES UP. FLGBARF,NL7777 /INDICATE BARFED STATUS DCA I (RXSTATUS-RXLOC)/STORE IN STATUS WORD JMP RXBARF /TRY TO CLEAR THE PROBLEM THERE TRYDONE,SDN /DONE FLAG UP? JMP I (RXSTIMOU-RXLOC)/NO, CHECK IF WAITING TOO LONG SER /YES, ANY ERRORS? JMP TESTFLG /NO, CHECK IF EXPECTED THERE XDR /GET ERROR STATUS NOW AND RX377/(377) /JUST VALID BITS DCA I (RXSTATUS-RXLOC)/SAVE FOR OTHERS TAD (16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND JMS I (RXTMSETU-RXLOC)/SETUP TIME-OUT ROUTINE SDN /DONE FLAG UP? JMP I (RXSTIMOU-RXLOC)/NO, CHECK IF WAITING TOO LONG XDR /GET ERROR CODE AND RX377/(377) /JUST VALID BITS DCA I (RECODE-RXLOC) /SAVE THEM TAD I (RXUNIT-RXLOC) /GET UNIT BITS+4 TAD (412-4) /TURN INTO "READ STATUS" VALUE LCD /LOAD THE COMMAND JMS I (RXTMSETU-RXLOC)/SETUP TIME-OUT ROUTINE SDN /DONE FLAG UP? JMP I (RXSTIMOU-RXLOC)/NO, CHECK IF WAITING TOO LONG XDR /YES, GET THE STATUS AND RX377/(377) /JUST VALID BITS DCA RSTATUS /SAVE THEM TAD RSTATUS /GET THEM BACK AND RX3600/(200) /JUST READY BIT SNA CLA /SKIP IF READY JMP I (RXERR-RXLOC) /JUMP IF NOT TAD I (RECODE-RXLOC) /GET ERROR CODE TAD RX7700/(-100) /COMPARE TO WRITE-LOCK ERROR VALUE SNA CLA /SKIP IF OTHER JMP I (RXERR-RXLOC) /JUMP IF IT MATCHES TAD RSTATUS /GET CURRENT STATUS RX377, AND (60) /JUST DENSITY, DENSITY ERROR BITS SZA CLA /SKIP IF RX01 TAD (21-3) /ELSE SET DENSITY, CRC BITS TAD RX3/(3) /USE PARITY, CRC BITS AND I (RXSTATUS-RXLOC)/ISOLATE PROPER BITS SNA CLA /SKIP IF NORMAL ERROR RXBARF, INIT /ELSE CLEAR THE WORLD OF ERRORS JMP I (RXERR-RXLOC) /CONTINUE THERE / IF DONE FLAG IS UP WITHOUT ERRORS, CHECK IF THIS IS THE DESIRED RESULT. TESTFLG,ISZ RSECALC /SHOULD DONE FLAG HAVE COME UP? JMP FLGBARF /NO, COMPLAIN THERE JMP I RXWAIT /YES, RETURN RSTATUS,.-. /DRIVE STATUS / RELOCATION ADDRESSES FOR THIS PAGE. RXREL0= (RECODE-RXLOC) /POINTER TO RECODE RXREL1= (RSECT-RXLOC) /POINTER TO RSECT RXREL2= (RXERR-RXLOC) /POINTER TO RXERR RXREL3= (RXHEAD-RXLOC) /POINTER TO RXHEAD RXREL4= (RXSECTOR-RXLOC)/POINTER TO RXSECTOR RXREL5= (RXSTATUS-RXLOC)/POINTER TO RXSTATUS RXREL6= (RXSTIMO-RXLOC) /POINTER TO RXSTIMOUT RXREL7= (RXTMSETU-RXLOC)/POINTER TO RXTMSETUP RXREL8= (RXUNIT-RXLOC) /POINTER TO RXUNIT PAGE $ /THAT'S ALL FOLK!