/P?S/8 RX BYTE-MODE NON-SYSTEM HANDLER / LAST EDIT: 25-JUN-1984 10:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / P?S/8 RX01/RX02/RX03/DSD-210/440 SINGLE DENSITY BYTE-MODE NON-SYSTEM HANDLER. / SUPPORTS DOUBLE-SIDED DISKS ON RX03. / RT-11 COMPATIBLE FORMAT IS USED (ASSUMING ASCII MODE). /CALLING SEQUENCE: / CDF MYFLD /SET CALLER'S DATA FIELD / CIF HNDFLD /SET HANDLER'S INSTRUCTION FIELD / JMS I (RXBHND) /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, 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 WITH ONLY 1-4 DRIVES. / BIT[10] IS IGNORED ON ALL SYSTEMS WITH ONLY 1-2 DRIVES. / RX8B EQUATED SYMBOLS. DEVCOD= 75^10+6000 /SKELETON IOT CODE OF DISK LCD= DEVCOD+1 /LOAD COMMAND REGISTER XDR= DEVCOD+2 /TRANSFER DATA REGISTER STR= DEVCOD+3 /SKIP ON, CLEAR TRANSFER FLAG SER= DEVCOD+4 /SKIP ON, CLEAR ERROR FLAG SDN= DEVCOD+5 /SKIP ON, CLEAR DONE FLAG INTR= DEVCOD+6 /INTERRUPT ENABLE/DISABLE PER AC[11] INIT= DEVCOD+7 /INITIALIZE CONTROLLER, RECALIBRATE DRIVES / MISCELLANEOUS EQUATED SYMBOLS. NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 PAGE /CAN ACTUALLY BE ANY REASONABLE PAGE! / 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 /RBSECT,.-. /WILL CONTAIN OUR ACTUAL LOAD ADDRESS / TAD RBSECT /GET LOAD ADDRESS AND FALL THROUGH TO NEXT PAGE RBSECTO=.!177-1 /INITIALIZE HEADER RBTRACK=(TAD RBSECT) /GENERATE ADD INSTRUCTION RBSECTO=(.-.) /GENERATE HEADER IFNZRO .&177 RB70, 70 /CONSTANT 0070 / ENTRY POINT FOR HANDLER. RXBHND, .-. /ACTUAL HANDLER ENTRY POINT NL7775 /SETUP THE DCA RBTRYCOUNTER /ERROR RETRY COUNTER RDF /GET CALLING FIELD TAD (CDF) /TURN INTO CDF CALLING FIELD DCA RBTRY /STORE IN-LINE FOR RETRY LATER RBTRY, .-. /WILL BE CDF CALLING FIELD TAD I RXBHND /GET PARAMETER LIST POINTER DCA RBEXIT /STASH THE POINTER TAD I RBEXIT /GET THE TRANSFER ADDRESS DCA RBUFFER /STASH IT ISZ RBEXIT /BUMP TO NEXT TAD I RBEXIT /GET FUNCTION WORD RAL /MOVE UP AND (7600) /JUST PAGE BITS SZA /SKIP IF FULL FIELD TRANSFER CIA /ELSE INVERT FOR WORD COUNT DCA RBWC /SAVE WORD COUNT CML RTL /0 IF WRITING, 2 IF READING DCA RBFUNCTION /SAVE AS BASIC FUNCTION TAD I RBEXIT /GET FUNCTION WORD AGAIN DCA RBUNIT /SAVE FOR NOW ISZ RBEXIT /BUMP TO NEXT TAD I RBEXIT /GET BLOCK NUMBER CLL RAR /DIVIDE BY TWO TO GET TRIPLE-SECTOR NUMBER DCA RBLSECTOR /STASH IT FOR NOW RAL /GET ODDNESS BIT DCA RBUPDATE /SAVE IT TAD RBLSECTOR /GET TRIPLE-SECTOR NUMBER CLL RAL /*2 TAD RBLSECTOR /*3 DCA RBLSECTOR /STORE LOGICAL SECTOR NL0002 /SET CIF BIT TAD RBTRY /FORM CIF CDF CALLING FIELD DCA RBEXIT /STORE IN-LINE FOR EXIT LATER RBSECSW,JMS RBSECT /SECTOR CALCULATION SWITCH; WILL BE HARMLESS AND RBLOC, DCA RBSECSW /INITIALIZE SECTOR CALCULATION SWITCH RBOCDF, .-. /WILL BE CDF OUR FIELD TAD RBUNIT /GET FUNCTION WORD RB200, AND RB70/(70) /JUST FIELD BITS TAD (CDF) /MAKE INTO CDF TRANSFER INSTRUCTION DCA I RBRCDP/(RBRCDFBUFFER) /STORE IN READ ROUTINE TAD I RBRCDP/(RBRCDFBUFFER) /GET IT BACK DCA I RBWCDP/(RBWCDFBUFFER) /STORE IN WRITE ROUTINE TAD RBUNIT /GET FUNCTION WORD AGAIN AND (3) /JUST UNIT BITS CLL RTL /MOVE UP IAC /ADD ONE RTL /NOW HAVE UNITS^20+4 DCA RBUNIT /SAVE AS UNIT VALUE JMS I RBPCLEAR/(RBCLEAR) /CLEAR THE DISK FLAGS NOW TAD (16) /GET ERROR REGISTER READ VALUE LCD /THIS RAISES THE DONE FLAG AGAIN JMS I RBSEC1/(RBSECALC) /CALCULATE FIRST SECTOR TAD RBUPDATE /GET ODDNESS BIT SZA CLA /SKIP IF GOOD CALL JMP RBLODD /JUMP IF ODD CALL RBMORE, TAD RBWC /GET THE CURRENT WORD COUNT TAD RB200/(200) /COMPARE TO ONE PAGE VALUE SNA CLA /SKIP IF LARGER JMP RB1PAGE /JUMP IF ONE PAGE CALL TAD (400) /GET NORMAL UPDATE FACTOR DCA RBUPDATE /STASH IT TAD RBFUNCTION /GET BASIC FUNCTION CLL RTR /PUT INTO LINK JMP I RBPNORMAL/(RBNORMAL) /GO DO NORMAL READ OR WRITE RBFINIS,TAD (16) /GET ERROR REGISTER READ VALUE JMS I RBWAT1/(RBWAIT) /WAIT FOR DONE AND LOAD COMMAND TAD RBWC /GET CURRENT WORD COUNT TAD RBUPDATE /UPDATE IT SNA /END OF CALL? JMP RBDONE /YES DCA RBWC /NO, STORE BACK TAD RBUFFER /GET TRANSFER ADDRESS TAD RBUPDATE /UPDATE IT DCA RBUFFER /STORE BACK JMP RBMORE /KEEP GOING RBDONE, ISZ RXBHND /BUMP EXTRA TIME FOR GOOD RETURN SDN /WAIT FOR DONE FLAG JMP .-1 /FINAL TIME; WE LEAVE WITH IT CLEAR! RBEXT, ISZ RXBHND /BUMP AROUND ARGUMENT AT LEAST RBEXIT, .-. /WILL BE CIF CDF RETURN FIELD JMP I RXBHND /RETURN RB1PAGE,TAD RB200/(200) /SETUP THE DCA RBUPDATE /UPDATE FACTOR TAD RBFUNCTION /GET FUNCTION WORD SNA CLA /SKIP IF READING JMP I RBPODW/(RBODDWR)/JUMP IF WRITING TAD (-300) /SETUP BYTE TRANSFER COUNT FOR ONE PAGE READ RBODDEN,STL /INDICATE READING JMP I RBODDP/(RBODDRD)/GO DO ODD READ FUNCTION THERE RBLODD, TAD RB200/(200) /SETUP THE DCA RBUPDATE /UPDATE FACTOR TAD RBFUNCTION /GET FUNCTION WORD SZA CLA /SKIP IF WRITING JMP RBODDENTRY /JUMP IF READING; CLEAR AC INDICATES ODD PAGE READ TAD (-100) /SETUP PRE-READ SAVE COUNT FOR ODD WRITING JMP I RBPODW/(RBODDWR)/CONTINUE THERE RBFUNCT,.-. /READ/WRITE FUNCTION RBLSECT,.-. /LOGICAL SECTOR RBODDP, RBODDRD-RBLOC /**** RELOCATE **** RBPCLEA,RBCLEAR-RBLOC /**** RELOCATE **** RBPNORM,RBNORMAL-RBLOC /**** RELOCATE **** RBPODW, RBODDWR-RBLOC /**** RELOCATE **** RBRCDP, RBRCDFBUFFER-RBLOC /**** RELOCATE **** RBSEC1, RBSECALC-RBLOC /**** RELOCATE **** RBTRYCO,.-. /RETRY COUNTER RBUFFER,.-. /TRANSFER ADDRESS RBUNIT, .-. /UNIT BITS+4 STORED HERE RBUPDAT,.-. /UPDATE FACTOR RBWAT1, RBWAIT-RBLOC /**** RELOCATE **** RBWC, .-. /WORD COUNTER RBWCDP, RBWCDFBUFFER-RBLOC /**** RELOCATE **** PAGE / ONCE-ONLY INITIALIZATION CODE. / THE AC CONTAINS THE ACTUAL VALUE OF "RBLOC" RELOCATED TO THE BASE PAGE WE / WERE LOADED INTO. ALL ADDRESS CONSTANTS MUST BE UPDATED TO REFLECT THIS. / THIS AREA WILL BE USED AS A BUFFER FOR THE 64 BYTES NOT MODIFIED BY THE / CALLER DURING ODD OR SHORT WRITES. RBBUFF, DCA RBBUFF /SAVE RELOCATION VALUE RIF /GET OUR FIELD TAD (CDF) /TURN INTO CDF OUR FIELD RBTMP, DCA RBTEMP /STORE IN-LINE RBTEMP, .-. /WILL BE CDF OUR FIELD RBRLINS,TAD RBRLST /GET A RELOCATABLE ADDRESS VALUE SNA /END OF LIST? JMP RBDOIT /YES TAD RBBUFF /NO, RELOCATE IT DCA RBTMP /STASH THE RELOCATED POINTER TAD I RBTMP /GET THE ACTUAL VALUE TAD RBBUFF /RELOCATE IT DCA I RBTMP /STORE IT BACK ISZ RBRLINS /BUMP TO NEXT LIST ELEMENT JMP RBRLINS /KEEP GOING RBDOIT, TAD I RBUNTP/(RBUNIT) /GET UNIT BITS AND (60) /ISOLATE UNIT BITS TAD (412) /TURN INTO READ STATUS INSTRUCTION LCD /LOAD COMMAND SDN /DONE YET? JMP .-1 /NO, WAIT FOR IT XDR /GET STATUS AND (60) /JUST DENSITY, DENSITY ERROR BITS SZA CLA /SKIP IF RX01 JMP RBHEDOK /JUMP IF RX02, 3 TAD RB7600/(CLA) /DESTROY THE DCA I RBP01ZAP/(RB01ZAP) /HEAD CHECK TAD RB7600/(CLA) /DESTROY THE DCA I RB01PZAP/(RB01ZP) /RX02, 3 EXTRA BYTE TRANSFER RBHEDOK,TAD RBTEMP /GET CDF OUR FIELD DCA I RBPOCDF/(RBOCDF) /PUT WHERE NEEDED TAD RBTEMP /GET IT AGAIN DCA I RBPSCDF/(RBSCDF) /PUT WHERE NEEDED TAD RBTEMP /GET IT AGAIN DCA I RBPTCDF/(RBTCDF) /AS BEFORE TAD RBTEMP /YET AGAIN DCA I RBPUCDF/(RBUCDF) /REPEAT JMP I RBBUFF /RETURN TO MAIN CODE / RELOCATION LIST. RBRLST= . /RELOCATABLE ADDRESSES START HERE RBODDP-RBLOC /POINTER TO RBODDRD RBPCLEAR-RBLOC /POINTER TO RBCLEAR RBPNORMAL-RBLOC /POINTER TO RBNORMAL RBPODW-RBLOC /POINTER TO RBODDWR RBRCDP-RBLOC /POINTER TO RBRCDFBUFFER RBSEC1-RBLOC /POINTER TO RBSECALC RBWAT1-RBLOC /POINTER TO RBWAIT RBWCDP-RBLOC /POINTER TO RBWCDFBUFFER / RBPIO-RBLOC /POINTER TO RBIO RBPNEXT-RBLOC /POINTER TO RBNEXT RBPOCDF-RBLOC /POINTER TO RBOCDF RBPSCDF-RBLOC /POINTER TO RBSCDF RBPTCDF-RBLOC /POINTER TO RBTCDF RBPUCDF-RBLOC /POINTER TO RBUCDF RBP01ZAP-RBLOC /POINTER TO RB01ZAP RBUNTP-RBLOC /POINTER TO RBUNIT RBWAT2-RBLOC /POINTER TO RBWAIT RB01PZAP-RBLOC /POINTER TO RB01ZP / RBLSPT-RBLOC /POINTER TO RBLSECTOR RBPBNREC-RBLOC /POINTER TO RBNREC RBPBUFFER-RBLOC /POINTER TO RBUFFER RBPBYTLP-RBLOC /POINTER TO RBYTLP RBPCSW-RBLOC /POINTER TO RBSECSW RBPFINISH-RBLOC /POINTER TO RBFINISH RBPRBBUFFER-RBLOC /POINTER TO RBBUFFER RBSEC2-RBLOC /POINTER TO RBSECALC / RBPEXT-RBLOC /POINTER TO RBEXT RBPHEAD-RBLOC /POINTER TO RBHEAD RBPOUT-RBLOC /POINTER TO RBOUT RBPTRNS-RBLOC /POINTER TO RBTRNS RBPTRYCOUNTER-RBLOC /POINTER TO RBTRYCOUNTER RBPUNIT-RBLOC /POINTER TO RBUNIT RBTRYP-RBLOC /POINTER TO RBTRY RBYTIO-RBLOC /POINTER TO RBYTIO / RBLPSECTOR-RBLOC /POINTER TO RBLSECTOR RBPSW-RBLOC /POINTER TO RBSECSW RBSECP-RBLOC /POINTER TO RBSECTOR RBTRKP-RBLOC /POINTER TO RBTRACK RBUNT2-RBLOC /POINTER TO RBUNIT RBWTMP, RBWAT3-RBLOC /POINTER TO RBWAIT / RBYTCNT,0 /TEMPORARY; THIS ENDS THE LIST RBNREC, NL0002 /SET READ VALUE JMS I RBPIO/(RBIO) /DO DISK READ NL0002 /SET EMPTYING VALUE JMS I RBWAT2/(RBWAIT) /WAIT FOR PREVIOUS AND LOAD COMMAND TAD RB7600/(-200) /SETUP THE DCA RBYTCNT /BYTE COUNTER RBLOOP, STR /FLAG UP? JMP .-1 /NO, WAIT FOR IT XDR /YES, GET A BYTE JMS I RBPNEXT/(RBNEXT)/RETURN IT ISZ RBYTCNT /DONE ALL YET? JMP RBLOOP /NO, KEEP GOING JMP RBNREC /YES, GO READ IN NEXT SECTOR AND KEEP GOING WBNREC, DCA RBWTMP /SAVE PASSED BYTE JMS I RBWAT2/(RBWAIT) /WAIT FOR PREVIOUS AND LOAD COMMAND TAD RB7600/(-200) /SETUP THE DCA RBYTCNT /BYTE COUNTER TAD RBWTMP /GET PASSED BYTE SKP /NOT ANOTHER ONE YET! WBLOOP, JMS I RBPNEXT/(RBNEXT)/GET ANOTHER BYTE STR /FLAG UP? JMP .-1 /NO, WAIT FOR IT XDR /YES, SEND A BYTE RB7600, CLA!400 /CLEAN UP ISZ RBYTCNT /DONE ALL YET? JMP WBLOOP /NO, KEEP GOING JMS I RBPIO/(RBIO) /GO WRITE THE SECTOR OUT JMS I RBPNEXT/(RBNEXT)/GET ANOTHER BYTE JMP WBNREC /CONTINUE THERE IFNZRO WBNREC-RBNREC&4000 RBPIO, RBIO-RBLOC /**** RELOCATE **** RBPNEXT,RBNEXT-RBLOC /**** RELOCATE **** RBPOCDF,RBOCDF-RBLOC /**** RELOCATE **** RBPSCDF,RBSCDF-RBLOC /**** RELOCATE **** RBPTCDF,RBTCDF-RBLOC /**** RELOCATE **** RBPUCDF,RBUCDF-RBLOC /**** RELOCATE **** RBP01ZA,RB01ZAP-RBLOC /**** RELOCATE **** RBUNTP, RBUNIT-RBLOC /**** RELOCATE **** RBWAT2, RBWAIT-RBLOC /**** RELOCATE **** RB01PZA,RB01ZP-RBLOC /**** RELOCATE **** PAGE RBNORM, DCA RBPRWC /CLEAR PRE-READ TOSS COUNT DCA RBPOWC /CLEAR POST-READ TOSS COUNT TAD RB7400/(-400) /GET NORMAL READ COUNT RBRDCOM,DCA RBRCNT /STORE READ COUNT TAD RBPBYTLP/(RBYTLP) /GET READ POINTER SNL /SKIP IF READING TAD (WBYTLP-RBYTLP) /ELSE USE WRITE VALUE DCA RBOUT /STORE CO-ROUTINE ADDRESS TAD RBPBNREC/(RBNREC) /GET READ POINTER SNL /SKIP IF READING TAD WBOFSET/(WBNREC-RBNREC) /ELSE USE WRITE VALUE DCA RBNEXT /STORE CO-ROUTINE ADDRESS TAD I RBPBUFFER/(RBUFFER) /GET TRANSFER ADDRESS DCA RBRBUFFER /STASH IT TAD RBPRWC /GET PRE-READ TOSS COUNT SNL /SKIP IF READING JMP RBWRNORMAL /JUMP IF WRITING JMS RWASTE /THROW AWAY ANY PRE-READ WORDS RBRDLP, JMS RBRW /GET A WORD RBRCDF, .-. /WILL BE CDF TRANSFER FIELD DCA I RBRBUFFER /PUT A WORD ISZ RBRBUFFER /BUMP TO NEXT RB7400, NOP!400 /JUST IN CASE ISZ RBRCNT /DONE ALL YET? JMP RBRDLP /NO, KEEP GOING TAD RBPOWC /GET POST-READ TOSS COUNT JMS RWASTE /THROW AWAY ANY POST-READ WORDS JMP I RBPFINISH/(RBFINISH) /CONTINUE THERE RBODDRD,DCA RBPOWC /SAVE PASSED POST-READ WASTE COUNT TAD RBPOWC /GET IT BACK SNA CLA /SKIP IF ANY TAD RB7500/(-300) /ELSE SET PRE-READ BYTE WASTE COUNT VALUE DCA RBPRWC /SAVE EITHER WAY RBOWREN,TAD RW7600/(-200) /SETUP THE READ COUNT JMP RBRDCOM /CONTINUE THERE RBWRNOR,JMS RBGET /WRITE ANY PRE-BUFFER BYTES RBWCDF, .-. /WILL BE CDF TRANSFER FIELD TAD I RBRBUFFER /GET A WORD JMS RBRW /PUT A WORD ISZ RBRBUFFER /BUMP TO NEXT WBOFSET,WBNREC-RBNREC /INTER-ROUTINE OFFSET; THIS CAN BE SKIPPED ISZ RBRCNT /DONE ALL YET? JMP RBWCDF /NO, KEEP GOING TAD RBPOWC /GET POST-BUFFER BYTE COUNT JMS RBGET /WRITE ANY POST-BUFFER BYTES JMP I RBPFINISH/(RBFINISH) /CONTINUE THERE RBODDWR,DCA RBPRWC /SAVE PASSED LEADING SAVED BYTE COUNT TAD RBPRWC /GET IT BACK RB7700, SMA CLA /SKIP IF ODD PAGE WRITE TAD RB7700/(-100) /ELSE SET ONE PAGE VALUE DCA RBPOWC /SAVE EITHER WAY TAD I RBLSPT/(RBLSECTOR) /GET CURRENT LOGICAL SECTOR DCA RBRW /SAVE IT FOR LATER JMS I RBSEC2/(RBSECALC) /CALCULATE NEXT SECTOR; WE DON'T USE THIS ONE! TAD RBPBNREC/(RBNREC) /GET READ POINTER DCA RBNEXT /SETUP CO-ROUTINE ADDRESS TAD RBPOWC /GET PRE-SAVE WASTE COUNT JMS RWASTE /TOSS ANY FRONTAL BYTES TAD RBPRBBUFFER/(RBBUFFER) /SETUP THE DCA RWASTE /BUFFER POINTER TAD RB7700/(-100) /SETUP THE DCA RBOUT /BYTE COUNTER RBPUTLP,JMS RWBYTE /GET A BYTE DCA I RWASTE /PUT A BYTE ISZ RWASTE /BUMP TO NEXT ISZ RBOUT /DONE ALL YET? JMP RBPUTLP /NO, KEEP GOING TAD RBPRWC /GET POST-SAVE WASTE COUNT JMS RWASTE /TOSS ANY REAR BYTES TAD RBRW /GET SAVED LOGICAL SECTOR DCA I RBLSPT/(RBLSECTOR) /RESTORE IT TAD RBPRWC /GET LEADING COUNT AGAIN SZA CLA /SKIP IF ONE PAGE ISZ I RBLSPT/(RBLSECTOR) /NEED NEXT FOR ODD PAGE DCA I RBPCSW/(RBSECSW) /CLEAR CALCULATION SWITCH JMS I RBSEC2/(RBSECALC) /RECALCULATE SECTOR CLL /CLEAR LINK TO INDICATE WRITING JMP RBOWRENTRY /CONTINUE THERE RWASTE, .-. /READ WASTE ROUTINE SNA /SKIP IF ANY TO WASTE JMP I RWASTE /ELSE JUST RETURN DCA RBGET /SAVE PASSED COUNT RWASTLP,JMS RWBYTE /GET A BYTE RW7600, CLA!400 /CONSTANT 7600; THIS CLEARS THE AC ISZ RBGET /DONE YET? JMP RWASTLP /NO, KEEP GOING JMP I RWASTE /YES, RETURN RBGET, .-. /GET BUFFERED BYTES ROUTINE RB7500, SMA /SKIP IF ANY TO GET JMP I RBGET /ELSE JUST RETURN DCA RWASTE /SAVE PASSED BYTE COUNT TAD RBPRBBUFFER/(RBBUFFER) /SETUP THE DCA RBRW /BUFFER POINTER RBSCDF, .-. /WILL BE CDF OUR FIELD TAD I RBRW /GET A BYTE JMS RWBYTE /PUT A BYTE ISZ RBRW /BUMP TO NEXT ISZ RWASTE /DONE ALL YET? JMP RBSCDF /NO, KEEP GOING JMP I RBGET /YES, RETURN RBRW, .-. /WORD CO-ROUTINE JMP I RBOUT /GO WHEREVER RBOUT, .-. /WORD EXIT ROUTINE JMP I RBRW /RETURN TO CALLER RWBYTE, .-. /BYTE CO-ROUTINE JMP I RBNEXT /GO WHEREVER RBNEXT, .-. /BYTE EXIT ROUTINE JMP I RWBYTE /RETURN TO MAIN CALLER RBLSPT, RBLSECTOR-RBLOC /**** RELOCATE **** RBPBNRE,RBNREC-RBLOC /**** RELOCATE **** RBPBUFF,RBUFFER-RBLOC /**** RELOCATE **** RBPBYTL,RBYTLP-RBLOC /**** RELOCATE **** RBPCSW, RBSECSW-RBLOC /**** RELOCATE **** RBPFIN, RBFINISH-RBLOC /**** RELOCATE **** RBPOWC, .-. /POST-READ WASTE COUNTER RBPRBBU,RBBUFFER-RBLOC /**** RELOCATE **** RBPRWC, .-. /PRE-READ WASTE COUNTER RBRCNT, .-. /READ WORD COUNTER RBRBUFF,.-. /READ TRANSFER ADDRESS RBSEC2, RBSECALC-RBLOC /**** RELOCATE **** PAGE RBFOO= (60) /DEFINE LITERAL HERE IFNZRO RBFOO&177-177 RBYTLP, JMS I RBYTIO/(RWBYTE) /GET FIRST BYTE DCA RBTEM1 /STORE IT JMS I RBYTIO/(RWBYTE) /GET SECOND BYTE DCA RBTEM2 /STORE IT JMS I RBYTIO/(RWBYTE) /GET THIRD BYTE RTL;RTL /MOVE OVER DCA RBTEM3 /STORE IT TAD RBTEM3 /GET IT BACK AND (7400) /JUST A NYBBLE TAD RBTEM1 /ADD ON FIRST BYTE JMS I RBPOUT/(RBOUT) /RETURN A WORD TAD RBTEM3 /GET THIRD BYTE RTL;RTL /MOVE OVER AND (7400) /JUST A NYBBLE TAD RBTEM2 /ADD ON SECOND BYTE JMS I RBPOUT/(RBOUT) /RETURN A WORD JMP RBYTLP /KEEP GOING WBYTLP, DCA RBTEM1 /SAVE FIRST WORD TAD RBTEM1 /GET FIRST BYTE JMS I RBYTIO/(RWBYTE) /SEND IT JMS I RBPOUT/(RBOUT) /GET NEXT WORD DCA RBTEM2 /SAVE IT TAD RBTEM2 /GET SECOND BYTE JMS I RBYTIO/(RWBYTE) /SEND IT TAD RBTEM2 /GET SECOND WORD AND (7400) /ISOLATE THIRD BYTE NYBBLE CLL RTR;RTR /MOVE DOWN DCA RBTEM3 /SAVE IT TAD RBTEM1 /GET FIRST WORD AND (7400) /ISOLATE THIRD BYTE NYBBLE TAD RBTEM3 /JOIN THE NYBBLES TOGETHER RTR;RTR /MOVE DOWN TO PROPER POSITION JMS I RBYTIO/(RWBYTE) /SEND THIRD BYTE JMS I RBPOUT/(RBOUT) /GET NEXT WORD JMP WBYTLP /CONTINUE THERE IFNZRO WBYTLP-RBYTLP&4000 RBWAIT, .-. /WAIT ROUTINE RBTCDF, .-. /WILL BE CDF OUR FIELD TAD (100) /ADD ON BYTE MODE BIT DCA RBSTATUS /SAVE PASSED COMMAND VALUE JMS I RBPHEAD/(RBHEAD) /CHECK IF SECOND HEAD NEEDED TAD (1000) /SET SECOND HEAD BIT TAD RBSTATUS /ADD ON TO COMMAND DCA RBSTATUS /SAVE FOR OTHERS SDN /FLAG UP? JMP .-1 /NO, WAIT FOR IT SER /ANY ERRORS? JMP RBWATOK /NO, KEEP GOING XDR /GET STATUS NOW AND RB377/(377) /JUST VALID BITS DCA RBXSTATUS /SAVE FOR OTHERS TAD (16) /GET ERROR REGISTER READ VALUE JMS RBSTATUS /GET ERROR CODE VALUE DCA RBCODE /SAVE IT TAD I RBPUNIT/(RBUNIT) /GET UNIT BITS+4 TAD (412-4) /TURN INTO READ STATUS INSTRUCTION JMS RBSTATUS /GET STATUS VALUE DCA RBSTATUS /SAVE IT TAD RBSTATUS /GET IT BACK AND (200) /JUST READY BIT SNA CLA /SKIP IF READY JMP RBERRGO /JUMP IF NOT TAD RBCODE /GET ERROR CODE TAD RB770A/(7700) /COMPARE TO WRITE-LOCK ERROR VALUE SNA CLA /SKIP IF OTHER JMP RBERRGO /JUMP IF IT MATCHES TAD RBSTATUS /GET CURRENT STATUS RB377, AND (60) /JUST DENSITY, DENSITY ERROR BITS SZA CLA /SKIP IF RX01 TAD (21-3) /ELSE SET DENSITY, CRC BITS TAD RB3/(3) /USE PARITY, CRC BITS AND RBXSTATUS /ISOLATE PROPER BITS SNA CLA /SKIP IF NORMAL ERROR INIT /ELSE CLEAR THE WORLD OF ERRORS RBERRGO,JMS RBCLEAR /CLEAR DISK FLAGS ISZ I RBPTRYCOUNT/(RBTRYCOUNT)/TOO MANY ERRORS? JMP I RBTRYP/(RBTRY) /NO, TRY AGAIN TAD RBXSTATUS /YES, GET POSSIBLY USEFUL STATUS JMP I RBPEXT/(RBEXT) /TAKE ERROR RETURN RBWATOK,TAD RBSTATUS /GET DESIRED COMMAND LCD /LOAD IT TAD RBSTATUS /GET COMMAND BACK RTL;RTL;RAL /MOVE TO AC[10-11] AND RB3/(3) /ISOLATE HEAD, DENSITY BITS RB01ZP, JMS I RBPTRNS/(RBTRNS) /**** RX01 **** CLA JMP I RBWAIT /TAKE GOOD RETURN RBCLEAR,.-. /DISK FLAGS CLEAR ROUTINE TAD (16) /GET ERROR REGISTER READ VALUE JMS RBSTATUS /LOAD COMMAND AND WAIT FOR DONE FLAG RB770A, SMA CLA /THIS CLEARS THE AC RB3, 3 /CONSTANT 0003; THIS CAN BE SKIPPED JMP I RBCLEAR /RETURN RBSTATU,.-. /READ STATUS STORED HERE LCD /LOAD PASSED COMMAND SER /SKIP ON, CLEARING ERROR FLAG SDN /DONE FLAG UP? JMP .-2 /NO, WAIT FOR IT XDR /YES, GET ERROR CODE OR STATUS AND RB377/(377) /JUST VALID BITS JMP I RBSTATUS /RETURN RBCODE, .-. /SPECIFIC ERROR CODE STORED HERE RBPEXT, RBEXT-RBLOC /**** RELOCATE **** RBPHEAD,RBHEAD-RBLOC /**** RELOCATE **** RBPOUT, RBOUT-RBLOC /**** RELOCATE **** RBPTRNS,RBTRNS-RBLOC /**** RELOCATE **** RBPTRYC,RBTRYCOUNTER-RBLOC /**** RELOCATE **** RBPUNIT,RBUNIT-RBLOC /**** RELOCATE **** RBTEM1, .-. /TEMPORARY RBTEM2, .-. /TEMPORARY RBTEM3, .-. /TEMPORARY RBTRYP, RBTRY-RBLOC /**** RELOCATE **** RBXSTAT,.-. /ERROR STATUS STORED HERE RBYTIO, RWBYTE-RBLOC /**** RELOCATE **** PAGE IFNZRO .&177 RB760A, 7600 /CONSTANT 7600 RBFOO= (7400) /DEFINE LITERAL HERE IFNZRO RBFOO&177-177 RBSECNX,ISZ I RBLPSECTOR/(RBLSECTOR) /BUMP LOGICAL SECTOR NOW NL0002 /SET INCREMENT TAD I RBSECP/(RBSECTOR) /BUMP SECTOR TAD (-32) /COMPARE TO LIMIT SPA SNA /SKIP IF NOW SMALL ENOUGH TAD RB32/(32) /ELSE RESTORE VALUE DCA I RBSECP/(RBSECTOR) /STORE CORRECTED VALUE TAD RBDIV /GET FIRST SECTOR ON TRACK CIA /INVERT FOR TEST TAD I RBSECP/(RBSECTOR) /COMPARE TO LATEST SZA CLA /SKIP IF WE CAME AROUND JMP I RBSECALC /RETURN IF NOT TAD I RBSECP/(RBSECTOR) /GET THE SECTOR RAR /MOVE ODDNESS BIT TO LINK SNL CLA /SKIP IF ODD JMP RBCALC /JUMP IF EVEN ISZ RBDIV /BUMP TO FIRST EVEN SECTOR ON TRACK TAD RBDIV /GET THE VALUE DCA I RBSECP/(RBSECTOR) /USE AS NEXT SECTOR JMP I RBSECALC /RETURN RBDIV, .-. /DIVIDE ROUTINE RBDIVLP,CLL RAL /MOVE OVER TAD (-15^400) /DO WE HAVE THIS ONE? SNL /SKIP IF SO JMP RBPUTBK /JUMP IF NOT IAC /BUMP QUOTIENT IF SO RBCNTIT,ISZ RBSHFT /DONE ALL YET? JMP RBDIVLP /NO, KEEP GOING JMP I RBDIV /RETURN RBPUTBK,TAD (15^400) /PUT IT BACK JMP RBCNTIT /AND KEEP GOING / SECTOR CALCULATION ROUTINE. RBSECAL,.-. /SECTOR CALCULATION TAD I RBPSW/(RBSECSW) /GET CALCULATION SWITCH SZA CLA /SKIP IF FIRST TIME JMP RBSECNEXT /JUMP IF NOT RBCALC, TAD RB7770/(7770) /SETUP THE DCA RBSHFT /SHIFT COUNT JMS RBHEAD /CHECK FOR SECOND HEAD USAGE TAD (4110) /REDUCE LOGICAL SECTOR SIZE IF SECOND HEAD TAD I RBLPSECTOR/(RBLSECTOR) /USE LOGICAL SECTOR AT LEAST JMS RBDIV /DIVIDE LOGICAL SECTOR BY 13 DCA RBDIV /SAVE QUOTIENT AND REMAINDER TAD RBDIV /GET IT BACK AND RB377A /ISOLATE QUOTIENT BITS CLL RAR /DIVIDE BY TWO; LOW-ORDER BIT TO LINK DCA I RBTRKP/(RBTRACK) /SAVE AS UNCORRECTED TRACK TAD RBDIV /GET REMAINDER RB377A, AND (7400) /JUST REMAINDER BITS SZL /SHOULD WE ADD ONE FOR INTERLEAVE? TAD RB200A/(200) /YES CLL RTL;RTL;RTL /MOVE DOWN DCA I RBSECP/(RBSECTOR) /SAVE UNCORRECTED SECTOR TAD (7771) /SETUP THE DCA RBSHFT /SHIFT COUNT TAD I RBTRKP/(RBTRACK) /GET THE TRACK BACK CLL RAL /*2 TAD I RBTRKP/(RBTRACK) /*3 RAL /*6 JMS RBDIV /DIVIDE TRACK*6 BY 26 RB200A, AND RB760A/(7600) /ISOLATE REMAINDER BITS CLL RTL;RTL;RTL /MOVE DOWN IAC /ADD ONE FOR ORIGIN ONE DCA RBDIV /SAVE LOWEST (ODD) SECTOR ON TRACK TAD I RBSECP/(RBSECTOR) /GET UNCORRECTED SECTOR TAD RBDIV /ADD ON LOWEST SECTOR ON TRACK TAD (-32) /COMPARE TO LARGEST ALLOWED SPA SNA /SKIP IF NOW SMALL ENOUGH TAD RB32/(32) /ELSE RESTORE IT CLL RAR /MOVE ODDNESS BIT TO LINK SNL /SKIP IF ODD ISZ RBDIV /ELSE BUMP TO FIRST EVEN SECTOR RAL /RESTORE VALUE DCA I RBSECP/(RBSECTOR) /STORE CORRECTED SECTOR ISZ I RBTRKP/(RBTRACK) /CORRECT TRACK FOR ORIGIN ONE ISZ I RBPSW/(RBSECSW) /SET THE CALCULATION SWITCH JMP I RBSECALC /RETURN RBIO, .-. /LOW-LEVEL DISK I/O ROUTINE RBUCDF, .-. /WILL BE CDF OUR FIELD TAD I RBUNT2/(RBUNIT) /ADD ON UNIT BITS+4 TO PASSED AC VALUE JMS I RBWAT3/(RBWAIT) /WAIT FOR PREVIOUS AND LOAD COMMAND TAD I RBSECP/(RBSECTOR) /GET SECTOR JMS RBTRNS /SEND IT TAD I RBTRKP/(RBTRACK) /GET TRACK JMS RBTRNS /SEND IT JMS RBSECALC /CALCULATE NEXT SECTOR JMP I RBIO /RETURN RBTRNS, .-. /DATA TRANSFER ROUTINE STR /FLAG UP? JMP .-1 /NO, WAIT FOR IT XDR /YES, TRANSFER THE DATA RB7770, SPA SNA SZL CLA /CONSTANT 7770; THIS CLEARS THE AC RB32, 32 /CONSTANT 0032; THIS CAN BE SKIPPED JMP I RBTRNS /RETURN RBHEAD, .-. /HEAD CHECK ROUTINE TAD I RBLPSECTOR/(RBLSECTOR) /GET LOGICAL SECTOR CLL /CLEAR LINK FOR TEST TAD (4110) /ADD ON LIMITING VALUE RB01ZAP,SNL CLA /**** RX01 **** CLA ISZ RBHEAD /TAKE SKIP RETURN IF ONE HEAD JMP I RBHEAD /RETURN RBLPSEC,RBLSECTOR-RBLOC /**** RELOCATE **** RBPSW, RBSECSW-RBLOC /**** RELOCATE **** RBSECP, RBSECTOR-RBLOC /**** RELOCATE **** RBSHFT, .-. /SHIFT COUNTER RBTRKP, RBTRACK-RBLOC /**** RELOCATE **** RBUNT2, RBUNIT-RBLOC /**** RELOCATE **** RBWAT3, RBWAIT-RBLOC /**** RELOCATE **** PAGE