/23 RTS-8 V3 FLOPPY DISK HANDLER / /EDIT HISTORY: / V2B FIXES (S.R.) /1. ADDED POWER FAIL CODE /2. FIX BUG RE 8-BIT MODE READS /3. ADDED MODBIT TO CMD /4. ALLOWED POSSIBILITY OF AN RX CONTROL FILE /5. REMOVED MODBIT, USED MSK INSTEAD, BUMMED LOCATIONS / #10 V2B CONVERSION TO MACREL / #11 BRING IN POWER FAIL FIXES / #12 TASK MACRO, CIF,CDF 0 / #23 REMAKE / VERS=23. / / / / / / / / / / /COPYRIGHT (C) 1975,1976,1977,1978,1979 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / XLIST 0 /LIST TASK / SR / MESSAGE FORMAT: /RXMESG,ZBLOCK 3 / CODE+DEL+MODE+UNIT / RW+PAGES+FIELD / BUFADD / BLOKNO / STATUS /MODE= 0 TRANSFER IN 12-BIT MODE / 100 TRANSFER IN 8-BIT MODE /CODE= 0 IGNORE DEL AND USE PAGES & BLOKNO IN OS/8 SENSE / 4000 SPECIAL PHYSICAL SECTOR ACTION. IGNORE PAGES AND / ASSUME BLOKNO HAS FORM TTTTTTTSSSSS / SPECIFYING ABSOLUTE PHYSICAL TRACK AND SECTOR NUMBER /DEL= 0 DON'T CONSIDER DELETED DATA MARKS / 2000 HANDLE DELETED DATA MARK (IF CODE=4000) / IF WRITING SECTOR, WRITE DELETED DATA INDICATION / IF READING SECTOR, ALWAYS RETURN STATUS WORD / SET STATUS BIT 5 TO A 1 IF READ DELETED DATA INDICATION / OTHER ERROR BITS STILL SET (STATUS NEGATIVE IF HARD ERROR) /GENERAL INFORMATION: /THERE ARE 128 BYTES PER SECTOR, /26 SECTORS PER TRACK NUMBER 1-26 DECIMAL (1-32 OCTAL) /77 TRACKS PER FLOPPY NUMBERED 0-76 DECIMAL (0-114 OCTAL) /IN 12-BIT MODE, THERE ARE 64 WORDS PER SECTOR (4 SECTORS PER OS/8 BLOCK) /IN 8-BIT MODE, THERE ARE 128 BYTES PER SECTOR (2 SECTORS PER OS/8 BLOCK) /STANDARD RTS-8, OS/8 INTERLEAVE SCHEME ON FLOPPY IS AS FOLLOWS: / SINGLE DOUBLE / OS/8 LOGICAL PHYSICAL PHYSICAL LOGICAL PHYSICAL PHYSICAL / BLK REC # TRACK# SECTORS REC # TRACK# SECTORS /0 0-3 1 1,3,5,7 0-1 1 1,4 /1 4-7 1 9,11,13,15 2-3 1 7,10 /2 8-11 1 17,19,21,23 4-5 1 13,16 /3 12-15 1 25,2,4,6 6-7 1 19,22 /4 16-19 1 8,10,12,14 8-9 1 25,2 /5 20-23 1 16,18,20,22 10-11 1 5,8 /6 24-27 1/2 24,26/1,3 12-13 1 11,14 /7 28-31 2 5,7,9,11 14-15 1 17,20 /8 32-35 2 13,15,17,19 16-17 1 23,26 /9 36-39 2 21,23,25,2 18-19 1 3,6 /10 40-43 2 4,6,8,10 20-21 1 9,12 /11 44-47 2 12,14,16,18 22-23 1 15,18 /12 48-51 2 20,22,24,26 24-25 1 21,24 /13 52-55 3 1,3,5,7 26-27 2 1,4 /... ... /ALGORITHM TO CONVERT OS/8 BLOCK NUMBER (SINGLE) TO PHYSICAL TRACK AND SECTOR #S: /1. MULTIPLY OS/8 BLOCK NUMBER, B, BY 4 TO GET INITIAL LOGICAL / RECORD NUMBER. (NEXT 3 LOGICAL RECORD NUMBERS ARE SEQUENTIAL.) /2. DIVIDE LOGICAL RECORD NUMBER BY 13 TO GET QUOTIENT Q / AND REMAINDER R. /3. DIVIDE QUOTIENT Q BY 2 TO GET NEW QUOTIENT T AND NEW REMAINDER S. /4. PHYSICAL TRACK NUMBER IS 1+T . /5. PHYSICAL SECTOR NUMBER IS 1+2*R+S . /FORMAT OF RX8E COMMAND REGISTER: /BITS 0-3 UNUSED /BIT 4 MAINTENANCE /BIT 5 MODE BIT (1 MEANS 8-BIT MODE, 0 MEANS 12-BIT MODE) /BIT 6 UNUSED /BIT 7 DRIVE /BITS 8-10 FUNCTION / 000 FILL BUFFER / 001 EMPTY BUFFER / 010 WRITE SECTOR / 011 READ SECTOR / 100 UNUSED / 101 READ STATUS / 110 WRITE DELETED DATA SECTOR / 111 MAINTENANCE /BIT 11 UNUSED /FORMAT OF RX8E STATUS WORD: /BITS 0-3 UNUSED /BIT 4 SELECTED DRIVE READY /BIT 5 DELETED DATA INDICATION /BITS 6-7 UNUSED /BIT 8 UNUSED BUT RESERVED FOR FUTURE USE /BIT 9 INIT DONE /BIT 10 PARITY ERROR /BIT 11 CRC ERROR /A FLOPPY CONTAINS 3722(8)=2002(10) SECTORS. /SINCE 26(10)=32(8) ARE NOT USED BY OS/8, /THE HIGHEST LOGICAL RECORD # IS 1975(10)=3667(8). /THUS THE LARGEST OS/8 BLOCK NUMBER IS 493(10)=755(8). /IN OTHER WORDS, A FLOPPY CONTAINS 494(10) OS/8 BLOCKS OF DATA. IFNDEF TASK /MAY BE EDITED TO 'RX8B', 'RX8C', OR 'RX8D' . /OR MAY INCLUDE AN RXCF IFNDEF RXDVCD /DEVICE CODE OF FLOPPY CONTROLLER RXCODE=RXDVCD^10 LCD= 6001+RXCODE /LOAD COMMAND REGISTER XDR= 6002+RXCODE /TRANSFER DATA REGISTER STR= 6003+RXCODE /SKIP ON TRANSFER REQUEST FLAG, CLEAR FLAG SER= 6004+RXCODE /SKIP ON ERROR FLAG, CLEAR FLAG SDN= 6005+RXCODE /SKIP ON DONE FLAG, CLEAR FLAG INTR= 6006+RXCODE /INTERRUPT ENABLE/DISABLE INIT= 6007+RXCODE /INITIALIZE CONTROLLER AND RECALIBRATE DRIVES .XSECT XRX\TASK X10, 0 .ZSECT ZRX\TASK FIELD XRX\TASK TYPE, STORE /POINT TO TYPE INDICATOR WORD FOR THIS UNIT / ANY ODD VALUE = NOT YET INITIALIZED / 0000 = SINGLE DENSITY DRIVE / 4010 = SINGLE DENSITY MEDIA ON DOUBLE DENSITY DRIVE / 3770 = DOUBLE DENSITY DRIVE AND MEDIA / 3772 = DOUBLE HEADED DRIVE AND MEDIA / .RSECT RRX\TASK FIELD XRX\TASK .TASK TASK,RX GRAB=(400 /FORCE LITERAL TO END OF PAGE WC, START, CAL /INSERT INTERRUPT SKIP IN SKIP CHAIN DFLAG, SKPINS / <0 WAITING, =0 FINISHED, >0 PENDING /FLOPPY IS INITIALLY BUSY IOWRD, INTRPT /DENSITY, UNIT, 8/12 MODE, +2 IF A READ SPECL, JMS I MADDR /SET INTERRUPTS ON, ETC. IFDEF PWRF < / FNCTN, CAL /CODE+DEL+MODE+UNIT /ONCE-ONLY CODE STATUS, SENDW /DERAIL MESSAGE FOR POWERFAIL FN, PWRF /RW+PAGES+FIELD TRYCNT, PWFMSG > / IFNDEF PWRF < / FNCTN, NOP / STATUS, NOP /A COPY OF ORIGINAL MADDR POINTER FN, NOP / TRYCNT, NOP /RETRY COUNT (OVER WHOLE OPERATION!) > / LOOP, CAL RECEIV /GET A MESSAGE MADDR, BLAST /ADDR OF MESSAGE HERE GOTONE, DCA MSGFLD /CDF TO FIELD OF MESSAGE LEFT IN AC AC7775 /SET UP RETRY COUNTER DCA TRYCNT REDO, STA /MAKE WORKING COPY OF MESSAGE POINTER TAD MADDR DCA ZOT JMS GET /GET UNIT AND SPECIAL FUNCTIONS BIT DCA FNCTN JMS GET /GET FUNCTION WORD DCA FN STA /TO AUTO-INCR, SO MINUS 1 JMS GET /GET BUFFER ADDRESS DCA X10 JMS GET /GET BLOCK NUMBER DCA BLOCK CDF .FLD TAD FNCTN /GET 100 BIT FOR AN EIGHT BIT REQUEST AND LX101 /NEED 100, AND 1, AND CLEAR INBETWEEN TAD (17 /MAKE THE 20 BIT IF UNIT 1 AND (120 DCA IOWRD CLA IAC /SET UP POIONTER TO TYPE WORD AND FNCTN /LEAVING 0 OR 1 IN AC TAD (STORE /MAKE POINTER TO STORED DCA TYPE /ALL REFERENCES WILL BE INDIRECT LX101, CLA CLL IAC /CHECK FOR INITIALIZATION AND I TYPE /UNINITED HAS AN ODD VALUE SZA CLA /SKIP IF INITED JMP NOTRED /GO INIT THIS UNIT / / CONVERT TYPE DATA TO VARIOUS COUNTERS ETC. / TAD I TYPE /SECTOR SIZE/2 CLL RTL /LEAVE LINK ON IF DOUBLE DENSITY IFZERO OMNI < CLA TAD (100 > IFNZRO OMNI TAD IOWRD /ADD UP TO 200 IF EIGHT BIT MODE AND LX300 /KILL OFF BIT AT 20 SNL /SKIP IF DOUBLE DENSITY RAR /SINGLE DENSITY, DIVIDE BY 2 CIA /MAKE MINUS TO BE COUNTER DCA SS /SINGLE; 12BIT=-40, 8BIT=-100: DOUBLE; TWICE AS MUCH TAD I TYPE /GET DENSITY BIT FROM TYPE L377, AND (400 /DOUBLE DENSITY BIT TAD IOWRD /MERGE IN WITH UNIT AND 8BIT MODE DCA IOWRD /400 IF DOUBLE + 100 IF 8BIT + 20 IF UNIT #1 IFNZRO HGHFLD < TAD FN IFZERO KT8A < AND (70 /ISOLATE FIELD OF BUFFER > IFNZRO KT8A < CLL RTR /64K BIT TO LINK AND (17 /KEEPING ONLY FIELD BITS SZL /SKIP IF NO 64K BIT TAD (20 /REPOSITION 64K BIT CLL RTL > > TAD (CDF DCA WRCDF /PLACE IN WRITE LOOP TAD FN RAL AND L7600 DCA WC /STORE POSITIVE WORD COUNT! SZL /R/W BIT IN LINK JMP SPTEST /WRITE, LEAVE IOWRD ALONE ISZ IOWRD /READ, ADD 2 TO IOWRD ISZ IOWRD SPTEST, TAD FNCTN /IS IT A SPECIAL FUNCTION REQUEST SMA CLA /SKIP IF YES JMP DIVIT /NO, GO DO DIVIDE SETUP RTR /LINK 0, AC=2000 IF WRITE, OTHERWISE 0 TAD FNCTN /CARRIES TO LINK IF WRITE, SPECL, DEL AND (400 /KEEP SECOND HEAD BIT SZL /SKIP IF NOT SPECIAL MODE WRITE TAD (3 /SPECIAL MODE WRITE, PUT IN CODE CLL RAL /1000 IF SECOND HEAD, 6 IF SPECIAL MODE DCA SPECL TAD SS IFZERO OMNI IFNZRO OMNI DCA WC /LOOP ONE SECTOR WORTH TAD BLOCK AND (37 DCA SECTOR TAD BLOCK RTR / RTR / AND L377 / CLL RAR / DCA TRACK /STORE TRACK VALUE FOR I/O ROUTINE JMP MAINI DONE, TAD FNCTN CMA RAL SZL SPA CLA /SKIPPING CLEAR OF STATUS UNLESS SPECIAL&DEL ERREX, DCA STATUS /ERROR ENTERS HERE TO DEPOSIT STATUS JMS GET /SET UP DF TO CALLER! L7600, 7600 /CLA TAD STATUS DCA I ZOT /USE RUNNING ADDR POINTER TAD MSGFLD DCA EFCDF LX300, AC7775 /USE ORIGINAL COPY OF POINTER TAD MADDR CAL POST /POST EVENT FLAG POINTED TO BY AC ZOT, EFCDF, HLT /FIELD OF EVENT FLAG JMP LOOP /GET ANOTHER MESSAGE BLOCK, /CAN BE SAME LOC AS GET GET, 0 /CHANGE DF TO FIELD OF MSG; GET NEXT ENTRY MSGFLD, HLT ISZ ZOT /USE COPY OF MADDR, NOT ORIGNAL TAD I ZOT JMP I GET / / PAGE / D, /THIS TEMPORARY MUST BE AT TOP OF PAGE!! INTRLV, 0 TRACK, 0 SECTOR, 0 STORE, 1 /BY UNIT #: NON-INIT=ODD VALUE, SINGLE=0 1 /DOUBLE=3770, QUAD=3772, SINGLE/DOUBLE=4010 / /STORE IS ON THIS PAGE SIMPLY FOR FIT / / / DO I/O TO DISK / / LINK IS USED THRUOUT THIS ROUTINE, WATCH IT / DISKIO, 0 /READ OR WRITE RECORD TAD (4 /TURN SILO OPERATION IN IOWRD TO R/W OPERATION TAD SPECL /DELETED MODE, AND HEAD BIT JMS LDCMD /RETURNS WITH LINK AND AC =0 ! TAD SECTOR STR JMP .-1 XDR LX1000, TAD INTRLV /-30 FOR DOUBLE, -31 FOR SINGLE SNL /SKIP IF NEED SPECIAL ACTION JMP B2 /NO, JUST GO REMAKE SECTOR INXXX, HLT /SNL (MUST SKIP) FOR DOUBLE, IAC FOR SINGLE AND INXXX /REVERSE 1 AND 0 FOR SINGLE DENSITY CASE SZA /SKIP IF NEED TO INCREMENT TRACK LX7000, CML /MAKE LINK COME OUT OK AFTER TRACK DONE TAD (-32 B2, TAD (33 /CANCEL OUT -30 OR -31 TO ADD 3 OR 2 DCA SECTOR /FOR NEXT TIME TAD TRACK STR JMP .-1 XDR SZL /SKIP IF NEED TO INCREMENT TRACK JMP GOWAIT /NO, GO WAIT (CAN DO WITH NON0 AC) TAD (-114 /TRACK ABOUT TO BE TOO BIG? SZA CLA /SKIP IF YES JMP KCKTRK /GO INCREMENT TRACK TAD SPECL /(LINK=1 HERE) ADD IN THE 1000 HEAD BIT TAD LX7000 /HAS 7000 PLUS OTHER, FLIP LINK IF ALREADY DONE 2ND HEAD AND LX1000 /STRIP EXTRA DCA SPECL SZL CLA /SKIP IF OFF DOUBLE HEADER DISK; WILL ERROR / /ON BAD TRACK NEXT TIME DCA TRACK /ZERO TRACK, TO BE INCREMENTED TO ONE KCKTRK, ISZ TRACK GOWAIT, JMS WATSUB / WAIT FOR DONE FLAG TO COME UP XDR /WHAT WAS STATUS OF OPERATION AND (377 /KEEP ONLY 8 REAL BITS DCA STATUS /SAVE EIGHT BITS WORTH, ERROR BIT ON LATER SER /SKIP IF AN ERROR, AND CLEAR ERROR FLAG JMP I DISKIO /ALL SET, GO BACK JMP ERRPRO /GO TO ERROR PROCESSOR / / /ROUTINE TO DIVIDE REC BY 13 GIVING QUOTIENT TRACK AND REMAINDER IN SECTOR. / / USED ONCE AT CALL TIME, THEN GO TO MAINI / DIVIT, TAD I TYPE /BLOCK *4 FOR SINGLE, *2 FOR DOUBLE SPA SNA CLA /SKIP ON DOUBLE TAD BLOCK SMA /NEGATIVE BLOCK #, FORCE TO ILLEGAL TAD BLOCK CLL RAL /REST OF MULTIPLY DCA SECTOR /PLACE LOGICAL SECTOR NUMBER TAD I TYPE /BRING UP TO TEST FOR A QUAD DISK SZL /SKIP IF SECTOR NUMBER WAS LEGAL JMP SIZIT /FORCE SIZING OF MEDIA CLL RTR SNL CLA /SKIP IF QUAD JMP SHUNT /NO, GO DO REGULAR, LINK AND AC=0 TAD SECTOR TAD (-3670 /TOO BIG SNL /SKIP IF NOT TOO BIG DCA SECTOR /TOO BIG, REPLACE NUMBER AFTER FIRST HEAD CML CLA RAR /CLEAR AC, COMPLEMENTED LINK TO BE HEAD BIT RTR /PUT BIT IN 1000 POSITION SHUNT, DCA SPECL /LINK=0, CLEAR OR 1000 SPECL, DEPENDING! TAD (-200^15 DCA D DCA TRACK DLOOP, TAD D /ENTER WITH LINK =0 TAD SECTOR LSNL, SNL SKP CLA DCA SECTOR TAD TRACK RAL DCA TRACK TAD D CLL CML RAR DCA D SNL /13 EVENTUALLY TRIES TO SHIFT INTO LINK JMP DLOOP / / MOD 13 REMAINDER IS NOW IN SECTOR / TAD TRACK CLL RAR /QUOTIENT IS NOW TRACK-1 IAC /SINCE WE'RE OFFSETTING EVERYTHING UP ONE TRACK DCA TRACK /SO THAT WE DON'T TOUCH PHYSICAL TRACK 0 TAD (-31 /DEFAULT 2 INTERLEAVE DCA INTRLV /TO BE USED FOR EACH SECTOR SET UP TAD I TYPE /NOW, WHICH KIND OF INTERLEAV??? SMA SZA CLA /SKIP ON SINGLE JMP INDU /GO TO DO DOUBLE TAD SECTOR /LINK IS NOW TO BE ADDED TO 2^REMAINDER RAL LITIAC, IAC /SECTORS BEGIN COUNTING AT 1 DCA SECTOR TAD LITIAC /LITERAL IAC TO PLACE INTO SWITCH IN INTERLEAVE CODE DVJOIN, DCA INXXX JMP MAINI / INDU, SZL TAD (15+15+15 TAD SECTOR TAD SECTOR TAD SECTOR /REGULAR QUOTIENT TIMES 3 TAD (-32 /DIVIDE BY 26 SMA JMP .-2 TAD (33 /27 TO START SECTORS AT 1 DCA SECTOR ISZ INTRLV /SET UP -30 FOR 3 INTERLEAVE TAD LSNL /FILL DYNAMIC SHUNTER JMP DVJOIN /REJOIN OTHER CASE / PAGE / GRAB1=(20 /GRAB LITERAL TO MAKE A 377 CMD, TCOUNT, 0 SS, 0 /SECTOR SIZE/2 (MINUS) / / / NOTE: /IF YOU ARE TIGHT ON SPACE, SS CAN BE THE / /SAME AS BLAST, AND CMD/TCOUNT THE SAME AS WATSUB / / ERROR PROCESSOR, COME IN FROM DISKIO ON AN ERROR / ERRPRO, JMS BLAST /CLEAR OUT THE CONTROLLER NOTRED, AC4000 /MAKE ERROR CODE 4000+STATUS TAD STATUS ECOUNT, ISZ TRYCNT /NEGATIVE ERROR CODE IN AC SKP CLA /CLEAR AC AND GO TO REINIT JMP ERREX / / GET STATUS FROM UNIT (MUST FOLLOW ERRPRO CODE) / REINIT, TAD IOWRD /WHICH UNIT NUMBER? LL377, AND (20 TAD (412 /MAKE A DOUBLE DENSITY READ STATUS LCD JMS WATSUB /WAIT, SER /CLEAR POSSIBLE ERROR FLAG L232, 232 /ALLOW FOR POOSSIBLE SKIP XDR /STATUS, WHAT KIND OF DRIVE/MEDIA AND L232 /KEEP READY, DOUBLE DENSITY, QUAD, DENSITY ERROR TAD LL7600 /CANCEL OUT READY BIT, IF PRESENT SPA /SKIP IF WAS READY IAC /WASN'T READY, FORCE NON-READY BIT IN EVENTUAL TYPE WORD LX7400, SZA /SKIP IF SINGLE ON SINGLE, KEEPING 0 CODE TAD (3760 /QUAD = 3772, S/D = 4010, DOUBLE = 3770 DCA I TYPE /RE-ESTABLISH TYPE CODE JMP REDO /GO RETRY ENTIRE OPERATION / / BLAST / / CLEAR THE WORLD / BLAST, 0 CDF .FLD /SAFEST HERE?? INIT /CLEAR OUT DEVICE CLA IAC /SET DFLAG TO 1 FOR COMING WAIT DCA I QDFLAG CLA IAC /TURN FLOPPY INTERRUPTS ON INTR JMS WATSUB /WAIT, AND AGAIN SET DFLAG TO 1 JMP I BLAST / / / WATSUB / / WAIT FOR DONE FLAG, SET EVENT FLAG BACK TO 1, / WATSUB, 0 CAL WAITE QDFLAG, DFLAG ISZ I QDFLAG /MAKE SURE THIS IS SET AGAIN JMP I WATSUB / / SUBROUTINE TO SET UP COMMAND REGISTER / LDCMD, 0 /LOAD COMMAND REG, DONE HAS LAREADY HAPPENED! TAD IOWRD /PUT IN UNIT, DENSITY DCA CMD /SAVE IT IN CASE 8-BIT MODE TAD CMD LCD /LOAD NEW COMMAND REGISTER CONTENTS TAD I TYPE /IS IT A SINGLE DENSITY DRIVE SZA CLA /SKIP IF A SINGLE TAD (100 /NOW CHECK FOR EIGHT BIT MODE AND CMD SNA CLA /SKIP IF REALLY EIGHT BIT MODE, AND NOT SINGLE JMP LOADEX TAD CMD /NEED TO FEED TOP FOUR BITS TO XDR AND LX7400 /AND WITH 7400 AND A 40 THAT MISSES CLL RAL RTL RTL STR JMP .-1 XDR LOADEX, CLL CLA /FOR CALLER'S CONVENIECE JMP I LDCMD MAINI, TAD WRCDF /PUT CDF TO BOTH LOOPS IN CASE NEED IT DCA RDCDF MAINL, TAD FN /GET RW BIT SPA CLA /IF IT'S A READ, WE MUST PRE-READ JMP WRITLP /OTHERWISE, START FILLING RX01 BUFFER / / MAIN LOOP TO READ FLOPPY / READLP, JMS DISKIO /READ DISK JMS LDCMD /SET UP TO EMPTY SILO TAD SS /SECTOR SIZE (-/2) IS COUNT CONTROL DCA TCOUNT /TEMPORARY FOR THIS LOOP DURATION RDCDF, HLT /CDF TO USER BUFFER HERE RDSILO, STR /GRAB DATA FROM SILO JMP .-1 XDR DCA I X10 /AUTO-INCR FOR SPEED STR JMP .-1 /TWO DATA PER LOOP XDR DCA I X10 ISZ TCOUNT JMP RDSILO JMS WATSUB /WAIT FOR DONE FLAG, DATA FIELD SET BACK TO HERE JMP MAINE /GO CHECK FOR OPERATION DONE / / MAIN LOOP TO WRITE FLOPPY / WRITLP, JMS LDCMD /TO FILL SILO TAD SS DCA TCOUNT WRCDF, HLT WRSILO, TAD I X10 STR JMP .-1 XDR LL7600, 7600 TAD I X10 STR JMP .-1 XDR CLA ISZ TCOUNT JMP WRSILO JMS WATSUB /WAIT FOR DONE FLAG, DATA FIELD SET BACK TO HERE JMS DISKIO / / TEST FOR DONE, BOTH LOOPS / MAINE, TAD SS /SS HAS -1/2 THE COUNT OF WORDS CLL RAL /MAKE - THE COUNT OF WORDS TAD WC /WC KEEPS + THE NUMBER LEFT TO DO SNA /SKIP IF NOT YET DONE JMP DONE /COUNT WENT ALL THE WAY TO ZERO, GO FINISH UP DCA WC /WAVE FOR NEXT TIME JMP MAINL /GO TO SORT READ FROM WRITE / / INTERRUPT CODE / INTRPT, ZBLOCK 2 /RTS OVERHEAD SDN /SKIP ON DONE AND CLEAR FLAG JMP I INTRPT /IT AINT THIS FLAG CDF .FLD TAD QDFLAG /JUST POST THE EVENT FLAG CIF RTS8 POSTDS / PAGE / .FSECT FRX\TASK FIELD XRX\TASK IFDEF PWRF < PWFMSG, ZBLOCK 3 CHECK==-REDO PWFSUB, . /1ST TIME: PART OF MSG TO PWRF DCA PWFSUB-1 /SAVE AC JMS BLAST /CLEAR OUT DEVICE TAD PWFSUB /WHERE DID WE DERAIL FROM TAD (CHECK /TOO EARLY TO JUMP TO REDO?? CLL TAD (6 /ONLY IN RANGE LOOP-REDO DO WE RETURN THRU PWFSUB SNL CLA JMP REDO /NO, REDO AN EXISTING OPERATION TAD PWFSUB-1 /AC NEEDED IN THIS CASE JMP I PWFSUB /RETURN TO DERAILED POINT > / / / / CODE TO SIZE DEVICE IF SENT A HOPELESS BLOCK # / THAT IS, MORE THAN 1777 SINGLE, MORE THAN 3777 DOUB OR QUAD / / USED BY PIP (BACKGROUND) TO DO A SANE ZERO OF DIRECTORY / PIP EXPECTS NEGATIVE SIZE IN AC AT ERROR RETURN / SIZIT, CLL RTR /PUT QUAD BIT INTO LINK FOR LATER AND I TYPE /KEEP AC NON0 FOR DOUBLE AND QUAD SNA CLA /SKIP ON DOUBLE OR QUAD TAD (1734 /SINGLE TAD (4110 /D&Q=4110, S=6044 SNL /SKIP ON QUAD, ITS ALREADY OK CLL CML RAR /SINGLE AND DOUBLE DIVIDE BY TWO JMP ECOUNT /GO JOIN AT RETRY COUNTER /Q=4110, D=6044, S=7022 /