/// / / KMS9-15 HANDLER FOR THE PDP-4/X IDE DISK / EMULATING 8 STANDARD-SIZED (576 BLOCK) DECTAPES / / COPYRIGHT (C) 2001 BY DAVID G. CONROY / / PERMISSION TO USE, COPY, MODIFY, AND DISTRIBUTE THIS SOFTWARE AND ITS / DOCUMENTATION FOR ANY PURPOSE AND WITHOUT FEE IS HEREBY GRANTED, PROVIDED / THAT THE ABOVE COPYRIGHT NOTICE APPEARS IN ALL COPIES, THAT BOTH THE / ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE APPEAR IN SUPPORTING / DOCUMENTATION, AND THAT THE NAME OF DAVID G. CONROY NOT BE USED IN ADVERTISING / OR PUBLICITY PERTAINING TO DISTRIBUTION OF THE SOFTWARE WITHOUT SPECIFIC, / WRITTEN PRIOR PERMISSION. THIS SOFTWARE IS MADE AVAILABLE "AS IS", AND / DAVID G. CONROY DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO / THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED WARRANTIES OF / MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN NO EVENT SHALL / DAVID G. CONROY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES / OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, / WHETHER IN AN ACTION OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT / LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF / THIS SOFTWARE. / / 01 DGC 20-AUG-2001 / / ALTHOUGH THIS HANDLER ONLY UNDERSTANDS IOPS / MODES, IT UNDERSTANDS HOW TO HAVE MULTIPLE OUTPUT FILES / ACTIVE ON A DEVICE AT THE SAME TIME, WHICH IS NOT A / BAD TRADE, AT LEAST FOR THE FIRST VERSION / / IT'S CLEAR THAT FUTURE VERSIONS OF THIS HANDLER / SHOULD UNDERSTAND DUMP MODE READ AND WRITE / IT'S LESS CLEAR IF HANDLING THE MTAPE COMMAND AND / NON-FILE-STRUCTURED READS AND WRITES WILL EVER BE WORTH DOING / /// / OPTIONS NBUF=4 / BUFFERS BFLAG=0 / FLAGS BPTR=1 / WORKING PTR INTO BUF BDIRX=2 / DIRECTORY INDEX (ENTER ONLY) BFBN=3 / FIRST BN (ENTER ONLY) BCBN=4 / CURRENT BN BBMAP=5 / FILE BITMAP (ENTER ONLY) BBUF=45 / DISK BUFFER BLEN=445 / LENGTH OF A BUFFER / FLAG FUNIT=700000 / UNIT FFILE=20000 / FILE OPEN ON BUFFER FINIT=10000 / BUFFER INIT'ED FMODE=7000 / MODE WHEN BUFFER INIT'ED FDATX=777 / DAT INDEX RMODE=000000 / READ MODE WMODE=001000 / WRITE MODE / HANDLER ENTRY / SAVE PTR TO CAL, AND PTR INTO ARGS / GET MODE AND DATX FOR LATER DTA, DAC PCAL DAC PARG ISZ PARG LAC I PCAL / MODE FROM CAL [06..08] AND (FMODE DAC MODE LAC I PCAL / DATX FROM CAL [09..17] AND (FDATX DAC DATX / ONCE-ONLY INITIALIZATION LAC INIT SZA JMS I INIT / LOOK TO SEE IF A BUFFER HAS ALREADY / BEEN PERMANENTLY ALLOCATED TO THIS DAT INDEX, / ALLOCATE TEMPORARY BUFFER IF NOT, / WHICH WILL EITHER BE MADE PERMANENTLY ALLOCATED / (INIT) OR FAIL SOME TEST (EVERYTHING ELSE), / AND SET UP POINTERS TO FIELDS LAC (BUF DAC T0 LAW -NBUF DAC T1 DZM T2 DTA0, LAC I T0 / CHECK IF FREE SZA JMP DTA1 LAC T0 DAC T2 JMP DTA2 DTA1, AND (FINIT+FDATX / CHECK IF THIS DATX XOR (FINIT SAD DATX JMP DTA3 / MATCH DTA2, LAC T0 TAD (BLEN DAC T0 ISZ T1 JMP DTA0 LAC T2 / ANY FREE ? SNA JMP ERR17 / NO JMP DTA4 DTA3, LAC T0 DTA4, DAC PFLAG / SET UP POINTERS TAD (1 / TO ALL THE DAC PPTR / FIELDS OF THE BUFFER TAD (1 DAC PDIRX TAD (1 DAC PFBN TAD (1 DAC PCBN TAD (1 DAC PBMAP TAD (40 DAC PBUF / PICK UP THE FUNCTION WORD / EXTRACT THE UNIT (WHICH HAPPENS TO BE IN / THE FUNCTION WORD), AND JUMP TO THE / FUNCTION'S HANDLER LAC I PARG AND (FUNIT DAC UNIT LAC I PARG ISZ PARG AND (000077 TAD (DTA5-1 DAC T0 XCT I T0 / A JMP DTA5, JMP CINIT JMP COPER JMP CSEEK JMP CENTER JMP CCLEAR JMP CCLOSE JMP ERR06 / MTAPE JMP CREAD JMP CWRITE JMP CWAIT JMP CTRAN /// / / INIT / /// CINIT, ISZ PARG / SKIP RESTART ADDRESS LAC (377 / SAVE DEFAULT LINE BUFFER SIZE DAC I PARG ISZ PARG / IF THE BUFFER IS MARKED AS INIT'ED FOR WRITE / AND FILE OPEN, THEN THE DATX WAS RE-INIT'ED BETWEEN AN / ENTER AND A CLOSE; THE DIRECTORY IS OK, BUT ANY / BLOCKS WHICH HAVE BEEN ALLOCATED TO THE FILE NEED TO / BE RETURNED TO THE IN-MEMORY AVAILABLE SPACE TABLE LAC I PFLAG AND (FFILE+FINIT+FMODE XOR (FFILE+FINIT+WMODE SZA JMP CI1 JMS GBMAP DAC T0 / T0 IS IN-MEMORY AST LAC PBMAP DAC T1 / T1 IS FILE'S BITMAP LAW -40 DAC T2 CI0, LAC I T1 ISZ T1 XOR I T0 / BIC DAC I T0 ISZ T0 ISZ T2 JMP CI0 / FILL IN THE PFLAG FIELD / THIS MAKES THE BUFFER ALLOCATION PERMANENT CI1, LAC (FINIT XOR UNIT XOR MODE XOR DATX DAC I PFLAG JMP CRTN /// / / OPER / /// COPER, LAC I PARG ISZ PARG DAC PFN / DISPATCH ON SUB-FUNCTION CODE LAC MODE SAD (001000 / DLETE JMP CO1 SAD (002000 / RENAM JMP CO2 SAD (003000 / FSTAT JMP CO3 JMP ERR06 / DELETE CO1, LAC I PFLAG AND (FFILE+FINIT XOR (FFILE+FINIT SNA JMP ERR10 XOR (FFILE SZA JMP ERR07 LAC (100 JMS RDBLK JMS VBMAP / A GOOD TIME DZM I PFBN JMS FINDFN JMP C04 DAC I PFBN JMS DELETE JMP C04 / RENAME CO2, LAC I PFLAG AND (FFILE+FINIT XOR (FFILE+FINIT SNA JMP ERR10 XOR (FFILE SZA JMP ERR07 LAC (100 JMS RDBLK DZM I PFBN JMS FINDFN JMP C04 DAC I PFBN ISZ PFN / NEW NAME ISZ PFN ISZ PFN LAC DIRX / JUST SMASH THE OLD CLL RTL / NAME; THERE IS NO CHECK FOR TAD PBUF / DUPLICATES (I THINK) TAD (40 DAC T0 LAC I PFN ISZ PFN DAC I T0 ISZ T0 LAC I PFN ISZ PFN DAC I T0 ISZ T0 LAC I PFN DAC I T0 JMS WRBLK JMP C04 / FSTAT CO3, LAC I PFLAG AND (FFILE+FINIT XOR (FFILE+FINIT SNA JMP ERR10 XOR (FFILE SZA JMP ERR07 LAW -1 / RETURN THE DEVICE TYPE TAD PARG / CODE IN THE HIGH DAC T0 / 3 BITS OF THE FILENAME WORD LAC I T0 AND (077777 XOR (100000 / DECTAPE AND DISK DAC I T0 / BOTH USED DEVICE CODE 1 LAC (100 JMS RDBLK DZM I PFBN JMS FINDFN JMP C04 DAC I PFBN / COMMON RETURN OF FIRST BLOCK C04, LAC I PFBN JMP CRTN /// / / SEEK / /// CSEEK, LAC I PARG ISZ PARG DAC PFN / CHECK BUFFER STATUS LAC I PFLAG AND (FFILE+FINIT+FMODE XOR (FFILE+FINIT+RMODE SNA JMP ERR10 XOR (FFILE SZA JMP ERR07 / READ IN DIRECTORY / AND SEARCH FOR THE FILE NAME LAC (100 JMS RDBLK JMS FINDFN JMP ERR13 / READ IN FIRST BLOCK / MARK BUFFER AS HAVING FILE OPEN, AND / MAKE PTR READY FOR FIRST READ JMS RDBLK LAC PBUF DAC I PPTR LAC I PFLAG XOR (FFILE DAC I PFLAG JMP CRTN /// / / ENTER / /// CENTER, LAC I PARG ISZ PARG DAC PFN / CHECK BUFFER STATUS LAC I PFLAG AND (FFILE+FINIT+FMODE XOR (FFILE+FINIT+WMODE SNA JMP ERR10 XOR (FFILE SZA JMP ERR07 / READ IN DIRECTORY / AND SEARCH FOR THE FILE NAME LAC (100 JMS RDBLK JMS VBMAP / A GOOD TIME JMS FINDFN JMP CE0 / FILE EXISTS, DELETE IT / NOTE THAT DELETE DOES NOT ZERO OUT / THE NAME; IT JUST ZAPS THE VALID / FLAG IN THE DIRECTORY ENTRY JMS DELETE JMP CE6 / FILE DOESN'T EXIST, MAKE SURE THERE / IS A FREE DIRECTORY ENTRY, TAKING INTO ACCOUNT / OTHER OUTSTANDING FILES OPEN FOR WRITING, / AND COPY THE NAME INTO IT CE0, LAW -30 / SYSTEM SIZE DAC T0 LAC PBUF / IF WORD 203(8) OF THE TAD (000203 / DIRECTORY IS -1 DAC T1 / WE HAVE A SYSTEM DIRECTORY LAC I T1 SAD (777777 JMP CE1 LAW -70 / NORMAL SIZE DAC T0 CE1, LAC PBUF TAD (40+3 DAC T1 DZM DIRX CE2, LAC I T1 / CHECK VALID FLAG SPA JMP CE5 / BUSY LAC (BUF DAC T2 LAW -NBUF DAC T3 CE3, LAC I T2 AND (FFILE+FINIT+FMODE XOR (FFILE+FINIT+WMODE SZA JMP CE4 / THE DIRX FIELD IS ONLY LAC T2 / VALID IF A FILE TAD (BDIRX-BFLAG / HAS BEEN ENTERED ON THE BUFFER DAC T4 LAC I T4 SAD DIRX JMP CE5 / DIRX IN USE CE4, LAC T2 TAD (BLEN DAC T2 ISZ T3 JMP CE3 LAW -3 / COPY THE NAME INTO TAD T1 / THE KNOWN TO BE FREE ENTRY DAC T1 / BUT DON'T SET VALID LAC I PFN ISZ PFN DAC I T1 ISZ T1 LAC I PFN ISZ PFN DAC I T1 ISZ T1 LAC I PFN DAC I T1 JMS WRBLK JMP CE6 CE5, ISZ DIRX / THIS ENTRY IS NOT LAC T1 / AVAILABLE SO ADVANCE TO THE TAD (4 / NEXT ONE DAC T1 ISZ T0 JMP CE2 JMP ERR14 / DIR FULL / CLEAR OUT THE FILE'S BITMAP CE6, LAC PBMAP DAC T0 LAW -40 DAC T1 CE7, DZM I T0 ISZ T0 ISZ T1 JMP CE7 / ALLOCATE THE FIRST BLOCK OF THE NEW FILE / AND SAVE THE BLOCK NUMBER SO THAT IT CAN BE PUT / INTO THE DIRECTORY ON FINAL CLOSE / SET UP OTHER VARIABLES IN THE BUFFER TO GET READY / FOR THE FIRST WRITE JMS ABMAP DAC I PFBN DAC I PCBN LAC DIRX DAC I PDIRX LAC PBUF DAC I PPTR LAC I PFLAG XOR (FFILE DAC I PFLAG JMP CRTN /// / / CLEAR / /// CCLEAR, LAC I PFLAG AND (FFILE+FINIT+FMODE XOR (FFILE+FINIT+WMODE SNA JMP ERR10 / A STRETCH XOR (FFILE SZA JMP ERR07 / CHECK FOR OTHER FILES OPEN LAC (BUF DAC T0 LAW -NBUF DAC T1 LAC I PFLAG AND (FUNIT XOR (FFILE+FINIT DAC T2 CC0, LAC I T0 AND (FUNIT+FFILE+FINIT SAD T2 JMP ERR10 / A STRETCH LAC T0 TAD (BLEN DAC T0 ISZ T1 JMP CC0 / ZERO OUT THE BUFFER, AND USE IT / TO ZERO OUT THE BITMAP BLOCKS (71 .. 77) LAC PBUF DAC T0 LAW -400 DAC T1 CC1, DZM I T0 ISZ T0 ISZ T1 JMP CC1 LAC (71 DAC I PCBN CC2, JMS WRBLK ISZ I PCBN LAC I PCBN SAD (100 SKP JMP CC2 / ZERO OUT MOST OF THE DIRECTORY BLOCK / WORD 3 OF THE ON-DISK BITMAP NEEDS TO HAVE A FEW BITS / SET, WHICH CORRESPOND TO RESERVED BLOCKS / MARK THE IN-MEMORY BITMAP AS INVALID, SO IT WILL / BE RE-READ BEFORE IT'S USED LAC PBUF TAD (3 DAC T0 LAC (077600 DAC I T0 JMS WRBLK JMS ZBMAP JMP CRTN /// / / CLOSE / /// CCLOSE, LAC I PFLAG AND (FFILE+FINIT+FMODE XOR (FFILE+FINIT+WMODE SZA JMP CL2 / WRITE EOF AND FLUSH BUFFER LAC (EOFLB DAC PLB LAW -2 DAC NWLB JMS WRITE LAW -1 JMS FLUSH / COPY THE FILE'S BITMAP INTO THE / CORRECT SPOT IN THE FILE BITMAP BLOCKS LAW 777770 AND I PDIRX CLL RAR RTR TAD (71 JMS RDBLK LAC PBMAP DAC T0 LAC I PDIRX AND (7 CLL RAL RTL RTL TAD PBUF DAC T1 LAW -40 DAC T2 CL0, LAC I T0 ISZ T0 DAC I T1 ISZ T1 ISZ T2 JMP CL0 JMS WRBLK / UPDATE DIRECTORY AND ON-DISK AST LAC (100 JMS RDBLK LAC I PDIRX CLL RTL TAD PBUF TAD (40+3 DAC T0 LAC I PFBN XOR (400000 / VALID FLAG DAC I T0 LAC PBMAP DAC T0 LAC PBUF DAC T1 LAW -40 DAC T2 CL1, LAC I T0 ISZ T0 XOR I T1 DAC I T1 ISZ T1 ISZ T2 JMP CL1 JMS WRBLK / FILE NO LONGER OPEN ON DATX CL2, LAC I PFLAG AND ([-FFILE]-1 / ONES COMPLEMENT DAC I PFLAG JMP CRTN /// / / READ / /// CREAD, LAC I PARG ISZ PARG DAC PLB LAC I PARG ISZ PARG DAC NWLB / REJECT DUMP MODE (4) AND ILLEGAL MODE (5..7) READS LAW 764000 AND MODE SZA JMP ERR07 / CHECK BUFFER STATUS LAC I PFLAG AND (FFILE+FINIT+FMODE XOR (FINIT+RMODE SNA JMP ERR11 XOR (FFILE SZA JMP ERR07 / FETCH RCW, VERIFY 1<=LEN<=127, / AND WORK OUT THE LENGTH OF THE LINE IN WORDS LAC I PPTR DAC T0 LAC I T0 AND (377000 SNA CLL JMP ERR23 / < 1 RAL SPA JMP ERR23 / > 127 RAR RTR RTR RTR RTR CMA TAD (1 DAC T2 / COPY LINE FROM THE DISK BUFFER / TO THE LINE BUFFER, ACCUMULATING WORDS INTO THE / CHECKSUM, AND WATCHING FOR LINES WHICH ARE / TOO LONG FOR THE LINE BUFFER LAC PLB DAC T1 DZM T3 CR0, LAC I T0 ISZ T0 DAC I T1 ISZ T1 TAD T3 DAC T3 ISZ T2 SKP JMP CR2 / END OF RECORD ISZ NWLB JMP CR0 / NOT END OF BUFFER / FLUSH THE TAIL END OF A RECORD / WHICH IS TOO LONG TO FIT IN THE LB, THEN / MARK THE RECORD AS TRUNCATED CR1, ISZ T0 ISZ T2 JMP CR1 LAC I PLB AND (777717 XOR (000060 DAC I PLB JMP CR3 / VALIDATE THE CHECKSUM, AND IF IT'S / BAD, MARK THE RECORD AS HAVING A CHECKSUM ERROR CR2, LAC T3 SNA JMP CR3 LAC I PLB AND (777717 XOR (000040 DAC I PLB / CHECK FOR END OF FILE, AND IF / IT IS, BACK THE POINTER UP BY 2 WORDS SO / THAT THE END OF FILE PERSISTS CR3, LAC I PLB AND (000007 XOR (000005 SZA JMP CR4 LAW -2 TAD T0 DAC T0 / COPY BACK POINTERS, THEN PICK UP / THE NEXT RCW, AND ADVANCE TO THE NEXT BLOCK IF IT'S / TIME TO DO SO; IF THE RCW SAYS IT'S TIME TO / ADVANCE TO THE NEXT BLOCK AND THE LINK IS 777777, WHICH / MEANS NO NEXT BLOCK, JUST LEAVE THE POINTERS ALONE, / WHCH WILL CAUSE THE NEXT READ TO FAIL RCW SANITY CR4, LAC T0 DAC I PPTR LAC I T0 SZA JMP CR5 LAC PBUF TAD (377 DAC T0 LAC I T0 SAD (777777 JMP CR5 JMS RDBLK LAC PBUF DAC I PPTR CR5, JMP CRTN /// / / WRITE / /// CWRITE, LAC I PARG ISZ PARG DAC PLB LAC I PARG ISZ PARG DAC NWLB / REJECT DUMP MODE (4) AND ILLEGAL MODE (5..7) WRITES LAW 764000 AND MODE SZA JMP ERR07 / CHECK BUFFER STATUS LAC I PFLAG AND (FFILE+FINIT+FMODE XOR (FINIT+WMODE SNA JMP ERR11 XOR (FFILE SZA JMP ERR07 / CHECK THAT THE WORD PAIR COUNT IN / THE LBH IS BETWEEN 1 AND 127, THEN WORK OUT THE / LENGTH IN WORDS, AND MOVE THE MODE FROM THE / WRITE CALL INTO THE FIRST WORD OF THE LBH JUST / LIKE ALL OF THE DEC HANDLERS LAC I PLB AND (377000 SNA CLL JMP ERR23 / < 1 RAL SPA JMP ERR23 / > 127 RAR RTR RTR RTR RTR CMA TAD (1 DAC NWLB LAC MODE CLL RAR RTR RTR RTR RTR DAC T0 LAC I PLB AND (777770 XOR T0 DAC I PLB / CHECKSUM THE LINE LAC PLB DAC T0 TAD (1 DAC T1 DZM I T1 LAC NWLB DAC T2 CLA CW0, TAD I T0 ISZ T0 ISZ T2 JMP CW0 CMA TAD (1 DAC I T1 / WRITE OUT THE LINE AND RETURN JMS WRITE JMP CRTN /// / / WAIT, WAITR / /// CWAIT, LAC I PCAL AND (001000 SZA ISZ PARG / WAITR JMP CRTN /// / / TRAN / /// CTRAN, LAC I PARG / COPY TRAN ARGS INTO ISZ PARG / LOCAL VARIABLES DAC BN LAC I PARG ISZ PARG DAC PLB LAC I PARG ISZ PARG DAC NWLB / DISPATCH ON FUNCTION LAC MODE SNA JMP CT01 / RD FWD SAD (001000 JMP CT04 / WR FWD JMP ERR06 / TRAN RD FWD CT01, LAC I PFLAG / CUSPS FAIL IF YOU AND (FFILE+FINIT / CHECK THE MODE OF THE XOR (FINIT / INIT SZA JMP ERR10 CT02, LAC BN / READ IN DATA BLOCK JMS RDBLK LAC PBUF DAC T0 LAW -400 DAC T1 CT03, LAC I T0 / MOVE A WORD ISZ T0 DAC I PLB ISZ PLB ISZ NWLB / TRAN WC RUN OUT ? SKP JMP CRTN / YES ISZ T1 / BLOCK RUN OUT ? JMP CT03 ISZ BN / YES, FIX BN AND ADVANCE JMP CT02 / TO THE NEXT BLOCK / TRAN WR FWD CT04, LAC I PFLAG / CUSPS FAIL IF YOU AND (FFILE+FINIT / CHECK THE MODE OF THE XOR (FINIT / INIT SZA JMP ERR10 CT05, LAC PBUF DAC T0 LAW -400 DAC T1 CT06, LAC I PLB / MOVE A WORD ISZ PLB DAC I T0 ISZ T0 ISZ NWLB / TRAN WC RUN OUT ? SKP JMP CT08 / YES ISZ T1 / BLOCK RUN OUT ? JMP CT06 LAC BN / YES, WRITE THE BLOCK DAC I PCBN JMS WRBLK ISZ BN / FIX BN AND JMP CT05 / ADVANCE TO THE NEXT BLOCK CT07, DZM I T0 / PAD FINAL BLOCK ISZ T0 CT08, ISZ T1 JMP CT07 LAC BN / WRITE FINAL BLOCK DAC I PCBN JMS WRBLK JMP CRTN / THE PER-FUNCTION HANDLERS RETURN / TO THE CALLER BY JUMPING TO CRTN; THIS IS A PDP-4/X / STYLE EXIT, RATHER THAN A STANDARD EXIT CRTN, EEMR JMP I PARG / THE PER-FUNCTION HANDLER JUMP TO / THE ERRXX ROUTINES TO LOAD UP AN ERROR AND JUMP TO / THE MONITOR'S IOPS REPORTING ROUTINE ERR06, LAW LAW+06 / IOPS 06, ILLEGAL HANDLER FUNCTION JMP ERRX ERR07, LAW LAW+7 / IOPS 07, ILLEGAL DATA MODE JMP ERRX ERR10, LAW LAW+10 / IOPS 10, FILE STILL ACTIVE JMP ERRX ERR11, LAW LAW+11 / IOPS 11, SEEK/ENTER NOT EXECUTE JMP ERRX ERR12, LAW LAW+12 / IOPS 12, I/O ERROR JMP ERRX ERR13, LAW LAW+13 / IOPS 13, FILE NOT FOUND JMP ERRX ERR14, LAW LAW+14 / IOPS 14, DIRECTORY FULL JMP ERRX ERR15, LAW LAW+15 / IOPS 15, DEVICE FULL JMP ERRX ERR17, LAW LAW+17 / IOPS 17, TOO MANY FILES FOR THE HANDLER JMP ERRX ERR23, LAW LAW+23 / IOPS XX, ILLEGAL WORD PAIR COUNT ERRX, JMP I (000004 / .MID+1 / ONCE-ONLY INITIALIZATION / AT EVERY CALL TO THE DRIVER THE ROUTINE / POINTED TO BY INIT IS CALLED IF INIT IS NON-ZERO / AT LOAD TIME, INIT CONTAINS A POINTER TO / THIS ROUTINE, WHICH SETS INIT TO 0, SO IT'S / RUN EXACTLY ONCE PER LOAD ONCE, 0 LAC (BUF / ZERO BUFFERS DAC T0 / ACTUALLY, THE ONLY THING WHICH LAC (-NBUF*BLEN / NEEDS TO BE ZEROED IS DAC T1 / THE PFLAG FIELD ON0, DZM I T0 ISZ T0 ISZ T1 JMP ON0 LAC (BMAP / ZERO IN-MEMORY BITMAPS DAC T0 / ACTUALLY, THE ONLY THING WHICH LAC (-10*40 / NEEDS TO BE ZEROED IS DAC T1 / WORD 3 ON1, DZM I T0 ISZ T0 ISZ T1 JMP ON1 DZM INIT / CALL ME ONCE JMP I ONCE / SEARCH THE DIRECTORY, WHICH IS ALREADY READ INTO / THE CURRENT BLOCK BUFFER, FOR THE NAME POINTED TO BY PFN / IF NOT FOUND RETURN JMS+1, IF FOUND RETURN JMS+2 / WITH DIRX VALID AND THE FILE'S FIRST BLOCK IN THE AC FINDFN, 0 LAW -30 / 24 FILES (SYSTEM) DAC T0 LAC PBUF / THIS CHECK WAS REVERSE-ENGINEERED TAD (203 / OUT OF A STANDARD DEC HANDLER DAC T1 LAW 777777 SAD I T1 JMP FF1 LAW -70 / 56 FILES (NORMAL) DAC T0 FF1, LAC PBUF TAD (40 DAC T1 DZM DIRX FF2, LAC PFN DAC T2 LAC I T1 / WORD 0 ISZ T1 SAD I T2 SKP JMP FF3 ISZ T2 LAC I T1 / WORD 1 ISZ T1 SAD I T2 SKP JMP FF4 ISZ T2 LAC I T1 / WORD 2 ISZ T1 SAD I T2 SKP JMP FF5 LAC I T1 / WORD 3 ISZ T1 SMA JMP FF6 AND (077777 ISZ FINDFN JMP FF7 FF3, ISZ T1 FF4, ISZ T1 FF5, ISZ T1 FF6, ISZ DIRX ISZ T0 JMP FF2 FF7, JMP I FINDFN / COMMON DELETE PROCESSING / CALLED WITH THE DIRECTORY BLOCK IN THE BUFFER / AND THE INDEX OF THE ENTRY TO BE DELETED / IN DIRX (USUALLY PUT THERE BY A CALL TO FINDFN) / ONLY THE VALID FLAG IS ZAPPED; LEAVING THE / NAME ALONE MAKES ENTER A LITTLE EASIER DELETE, 0 LAC DIRX / ZAP DIRECTORY ENTRY CLL RTL TAD PBUF TAD (40+3 DAC T0 DZM I T0 / VALID FLAG JMS WRBLK LAW 777770 / ZAP FILE BITMAP AND DIRX CLL RAR RTR TAD (71 JMS RDBLK LAC DIRX AND (7 CLL RAL RTL RTL TAD PBUF DAC T0 LAC PBMAP DAC T1 LAW -40 DAC T2 DE0, LAC I T0 DZM I T0 ISZ T0 DAC I T1 ISZ T1 ISZ T2 JMP DE0 JMS WRBLK LAC (100 / FIX ON-DISK AND IN-MEM AST JMS RDBLK LAC PBMAP DAC T0 LAC PBUF DAC T1 JMS GBMAP DAC T2 LAW -40 DAC T3 DE1, LAC I T0 XOR I T1 DAC I T1 ISZ T1 LAC I T0 XOR I T2 DAC I T2 ISZ T2 ISZ T0 ISZ T3 JMP DE1 JMS WRBLK JMP I DELETE / CHECK TO SEE IF THE IN-MEMORY / BITMAP ASSOCIATED WITH THE CURRENT UNIT IS VALID / WHERE "VALID" MEANS "ALL OF THE RESERVED BLOCKS ON THE / DEVICE ARE MARKED AS BUSY" / IF IT ISN'T IT, INITIALIZE IT FROM THE ON-DISK / BITMAP, ASSUMING THAT THE CURRENT BUFFER IS HOLDING THE / DIRECTOTY BLOCK (SO THE ON-DISK BITMAP IS IN THE / FIRST 40 WORDS OF THE BUFFER) / BLOCK 0 OF THE DEVICE IS FORCED TO BE BUSY IN THE / IN-MEMORY BITMAP; THIS SCARES OFF THE BLOCK ALLOCATION / ROUTINE, PREVENTING BLOCK 0 FROM BEING ALLOCATED, / WHICH PREVENTS IT FROM BEING ALLOCATED AS THE FIRST BLOCK / OF A FILE (SOME PROGRAMS, LIKE THE EDITOR, SEEM TO / GET CONFUSED BY FILES WHOSE FIRST BLOCK IS 0, BECAUSE / THE RETURN VALUE OF OPER/FSTAT IS STRANGE) VBMAP, 0 JMS GBMAP DAC T0 TAD (3 / THE MAP IS CONSIDERED DAC T1 / VALID IF ALL LAC I T1 / THE RESERVED BLOCKS ARE AND (077600 / MARKED AS BUSY XOR (077600 SNA JMP VB1 LAC T0 DAC T1 LAC PBUF DAC T2 LAW -40 DAC T3 VB0, LAC I T2 / COPY THE ON-DISK ISZ T2 / BITMAP INTO THE IN-MEMORY DAC I T1 / BITMAP ISZ T1 ISZ T3 JMP VB0 LAC I T0 / FORCE BLOCK 0 TO LOOK BUSY SMA XOR (400000 DAC I T0 VB1, JMP I VBMAP / ZAP THE IN-MEMORY BITMAP / ASSOCIATED WITH THE CURRENT UNIT SO THAT / IT NO LONGER APPEARS TO BE VALID ZBMAP, 0 JMS GBMAP TAD (3 DAC T0 DZM I T0 JMP I ZBMAP / ALLOCATE A BLOCK FROM THE IN-MEMORY / BITMAP (THIS CODE ASSUMES THAT THE IN-MEMORY BITMAP IS / VALID, WHICH IS ALWAYS THE CASE, BECAUSE IT'S MADE / VALID ON ANY CALL TO ENTER, AND THIS ROUTINE IS ONLY CALLED / ON BUFFERS WHICH HAVE FILES OPEN ON THEM FOR WRITE / THE BLOCK NUMBER IS RETURNED IN AC ABMAP, 0 JMS GBMAP / T0 POINTS TO WORD IN DAC T0 / THE DISK'S BITMAP LAC PBMAP / T4 POINTS TO WORD IN DAC T4 / THE FILE'S BITMAP LAW -40 DAC T1 DZM T2 AA1, LAW 777777 / FIND A WORD WHICH SAD I T0 / CONTAINS AT LEAST ONE JMP AA3 / FREE BLOCK LAC (400000 / WHEN YOU DO, FIND THE BLOCK AA2, DAC T3 / WHICH IS ACTUALLY FREE AND I T0 SNA JMP AA4 / FOUND IT ISZ T2 LAC T3 CLL RAR JMP AA2 AA3, LAC T2 / 18 BLOCKS PER WORD TAD (22 DAC T2 ISZ T0 ISZ T4 ISZ T1 JMP AA1 JMP ERR15 / NO SPACE AA4, LAC I T0 / MARK THE BLOCK AS BUSY XOR T3 / IN THE DISK'S BITMAP DAC I T0 LAC I T4 / MARK THE BLOCK AS USED XOR T3 / IN THE FILE'S BITMAP DAC I T4 LAC T2 JMP I ABMAP / GET ADDRESS OF IN-MEMORY / BITMAP ASSOCIATED WITH THE CURRENT UNIT / RETURN THE ADDRESS IN AC GBMAP, 0 LAC I PFLAG AND (FUNIT CLL RTR RTR RTR RTR RTR TAD (BMAP JMP I GBMAP / THIS ROUTINE WRITES THE RECORD / DESCRIBED BY LBH AND NWLB INTO THE CURRENT BUFFER / CHECKING TO SEE IF THE LINE FITS, AND DOING / THE NECESSARY FLUSHING AND BLOCK ALLOCATION WRITE, 0 LAC I PPTR / THE RECORD FITS IF CMA / PTR+LEN <= ADR(BUF[254]), OR TAD NWLB / 0 <= ADR(BUF[254])-PTR-LEN, OR TAD PBUF / ADR(BUF[254])-PTR-LEN >= 0 TAD (1+376 SMA JMP WR0 JMS ABMAP / GET NEXT BLOCK DAC T4 / SAVE THE NEW BLOCK NUMBER JMS FLUSH / WRITE OLD, PLANT LINK TO NEW, THEN LAC T4 / MAKE NEW THE DAC I PCBN LAC PBUF DAC I PPTR WR0, LAC I PPTR / GET WORKING PTR DAC T0 WR1, LAC I PLB / LB TO BUF ISZ PLB DAC I T0 ISZ T0 ISZ NWLB JMP WR1 LAC T0 / PUT WORKING PTR DAC I PPTR JMP I WRITE / THIS ROUTINE ZEROS OUT ALL / OF THE REMAINING WORDS IN THE BUFFER EXCEPT FOR / THE LAST (LINK) WORD, INTO WHICH IT STORES / THE CONTENTS OF THE AC, AND THEN IT WRITES THE BUFFER / OUT TO DISK (USED BY WRITE AND CCLOSE) FLUSH, 0 DAC T0 LAC I PPTR DAC T1 LAC PBUF TAD (000377 FL0, SAD T1 JMP FL1 DZM I T1 ISZ T1 JMP FL0 FL1, LAC T0 DAC I T1 JMS WRBLK JMP I FLUSH / READ BLOCK SPECIFIED BY AC / THE UNIT IS IN THE UNIT FIELD OF (PFLAG) / THE DATA IS READ INTO (PBUF) / THE BLOCK NUMBER IS REMEMBERED IN (PCBN) RDBLK, 0 DAC I PCBN JMS SRDWR LAW LAW+40 / READ SECTORS HWR 700 JMS RDBLK1 / 1ST 128 WORDS IN BLOCK JMS RDBLK1 / 2ND 128 WORDS IN BLOCK JMP I RDBLK RDBLK1, 0 RDB0, HRS / WAIT FOR BSY=0 AND (200 SZA JMP RDB0 HRR 700 / READ AND SAVE STATUS DAC T1 AND (010 / DATA TO MOVE ? SNA JMP RDB2 / NO LAW -200 DAC T2 RDB1, HRR+40 000 / COPY 128 WORDS HRR-10 000 DAC I T0 ISZ T0 ISZ T2 JMP RDB1 RDB2, LAC T1 / ERROR AND (001 SZA JMP ERR12 JMP I RDBLK1 / WRITE BLOCK SPECIFIED BY (PCBN) / THE UNIT IS IN THE UNIT FIELD OF (PFLAG) / THE DATA IS WRITTEN FROM (PBUF) WRBLK, 0 JMS SRDWR LAW LAW+60 / WRITE SECTORS HWR 700 JMS WRBLK1 JMS WRBLK1 JMP I WRBLK WRBLK1, 0 WRB0, HRS / WAIT FOR BSY=0 AND (200 SZA JMP WRB0 HRS / SEND DATA IF DRQ=1 AND (010 SNA JMP WRB3 LAW -200 DAC T1 WRB1, LAC I T0 ISZ T0 HWR+40 000 HWR 000 ISZ T1 JMP WRB1 WRB2, HRS / WAIT FOR BSY=0 AND (200 SZA JMP WRB2 WRB3, HRR 700 / ERROR ? AND (001 SZA JMP ERR12 JMP I WRBLK1 / COMMON SETUP FOR RDBLK AND WRBLK / THE BULK OF THE WORK IS TRANSFORMING THE DECTAPE / UNIT NUMBER (0..7) AND THE DECTAPE BLOCK / NUMBER (0..575) INTO THE STARTING LBN OF A 2 SECTOR / CHUNK OF DISK (THAT IS, EVALUATING THE FORMULA / LBN = 2*(1024*UN+BN)) AND SENDING IT TO THE DISK / THE DISK TRANSFER LENGTH IS SET TO 2, AND THE / ADDRESS OF THE BUFFER IS MOVED TO T0, BECAUSE THESE / OPERATIONS ARE ALSO COMMON TO READ AND WRITE SRDWR, 0 LAW -1077 TAD I PCBN SMA HLT LAW LAW+100 / DISK=0, LBA=1 HWR 600 SR0, HRS / WAIT FOR BSY=0, DRDY=1 AND (300 XOR (100 SZA JMP SR0 LAC I PFLAG / WORK OUT LBN AND (FUNIT CLL RAR RTR RTR TAD I PCBN CLL RAL HWR 300 / LOAD LBA[07..00] RAL HWR+40 400 / LOAD LBA[15..08] HWR+10 500 / LOAD LBA[23..16] LAW LAW+2 HWR 200 LAC PBUF DAC T0 JMP I SRDWR / DATA EOFLB, 001005 / LINE BUFFER HEADER 776773 / MARKING EOF INIT, ONCE / ONCE-ONLY INITIALIZATION PCAL, BSS 1 PARG, BSS 1 MODE, BSS 1 DATX, BSS 1 UNIT, BSS 1 T0, BSS 1 T1, BSS 1 T2, BSS 1 T3, BSS 1 T4, BSS 1 PLB, BSS 1 NWLB, BSS 1 PFN, BSS 1 DIRX, BSS 1 BN, BSS 1 PFLAG, BSS 1 PPTR, BSS 1 PDIRX, BSS 1 PFBN, BSS 1 PCBN, BSS 1 PBMAP, BSS 1 PBUF, BSS 1 BMAP, BSS 10*40 BUF, BSS NBUF*BLEN / END