/OS/8 FILE SYSTEM /SHEET 0 / 3 JUL 69 RBH /ADDITIONAL DEFINITIONS FOR MACRO-8M /TC01 DECTAPE CONTROL DTRA= 6761 DTCA= 6762 DTXA= 6764 DTLA= 6766 DTSF= 6771 DTRB= 6772 DTLB= 6774 FIXTAB /OS/8 FILE SYSTEM /SHEET 1 /28 MAR 69 RBH / /PAGE ZERO *1 INTZ, NOP /MIGHT RUN ON PDP-5 JMP I .+1 ANSWER SCATP, /POINTER TO SCAT=JMP I .; RETURN /GLOBAL INTERRUPT DISMISSAL INTP=5 /POINTER TO NON-FILE-SYSTEM /INTERRUPT HANDLERS TEMP=6 /POINTER FOR INDIRECT ADDRESSING XRG1=10 /AUTO-INDEX XRG2=11 /REGISTERS USED /OS/8 FILE SYSTEM /SHEET 2 /24 MAR 69 RBH / /MULTIPROGRAMMING INTERFACE TO FILE SYSTEM PAGE 35 / /SETUP - COPY ARGS FROM CALLING SEQUENCE AND SET UP / MULTIPROGRAMMING RETURN. USED BY / EXTERNAL ROUTINES INPUT, OUTPUT, ET AL. / SETUP, 0 DCA SELOC /HOLD POINTER TAD CDF0 /CDF 00 RDF /FIND OUT WHO'S CALLING DCA SEA1 /MAKES CDF X0 TAD CIF0 /CIF CDF 00 RDF /+DATA FIELD DCA OPEXIT /MAKES CIF CDF X0 FOR EXIT TAD SELOC /GET RETURN POINTER IAC /SKIP ARGUMENT DCA OPUSER /COMPLETE RETURN POINTER TAD I SELOC /NOW DEFER TO FIND DCA SELOC /ARG LIST IN CALLING FIELD CDF0, CDF 00 /COME DOWN TO EARTH SEA0, TAD DONE /TEST FOR COMPLETION SMA CLA /WAIT HERE UNTIL JMP .-2 /PREVIOUS OPERATION TAD EFLG /COMPLETE, THEN SZA /LOOK FOR ERRORS JMP OPEXIT /GO RIGHT BACK IOF /SENSITIVE THINGS START HERE DCA DONE /WE AREN'T FINISHED AGAIN! TAD OPFAKE /GIMMICKING POINTERS DCA SCATP /SCAT LINKAGE TAD I SETUP /LOOK FOR ARGUMENT COUNT ISZ SETUP /AND TWEAK RETURN POINTER SNA /ANY ARGUMENTS TO FETCH? JMP I SETUP /NO, SO FINISHED HERE DCA Z TEMP /ALREADY NEGATIVE STA /-1 FOR AUTO-INDEX TAD I SETUP /THIS TELLS WHERE TO PUT THINGS ISZ SETUP /BUMP POINTER DCA Z XRG2 /USE HANDY-DANDY ... /OS/8 FILE SYSTEM /SHEET 3 /24 MAR 69 RBH SEA1, JMP . /BECOMES CDF X0 TAD I SELOC /LIFT A WORD CIF0, CIF CDF 00 /USED AS CONSTANT DCA I Z XRG2 /STASH IT AWAY ISZ SELOC ISZ Z TEMP /DONE? JMP SEA1 /NOPE. JMP I SETUP /YUP. OPSCAT, CLA CLL /FIRST TIME SO WE GET BACK O.K. TAD OPREST /RESTORE NORMAL RETURN POINTER DCA SCATP TAD EFLG /CARRY BACK ERROR FLAGS OPEXIT, JMP . /BECOMES CIF CDF X0 ION /ALL HELL BREAKS LOOSE HERE JMP I OPUSER OPUSER, 0 /INITIAL MULTIPROG RETURN SELOC, 0 /ARGUMENT POINTER OPREST, RETURN /NORMAL INTERRUPT RETURN OPFAKE, OPSCAT /FAKE RETURN, FIRST TIME /OS/8 FILE SYSTEM /SHEET 4 /28 MAR 69 RBH / /INTERRUPT ROUTINES / DF32 DECDISC AND CONTROL / (PROBABLY RF08 DECDISC CONTROL, ALSO) / TC01 DECTAPE CONTROL / (COMPATIBLE ROUTINES EXIST FOR THE / (TYPE 552 DECTAPE CONTROL) ANSWER, DCA AC /SAVE AC AND LINK RAL DCA LK TAD DONE /SEE IF FILE SYSTEM THRU SZA CLA /IF SO, FLAGS MIGHT BE SET JMP I Z INTP /THIS MUST BE SOMETHING ELSE NOP /DFSC FOR DISC IN SYSTEM SKP /DFSE FOR DISC JMP I DFWAIT /GETS ALL DISC INTERRUPTS DTSF /DECTAPE INTERRUPT? JMP I Z INTP /NO, SOMETHING ELSE DTRB /GET TAPE STATUS SPA CLA /DECTAPE ERROR? JMP DTERR /YES DTXA /NO,CLEAR FLAGS JMP I DTWAIT /AND SERVICE RETURN, CLA CLL TAD LK /RESTORE AC AND LINK RAR TAD AC RMF /RESTORE MEMORY FIELD ION /ASK FOR TROUBLE JMP I Z 0 /RETURN DFWAIT, 0 /DECDISC RETURN ADDRESS SCAT /GO PLAY AWHILE DTWAIT, 0 /DECTAPE RETURN ADDRESS SCAT /GO OFF SOMEPLACE AC, 0 /STORAGE FOR AC LK, 0 /STORAGE FOR LINK DONE, 7777 /FILE SYSTEM COMPLETION FLAG EFLG, 0 /FILE SYSTEM ERROR FLAG ENDZON, DTTURN /WHERE TO GO ON ENDZONE MPTMSK, 2300 /MARK, PARITY, TIMING MASK RETRY, DTQUIT-1 /WHERE TO GO ON ERRORS RUNFLG, DTRUN /SOFTWARE MOTION FLAG /OS/8 FILE SYSTEM /SHEET 5 /28 MAR 69 RBH DTERR, DTRB /READ ERROR STATUS RTL /LOOK FOR ENDZONE SPA CLA /IS IT? JMP I ENDZON /YES, TRY OTHER WAY DTRB /LOOK FOR TRANSIENT ERRORS AND MPTMSK /MARK, PARITY, TIMING SZA CLA JMP I RETRY /DO COMMAND OVER DTRB /NO, COP OUT DTQUIT, DCA EFLG /SAVE ERROR FLAG DURING STOP STA DCA I RUNFLG /SET STOPPED FLAG DTRA /KILL THE DECTAPE AND . /(=0344): BAD PRACTICE DTXA /GO, WRITE, INT., & FLAGS OFF SKP /CALL IT QUITS DFQUIT, DCA EFLG /DISK QUITS HERE STA /EXIT TO USER DCA DONE /AT ERROR OR COMPLETION SCAT /ARGUMENT FETCHING ROUTINE FOR INTERNAL PROCEDURES /USED BY SEVERAL MONITOR ROUTINES AND BY DT(MM)RORW GETARG, 0 DCA GETCNT /# OF ITEMS TAD I GETARG /DEFER TWICE DCA Z TEMP /TO GET CORRECT POINTER STA /-1 FOR AUTO-INDEX TAD I Z TEMP DCA Z XRG2 ISZ GETARG TAD I GETARG /DEFER TWICE FOR DCA Z TEMP /SECOND ARGUMENT STA /-1 FOR AUTO-INDEX TAD I Z TEMP DCA Z XRG1 ISZ GETARG GETA1, TAD I Z XRG1 /MOVE LIST OF DCA I Z XRG2 /ARGUMENTS ISZ I Z TEMP /KEEP BUMPING RETURN ADDRESS ISZ GETCNT /UNTIL FINISHED JMP GETA1 JMP I GETARG GETCNT, 0 /OS/8 FILE SYSTEM /SHEET 6 /23 APR 69 RBH / /ACTUAL READ, WRITE, AND SEARCH ROUTINES PAGE 36 / /DTRORW - READ OR WRITE ONE BLOCK OF A FILE / TC01 DECTAPE CONTROL / A COMPATIBLE VERSION EXISTS FOR THE / TYPE 552 DECTAPE CONTROL / /CALL: (CLA) TO READ OR (CLA IAC) TO WRITE / JMS DTRORW / (BLOCK #) / (UNIT #) / (MEMORY FIELD) / (CORE ADDRESS) / (FILE LINK) / (RETURN) / DTRORW, 0 SZA CLA /READ OR WRITE? TAD DTWRIT /WRITE TAD DTREAD /READ DCA DTFUNC /SAVE FOR FUTURE USE TAD DTM4 /4 ARGUMENTS JMS I DTCOPY /PICK UP ARGUMENTS DTSMSK, DTLIST DTRORW ISZ DTRUN /TAPE MOVING? JMS I DTFORK /LET SOMEBODY MULTIPROGRAM TAD DTBLKS /READY FOR ANOTHER BLOCK NOW JMS DTSRCH /GO FIND THE BLOCK DCA I DTWC /ZERO OUT WORD COUNT TAD DTFUNC /PICK UP FUNCTION WORD DTXA /ESTABLISH FUNCTION STA TAD DTRORW /TRANSFER FILE LINK DCA I DTAD /FROM CALLING SEQUENCE /OS/8 FILE SYSTEM /SHEET 7 /23 APR 69 RBH DTRB /LOOK OUT FOR SELECT SPA CLA /ERROR FROM WRITE-LOCK JMP I DTTRAP /OOPS! TAD I DTWC /WATCH FOR SNA CLA /WORD COUNT TO CHANGE JMP .-2 /KEEP AT IT TAD DTFLD /NOW MAKE TRANSFER DTLB /SET FIELD NUMBER STA /-1 FOR INDEXING TAD DTLOC DCA I DTAD /ADDRESS OF TRANSFER ISZ DTRORW /STEP OVER CALLING SEQUENCE DCA DTRUN /SET MOVING FLAG JMP I DTRORW /TRANSFER IN PROGRESS DTREAD, 130 /(READ,NM).XOR.(SCH,CM) DTWRIT, 150-130 /((WRT,NM).XOR.(SCH,CM))-DTREAD /OS/8 FILE SYSTEM /SHEET 8 /23 APR 68 RBH / /DTSRCH - BIDIRECTIONAL SEARCH / USED BY ALL TAPE TWISTING ROUTINES / UNIT # MUST BE AVAILABLE IN DTUNIT / AND RUN FLAG(0:STOPPED,>0:RUNNING) IN DTRUN / IF RUN FLAG IS 0, UNIT WILL BE RESELECTED / /CALL: TAD (BLOCK #) FOR FORWARD FUNCTION / ::OR:: / TAD (-BLOCK #) FOR REVERSE FUNCTION / JMS DTSRCH / (RETURN) AC=0, TAPE SEARCHING, CONTINUOUS MODE, / INTERRUPT ARMED, AT DESIRED / BLOCK IN INDICATED DIRECTION / DTSRCH, 0 SPA /WHICH DIRECTION? JMP DTSA1 /REVERSE DCA DTBLKS /FORWARD, STORE TEST BLOCK TAD DTRLST /PUT ADDRESS OF FWD FOUND BLOCK DCA I DTAD /IN CURRENT ADDRESS JMP DTSA2 /AND PROCEED DTSA1, CIA /MAKE BLOCK # POSITIVE DCA DTBLKF /STORE REVERSE TEST BLOCK TAD DTLIST /PUT ADDRESS OF REV FOUND BLOCK DCA I DTAD /IN CURRENT ADDRESS CLA STL RTL /+2 DTSA2, TAD DTSMSK /+POINTER TO STATUS A MASKS DCA Z XRG2 /USE AUTO-INDEX FOR EFFICIENCY TAD DTRUN /LOOK TO SEE IF NEW TRANSFER SMA SZA CLA /OTHERWISE CONTINUE SAME UNIT JMP DTSA3 /CONTINUING TAD DTUNIT /SELECT THE TRANSPORT CLL RTR RTR /MOVE # TO BITS 0,2 DTLA /SELECT TRANSPORT DTSA3, DTRA /FIND OUT WHAT'S GOING ON AND I Z XRG2 /BITS TO BE TURNED OFF DTXA /TURN THEM OFF DTRA /LOOK AGAIN CMA /NOT STATUS AND I Z XRG2 /BITS TO BE TURNED ON DTXA /TURN THEM ON. UNIT # UNCHANGED DTLB /SET FIELD 0 STA /SEARCH ONE BLOCK DTSA4, DCA I DTWC /SET WORD COUNT /OS/8 FILE SYSTEM /SHEET 9 /23 APR 69 RBH DTSA5, JMS I DTFORK /DALLY AROUND 'TIL BLOCK COMES UP TAD DTBLKS /COMPARE CIA /SOUGHT AND FOUND TAD DTBLKF /BLOCKS SPA /KEEP GOING SAME DIRECTION? JMP DTSA4 /YES SNA /CHANGE DIRECTION? JMP I DTSRCH /NO, AT DESIRED BLOCK IAC /YES, OVERSHOOT CMA /BY 2 BLOCKS DCA I DTWC /SET WORD COUNT TAD DTC400 /CHANGE DIRECTION DTXA DTSA6, JMS I DTFORK /DO SOMETHING ELSE FOR A WHILE TAD DTBLKF /COMPARE IAC /FOUND AND CMA /SOUGHT TAD DTBLKS /BLOCKS OFFSET BY TWO SMA /BACK FAR ENOUGH? JMP DTSA7 /YES, GO AROUND AGAIN DCA I DTWC /NO, BACK SOME MORE JMP DTSA6 /IN THIS LOOP DTSA7, CMA /TEST THE BLOCK PRECEDING DCA I DTWC /THE ONE WE WANT TAD DTC400 /CHANGE DIRECTION DTXA JMP DTSA5 /OS/8 FILE SYSTEM /SHEET 10 /23 APR 69 RBH DTRLST, DTBLKF DTLIST, DTBLKS /THIS STAYS WITH NEXT 4 WORDS 460 /NOT (SEARCH FWD CM INTERRUPT) 314 /SEARCH FWD CM INTERRUPT 060 /NOT (SEARCH REV CM INTERRUPT) 714 /SEARCH REV CM INTERRUPT DTTRAP, DTQUIT-1 /SELECT ERROR DTTURN, TAD DTC600 /START UP AGAIN DTXA /GOING THE OTHER WAY STA /PICK UP THE FIRST BLOCK DCA I DTWC /BY SETTING WORD COUNT TAD I DTFORK /CHECK RETURN ADDRESS TAD MWTBKW /WERE WE BACKING UP? SNA CLA JMP DTSA5 /YES, BUT NOT NOW JMP DTSA6 /NO, BUT WE ARE NOW DTFUNC, 0 /FUNCTION SELECTED DTWC, 7754 DTAD, 7755 DTC400, 400 DTC600, 600 DTM4, -4 MWTBKW, -DTSA6-1 *.&7600+170 DTBLKF, 0 /TC01 AND 552 VERSIONS MATCH HERE DTBLKS, 0 DTUNIT, 0 DTFLD, 0 DTLOC, 0 DTRUN, 7777 DTFORK, DTWAIT DTCOPY, GETARG /OS/8 FILE SYSTEM /SHEET 11 /14 JAN 69 RBH / /ASSEMBLY PARAMETERS /ACTIVE FILE DIRECTORY INDEX CONSTANTS: AFDMOD=3 /MODE BIT AND FILE EXTENSION (1 CHAR) AFD1ST=4 /FIRST BLOCK NUMBER AFDBLK=5 /# OF BLOCKS IN FILE AFDUNT=6 /UNIT # OR DEVICE IDENTIFIER AFDNXT=7 /NEXT BLOCK NUMBER AFDFBL=10 /FREE BLOCK BUFFER POINTER FOR DECTAPE /OR FILE NUMBER FOR DECDISC AFDPNT=11 /RUNNING BLOCK POINTER FOR DECTAPE /OR FILE TABLE POINTER FOR DISC FBLEN=177 /LENGTH OF FREE BLOCK LIST BUFFER /OS/8 FILE SYSTEM /SHEET 12 /23 APR 69 RBH / /INPUT COMMAND PAGE 34 / /INPUT - READ A FILE / /CALL: JMS INPUT / ARGS / . . . /ARGS, (ACTIVE FILE POINTER) / (NUMBER OF BLOCKS TO READ) / (MEMORY FIELD--62X1 = CDF X0) / (BUFFER BASE ADDRESS) / (END-OF-FILE FLAG) / /IF A FILE MARK (FILE LINK=0000) IS ENCOUNTERED, /THE INPUT COMMAND IS TERMINATED AND THE END-OF-FILE /FLAG IS SET TO 7777 TO NOTIFY THE CALLING PROGRAM /THAT END-OF-FILE HAS OCCURRED. AN ATTEMPT TO READ /PAST A FILE MARK WILL RESULT IN AN END-OF-FILE ERROR. /NOTE THAT IT IS POSSIBLE TO READ FROM AN OUTPUT FILE. /THIS FEATURE SHOULD BE USED CAREFULLY. / INPUT, 0 CLA TAD INPUT JMS I (SETUP) /ESTABLISH MULTIPROGAMMING RETURN 0-4 /# OF ARGUMENTS NUMBER /ARG BUFFER TAD I (SEA1) /GET CDF TO CALLING FLD DCA INA3 /FOR RETURNING E-O-F TAD I (SELOC) /ADDRESS OF E-O-F FLAG DCA FINAL /FOR INDIRECT DEPOSIT JMS OSUNIT /PICK THE UNIT JMS INTRF /TRANSFER ARGUMENTS FROM BUFFER INA1, JMS TRANSF /TO READ/WRITE CALL TAD NEXT /LOOK AT FILE LINK SNA CLA /FILE MARK? JMP INA2 /YES, TERMINATE INPUT COMMAND ISZ INPGS /INPUT ALL REQUESTED? JMP INA1 /NO, GO BACK INA2, TAD NEXT /LOOK FOR E-O-F SNA CLA /0 IF END STA /END, RETURN 7777 INA3, JMP . /BECOMES CDF X0 DCA I FINAL /SIGNAL FILE STATUS CDF 00 /BACK TO EARTH /OS/8 FILE SYSTEM /SHEET 13 / 3 JUL 69 RBH INA4, JMS I (DTWAIT) /GO PLAY OUTSIDE TAD NEXT /FINAL FILE LINK DCA Z XRG2 /DEPOSIT FOR AFDPUT TAD (AFDNXT) /STORE AS NEXT BLOCK JMS AFDPUT /IN A.F.D. JMP I (DTQUIT) /AND SIGNAL COMPLETION PAGSIZ, 200 /NUMBER OF WORDS PER BLOCK INPGS, 0 /PAGE COUNTER INTRF, 0 /COPY ARGUMENTS FROM BUFFER TO CALL TAD ERRCNT /SET NUMBER OF TIMES DCA OSUNIT /TO RETRY ERRORS ISZ OSUNIT /ERRORS COME BACK HERE SKP /STILL RETRYING JMP FILERR-1 /TOO MANY TIMES TAD (AFDNXT) /ALSO USED BY OUTPUT JMS AFDGET /EXTRACT BLOCK NUMBER SNA /END-OF-FILE? JMP FILERR+3 /YES, ERROR 1 DCA BLOCK /DEPOSIT IN CALL TAD PAGES /NUMBER OF PAGES CIA CLL /MAKE NEGATIVE TO DCA INPGS /USE FOR COUNTING TAD EXTADD /COPY FIELD NUMBER DCA TRFFLD TAD BUFFER /AND STARTING ADDRESS DCA TRFLOC JMP I INTRF /ALL COPIED FOR READING, /BUT MORE TO DO FOR WRITING TRANSF, 0 /ROUTINE USED BY BOTH JMS I (DTRORW) /INPUT & OUTPUT COMMANDS BLOCK, 0 /BLOCK NUMBER UNIT, 0 /UNIT NUMBER TRFFLD, 0 /MEMORY FIELD TRFLOC, 0 /CORE ADDRESS NEXT, 0 /FILE LINK TAD TRFLOC TAD PAGSIZ /BUMP POINTER BY ONE PAGE DCA TRFLOC TAD NEXT /MOVE FILE LINK DCA BLOCK /FOR NEXT CALL JMP I TRANSF /CLIMB UP ONE STEP /OS/8 FILE SYSTEM /SHEET 14 / 3 JUL 69 RBH JOIN, 0 CLA TAD .+3 /MAKE RETURN LINKAGE RDF /+00X0 DCA REJOIN /=CIF CDF X0 CIF CDF 00 /USED AS CONSTANT TAD I (DONE) /LOOK FOR COMPLETION SMA CLA JMP .-2 /INTERRUPT IS ON TAD I (EFLG) /RETURN ERRORS DCA AFDGET /SAVE ERRORS DCA I (EFLG) /AND CLEAR FLAG TAD AFDGET /(AFDGET WON'T BE ACTIVE) REJOIN, JMP . /BECOMES CIF CDF X0 JMP I JOIN /RETURN OSUNIT, 0 /SELECT I/O DEVICE TAD (AFDUNT) /FROM CODE IN A.F.D. JMS AFDGET /GET THE CODE SPA SNA /DECTAPE IS UNIT # JMP I NONDTA /D=0,R,P=-1,K,T=-2 AND (7) /TRIM UNIT # SNA /UNIT 8? TAD (10) /BE KIND TO YOUR 552 DCA UNIT /(FOR A DUCK MAY BE . . . JMP I OSUNIT NONDTA, FILERR-2 /POINTER TO NON-DECTAPE I/O AFDGET, 0 /GET A WORD FROM A.F.D. TAD NUMBER /INDEX CURRENT FILE POINTER DCA Z TEMP /USE PAGE 0 TEMPORARY TAD I Z TEMP /PICK UP, JMP I AFDGET /RETURN WITH WORD IN AC AFDPUT, 0 /PUT SOMETHING INTO A.F.D. TAD NUMBER /INDEX CURRENT FILE POINTER DCA Z TEMP /USE HANDY PAGE 0 LOCATION TAD Z XRG2 /WHAT WE WANT TO PUT THERE DCA I Z TEMP /PUT AWAY IN A.F.D. JMP I AFDPUT /RETURN ERRCNT, -10 /TIMES TO RETRY ERRORS /OS/8 FILE SYSTEM /SHEET 14.5 / 3 JUL 69 RBH NUMBER, 0 /ACTIVE FILE POINTER PAGES, 0 /NUMBER OF PAGES TO TRANSFER EXTADD, 0 /MEMORY FIELD BUFFER, 0 /BEGINNING ADDRESS FOR TRANSFER FINAL, 0 /END-OF-FILE FLAG OR PNTR /ERROR CODES FOR FILE SYSTEM: / CLA IAC /6: ILLEGAL DEVICE IAC /5: PERMANENT ERROR FILERR, IAC /4: EXHAUSTED FREE BLOCK LIST IAC /3: INSUFFICIENT FREE BLOCKS IAC /2: ATTEMPT TO WRITE ON INPUT FILE IAC /1: END-OF-FILE JMP I (DTQUIT) /MAKE SOME NOISE ABOUT IT PAGE /DUMP LINKS AND LITERALS *RETRY /FIX ERROR RETURN POINTER INTRF+3 /TO RE-EXECUTE WHOLE TRANSFER /OS/8 FILE SYSTEM /SHEET 15 /21 APR 69 RBH / /OUTPUT COMMAND PAGE 33 / /OUTPUT - OUTPUT A FILE / /CALL: JMS OUTPUT / ARGS / . . . /ARGS, (ACTIVE FILE POINTER) / (NUMBER OF PAGES TO WRITE) / (MEMORY FIELD--62X1 = CDF X0) / (BUFFER BASE ADDRESS) / (END-OF-FILE FLAG) / /IF THE LAST ARGUMENT IS NON-ZERO, THE FILE WILL BE /TERMINATED BY A FILE MARK (FILE LINK=0000). OTHERWISE, /A LINK WILL BE CREATED TO THE ANTICIPATED NEXT BLOCK. /FURTHER ATTEMPTS TO WRITE IN THAT FILE WILL /CAUSE AN END-OF-FILE ERROR. / OUTPUT, 0 CLA TAD OUTPUT /SET UP FOR MULTIPROGRAMMING JMS I (SETUP) / 0-5 /ARGUMENT COUNT NUMBER /USE BUFFER IN INPUT ROUTINE TAD (AFDMOD) /MAKE SURE THIS IS JMS I (AFDGET) /AN OUTPUT FILE SMA CLA /SIGN BIT TELLS JMP I (FILERR+2) /IT ISN'T JMS I (OSUNIT) /SEE WHAT UNIT TAD (AFDFBL) /PICK UP THE FBL POINTER JMS I (AFDGET) /FROM THE A.F.D. DCA FBLPNT /KEEP IT LOCALLY TAD I FBLPNT /CHECK NUMBER OF FREE BLOCKS TAD I (PAGES) /TO BE SURE WE HAVE ENOUGH SMA CLA /DO WE? JMP I (FILERR+1) /NO, ABORT TAD (AFD1ST) /CHECK THE FIRST BLOCK JMS I (AFDGET) /FROM THE A.F.D. SZA CLA /ZERO SAYS JUST STARTING JMP OUTA1 /ALREADY INITIALIZED /OS/8 FILE SYSTEM /SHEET 16 /23 APR 69 RBH JMS FBLGET /GET FIRST FREE BLOCK DCA Z XRG2 /TO STORE AS TAD (AFD1ST) /INITIAL BLOCK JMS I (AFDPUT) /IN A.F.D. TAD (AFDNXT) /STORE IT AS NEXT BLOCK, ALSO JMS I (AFDPUT) /PUTS IT INTO A.F.D. OUTA1, DCA WRDONE /CLEAR LAST-PAGE FLAG AND COUNTER JMS I (INTRF) /SET UP DTRORW CALL OUTA2, ISZ I (INPGS) /LAST PAGE COMING UP? JMP OUTA3 /NO, JUST GET A BLOCK TAD (AFDBLK) /YES, GET BLOCK COUNT JMS I (AFDGET) /FROM A.F.D. TAD WRDONE /ADD # OF BLOCKS JUST WRITTEN IAC /+ THIS NEXT ONE DCA I Z TEMP /BACK INTO BLOCK COUNT STA /JUGGLE A FEW THINGS DCA WRDONE /LIKE THE LAST PAGE FLAG TAD I (FINAL) /TERMINATION FLAG SNA CLA /CONTINUE THE FILE? OUTA3, JMS FBLGET /YES, GET A FREE BLOCK DCA I (NEXT) /FILE LINK CLA IAC /SET WRITE FLAG JMS I (TRANSF) /WRITE BLOCK ISZ WRDONE /LAST PAGE? JMP OUTA2 /NO, CALL FOR ANOTHER JMP I (INA4) /CLEAN UP AND GO HOME WRDONE, 0 /OS/8 FILE SYSTEM /SHEET 17 /21 APR 69 RBH FBLGET, 0 /FREE BLOCK ROUTINE ISZ I FBLPNT /TALLY OF REMAINING BLOCKS SKP /O.K. IF NO SKIP JMP I (FILERR) /OUT OF BLOCKS TAD (-15) /# OF BITS IN AC+LINK DCA BITCNT /SET UP BIT COUNTER TAD (AFDPNT) /LOOK UP FBL POINTER JMS I (AFDGET) /STORED IN A.F.D. FBLA0, TAD (-FBLEN) /MAX NR OF WORDS IN FBL DCA NWDS /COUNTER TAD WRDONE /LOOK FOR LAST PAGE SPA CLA /OF OUTPUT COMING UP ISZ I Z TEMP /YES, SO KICK POINTER TAD I Z TEMP /POINTER PLUS TAD FBLPNT /BASE ADDRESS DCA FBLWRD /GIVES ACTUAL ADDR TAD I Z TEMP /MULTIPLY FBL POINTER CLL RTL /FIRST BY 4 DCA BLKNR /SAVE IT TAD BLKNR /MAKE IT X10 CLL RAL /THEN ADD X4 TO MAKE 14 FBLA1, TAD BLKNR /FIX POINTER DCA BLKNR /NO FREE BLOCKS SEEN ISZ NWDS /STILL MORE AVAILABLE? JMP .+3 /YES DCA I Z TEMP /GO BACK TO BEGINNING JMP FBLA0 /TO LOOK FOR THEM ISZ FBLWRD /POINT TO NEXT DOZEN BLOCKS TAD I FBLWRD /PICK UP SZA /ANY FREE ONES? JMP FBLA3 /YES TAD (14) /NO, JUMP BY A DOZEN BLOCKS JMP FBLA1 /GO BACK FOR MORE /OS/8 FILE SYSTEM /SHEET 18 /21 APR 69 RBH FBLA2, SZL /IS THIS BLOCK FREE? JMP FBLA4 /YES FBLA3, ISZ BLKNR /NO RAL /MOVE UP ANOTHER BIT ISZ BITCNT /TALLY THE BIT AND JMP FBLA2 /TRY ANOTHER FBLA4, CLL /GOT THE BLOCK, MARK IT RAL /AND PUT IT BACK ISZ BITCNT /ROTATE 'TIL ZERO JMP .-2 DCA I FBLWRD /UPDATE FBL TAD FBLPNT /SUBTRACT BASE ADDR+1 CMA /TO GET 0-ORIGIN TAD FBLWRD /AND SAVE POINTER DCA I Z TEMP /FOR NEXT TIME TAD BLKNR /THIS IS OUR BLOCK NUMBER JMP I FBLGET /CARRY IT BACK FBLWRD, 0 BLKNR, 0 NWDS, 0 FBLPNT, 0 BITCNT, 0 $ /END/