/FIP VERSION 8.24 (01-JANUARY-75) / / / / /COPYRIGHT (C) 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY /ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH /THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS /SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO- /VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON /EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO /THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL REMAIN IN DEC. / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE /WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM- /MITMENT BY DIGITAL EQUIPMENT CORPORATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR /RELIABILITY OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT /SUPPLIED BY DEC. /FIP HANDLES ALL NON-RESIDENT FILE IOT'S /RUNS IN AN UPPER FIELD IN PLACE OF USER IT IS SERVING /RUNS IN EXEC MODE FIELD 1 /FIP LOADS ONTO DISK TRACK 1 *0 JMP I .+1 FIP0 LNS01, LNS0 RETBK1, RETBKS LNK01, LNK0 ZDS1, DS1 / *10 INDEX, 0 /ONLY REGISTER AVAILABLE IN FIP FOR INDEXING P5400, 5400 P2000, 2000 P0077, 0077 P0007, 7 FIDEXP, /TO REPLACE FIDEXP, FIPDEX WHERE FIPDEX=4 P0004, 4 FIPFLD, /FIELD WE ARE RUNNING IN C0020, 20 C002, FILPRP, FILPRO FIPDAT= 155 /DATA REFERENCED BY FIP *FIPDAT FIPJOB, . C0400, 400 SEGSIZ= C0400 /# WORDS PER SEGMENT FIBASE, SWDEX+JOBMAX /BASE ADDRESS OF ALLOCATABLE DISC STORAGE JOB, . /# OF CURRENT JOB JOBDAT, . /ADDRESS OF CURRENT JOB DATA LIST. MUST RESIDE IN DATA FIELD. P7000, CORTBA, CORTBL-1 /CORE ALLOCATION TABLE DEVTBA, DEVTBL /DEVICE TABLE DEVEND, DEVTBE /START OF ASSIGNABLE DEVICE TABLE DSBUSY, . /DISC BUSY COUNT /THE DATE IS KEPT AS A 12 BIT NUMBER IN THE FORMAT /DATE=((YEAR-1974)*12+(MONTH-1))*31+DAY-1 DATE, . BLTA, BLT0 /BLOCK TRANSFER BLT= JMS I BLTA CORSRA, CORSRC CORE= JMS I CORSRA GETBA, GETB GETBLK= JMS I GETBA GETDBA, GETDB0 /GET A DATA BLOCK GETDDB= JMS I GETDBA PRINTA, PRINT0 /TYPE OUT A CHARACTER PRINT= JMS I PRINTA GETJT0, GETJTB /GET JOB DATA TABLE ADDRESS GETJTA= JMS I GETJT0 RETBA, RETB /RETURN BLOCK TO FREE STORAGE RETBLK= JMS I RETBA WAITA, WSCHED WAIT= JMP I WAITA DEVOVR, JOBTBL /END OF DEVICE TABLE; START OF JOB TABLE *20 FIUSAC, 0 /SAVED USER AC FIJOB, 0 /JOB NUMBER FILE PHANTOM IS REPRESENTING FIOPTR, 0 /POINTER TO FIELD 0 IOT GDRETP, 0 /RETRIEVAL POINTER, SET BY GD0 ROUTINE WNDREM, 0 /REMAINDER FROM DIVISION BY 7 BUFSTA, 0 /BUFFER STATUS, 7777 IF FULL BUFMOD, 1 /BUFFER MODIFIED IF =0; UNCHANGED IF =1 SATSTA, 0 /SATSTATUS, 7777 IF CHANGED THIS RUN TABSTA, 0 /TABLE STATUS, 7777 IF CHANGED THIS RUN /POINTERS TO FILE PHANTOM'S INTERNAL TABLES JOBTAB, JTABLE /TABLE OF PROJ,PROG NUMBERS FOR ALL ACTIVE JOBS ENTEND, /END OF ENTRY TABLE UFDTBL, UTABLE /TABLE OF ALL ACCESSED UFD'S UFDEND, /TOP OF UFD TABLE RETTBL, RTABLE /TABLE OF RETRIEVAL INFORMATION FOR ALL ACCESSED UUFD'S ENTTBL, ENTABL-10 /TABLE REFLECTING STATE OF ALL POSSIBLE FILE NUMBERS BUFFER, 5400 /BUFFER FOR DIRECTORY MANIPULATIONS SATBOT, -SATSIZ /BOTTOM OF STORAGE ALLOCATION TABLE /SUBROUTINE POINTERS DE01, DE0 /GET A DIRECTORY ENTRY DS01, DS0 /DIRECTORY SEARCH GE01, GE0 /GET A DIRECTORY WORD INTO CORE GD01, GD0 /GET A FILE DIRECTORY ENTRY INTO CORE WRT1, WR1 /MAKE SURE THE BUFFER IS EMPTY DTE01, DTE0 FIO01, FIPIO /COMMON DISC I/O ROUTINE SATL1, SATLOK /GET A FREE SEGMENT FROM SAT TF01, TF0 /FREE AN ENTRY ON UFD TABLE UC01, UC0 /USER-OWNER FILE CHECK UFO01, UFO0 /OPEN A UFD UTS01, UTS0 /SEARCH UFD TABLE FOR PROJ,PROG NUMBER CL01, CL0 /CLOSE A FILE WND201, WND20 /DIVIDE BY SEVEN FIEXIT, FIX0 /EXIT ROUTINE BLDP1, BLDP /BUILD A POINTER TO ENTTBL ENR01, ENR0 REL01, REL00 WR01, WR0 GTBLO1, GTBLOK EBLD0, EBLD JBLD0, JBLD FIX401, FIX40 IFN01, IFN0 LGI201, LGI20 /-1 TO USER AC FGETJT= JMS I . FGETJ0 DIRBAD, BADDIR /CONSTANTS C0006, 6 C0200, 200 P0037, 37 P0003, 3 P6000, 6000 P0777, 777 C0605, 6605 C0005, 5 C0603, 6603 C7774, -4 C4400, 4400 C7771, 7771 P7770, 7770 CFLD= CDF 20 /FIP IS ALWAYS IN FIELD 2 EXQ1, UTPRNU, 0 /USED BY UTS0 ROUTINE TO HAVE THE PTR TO UFD TABLE WHILE SEARCHING CFH, 0 /THIS LOCATION IS USED FOR TEMP STORAGE BY MANY ROUTINES ACC01, ACT01 /SEE IF CALLING USER IS ACCOUNT 1 BASCO1, BASCO0 /SEE IF THE FILE IS BASIC BASSWT, 0 /SWITCH FOR BASIC C0010, 10 C7700, 7700 BASWIN, WINBAS /FIELD 1 ADDRESS OF BASIC WINDOW BAS1A, BAS0 /CREATES A BASIC WINDOW SEGLIM, 0 REWNDC, REL6, 0 FIOSTK, 0 /STACK HOLDING IOT LINKAGE 0 0 0 0 0 0 0 FLPARB, 0 /TABLE FOR READ OR WRITE PARAMETER CONSTRUCTION 0 0 0 0 0 OVERLA 0 /ROUTINE TO RELEASE FREE BLOCK, (IF ANY), IF IT IS /NECESSARY TO ABORT FIP FOR SOME REASON. RETURN, TAD FIOSTK /GET THE IOT THAT BROUGHT US HERE CMA /IS THERE A PARAMETER BLOCK? AND C4010 SZA CLA JMP I FIEXIT /NONE, OK TO EXIT DATFLD TAD I FIOPTR /GET THE BLOCK JMS I RETBK1 /RETURN IT SO IT WON'T BE LOST FOREVER CLA JMP I FIEXIT /NOW IT'S OK TO LEAVE C4010, 4010 /MASK FOR FINF AND WHO /FILE PHANTOM START /FIP'S FIRST JOB IS TO PICK UP THE IOT WHICH IT IS TO PERFORM /AND THE PARAMETERS WHICH GO ALONG WITH IT (IF ANY). THESE /ARE MOVED INTO AN 8-WORD BLOCK CALLED 'FIOSTK.' THE FIRST REG- /ISTER IN THIS BLOCK CONTAINS THE IOT, PARAMETERS FOLLOW *200 FIP0, CLL CLA IAC DCA BUFMOD /MARK BUFFER AS NOT MODIFIED DCA SATSTA /CLEAR SAT STATUS DCA TABSTA /CLEAR TABLE STATUS TAD BUFSTA /IS THERE VALID DATA IN THE BUFFER? SZA CLA IAC /YES; RE-CALCULATE DISK PARAMETERS IF NEEDED DCA BUFSTA 6201 /CDF FIELD ZERO TAD I JOB /GLOBAL TO "JOB" AND P0037 DCA FIJOB /SAVE IT CFLD FGETJT /SAVE USER AC JOBREG+2 DCA FIUSAC /ADDRESS OF USER'S AC FGETJT JOBLNK /IOT REQUEST WORD DCA FIOPTR /POINTER TO IOT LINKAGE DATFLD TAD I FIUSAC DCA FIUSAC /USER'S AC TAD I FIOPTR /PICK UP LINKAGE AND IC7400 /IS IT AN IOT? (IF IT IS, JOBLNK WILL HAVE BITS 0-3 CLEARED) SNA CLA JMP FIP2 /IS AN IOT, SO GO MOVE IT INTO FIOSTK (AC IS PARAMETER) TAD I FIOPTR /IS A POINTER, PICK UP LINKAGE DCA FIP6 /POINTER TO LINKAGE TABLE CFLD 6202 /CIF FIELD 0 BLT /MOVE IOT PARAMETERS INTO FIOSTK DATFLD FIP6, 0 6221 /CDF THIS FIELD FIOSTK /IOT LINKAGE BUFFER -10 TAD FIOSTK SPA CLA /WILL THE IOT PARAMETER BLOCK BE NEEDED TO RETURN PARS? JMP FIP4 /YES, SO DON'T RETURN IT TAD FIP6 JMS I RETBK1 /RETURN THE IOT PARAMETER BLOCK TO FREE CORE CLA CLL DATFLD DCA I FIOPTR /CLEAR JOBLNK TO AVOID CONFUSION LATER CFLD /COMES HERE WHEN IOT AND ITS PARAMETERS ARE COMFORTABLY /NESTLED IN FIOSTK FIP4, TAD IOTABL DCA FITPTR /TABLE POINTER FIP5, ISZ FITPTR /PICK UP IOT FROM TABLE TAD I FITPTR SNA /END OF TABLE? JMP I LGI201 /DON'T KNOW WHAT TO DO SO PASS BACK AN ERROR AT LEAST CIA /NO TAD FIOSTK /IOT FROM USER SZA CLA /DISPATCH? JMP FIP5 /NO TAD IOTABL /YES, FIND PROPER POINTER CIA TAD FITPTR TAD IODSPA DCA FITPTR TAD I FITPTR /PICK UP DISPATCH ADDRESS DCA FITPTR TAD FIOSTK /IS THIS AN IOT WHICH DOES REQUIRE PARAMETERS TO BE /RETURNED IN AN IOT PARAMETER BLOCK? SMA CLA /...IF SO, USER AC CONTAINS A PTR TO WHERE THEY WILL GO DCA FIUSAC /CLEAR USER AC JMP I FITPTR /DISPATCH /COMES HERE FOR A "SHORT" IOT. SAVED AC IS ONLY PARAMETER /PUT IT IN FIOSTK+1 FIP2, TAD I FIOPTR /PICK UP IOT DCA FIOSTK /PLACE ON STACK TAD FIUSAC /USER ACCUMULATOR DCA FIOSTK+1 /SIMULATE LINKAGE JMP FIP4-2 IOTABL, . /TABLE OF USER FILE IOT'S ASD /ASSIGN A DEVICE REL /RELEASE A DEVICE REN /RENAME A FILE OPEN /OPEN A FILE CLOS /CLOSE A FILE RFILE /FILE READ (WINDOW MOVE) PROT /FILE PROTECTION WFILE /FILE WRITE (WINDOW MOVE) CRF /CREATE A FILE EXT /EXTEND A FILE RED /REDUCE A FILE FINF /FILE INFORMATION LIN /LOGIN LOUT /LOGOUT WHO /RETURN PASSWORD SEGS /RETURN # OF DISK SEGMENTS AVAILABLE 0 IODSPA, IODISP-1 FITPTR, 0 IC7400, 7400 /ROUTINE TO GET A DIRECTORY ENTRY INTO CORE /CALLING SEQUENCE: / TAD (INTERNAL FILE NUMBER) / JMS GD0 / RETURN (BUFFER POINTER IN AC, 0=ERROR) GD0, 0 JMS I EBLD0 DCA GDUFDP TAD I GDUFDP /RELATIVE POSITION IN UFD TABLE JMS I BLDP1 DCA GDRETP /POINTER TO UFD RETRIEVAL INFORMATION ISZ GDUFDP TAD I GDUFDP /PICK UP ENTRY ADDRESS WITHIN UFD DCA GD1 TAD GDRETP JMS I GE01 /GET ENTRY INTO CORE GD1, 0 JMP I GD0 GDUFDP, 0 IFN0, 0 TAD FIOSTK+1 AND P0003 DCA FIOSTK+1 JMP I IFN0 EBLD, 0 DCA CFH TAD FIJOB CLL RTL TAD CFH RAL TAD ENTTBL JMP I EBLD WR0, 0 /WRITE OUT THE CONTENTS OF THE BUFFER TAD C0605 /WRITE IOT DCA FLPARB /I/O PARAMETER BLOCK JMS I FIO01 /PERFORM THE WRITE HLT /ERROR ON WRITE, TOO BAD CLA IAC DCA BUFMOD /SET NOT-MODIFIED STATUS JMP I WR0 /ROUTINE TO OPEN A FILE OPN0, JMS I BASCO1 /IF BASIC SET BASSWT TO -1 DCA OPENTT /PTR TO ENTTBL JMS I JBLD0 /PROJ PROG # OF THIS JOB IN AC DCA PRJPRO /SAVE PROJ, PROG # TAD FIOSTK+2 SNA /IF HE OWNS THE FILE THEN FIOSTK+2 IS 0 JMP OPNOWN /YES, HE DOES CIA TAD PRJPRO /IF HE HAS MENTIONED THE PROJ, PROG # SNA CLA /CHECK IF HE IS THE OWNER JMP OPNOWN STA TAD FIOSTK+2 /TRYING TO OPEN ACCOUNT 1 FILE? SZA CLA JMP .+6 /NO, OK TAD FIOSTK+3 /WHOSE UFD? CIA TAD PRJPRO /HIS/HER OWN? SZA CLA JMP OPN3 /NO, TELL HIM/HER FILE NOT FOUND TAD FIOSTK+2 AND C7700 /TAKE OUT JUST THE PROJ # OF THE FILE CIA TAD PRJPRO /DOES IT AGREE WITH JOB'S PROJ #? AND C7700 SNA CLA TAD P0003 /4 IN AC SAME PROJ # CLL IAC /1 IN AC DIFF PROJ # JMP .+4 OPNOWN, TAD PRJPRO DCA FIOSTK+2 TAD C0010 /10 IN AC IF HE OWNS THE FILE DCA PRJPRO /STORE PROTECTIVE BITS FOR READ CASE TAD FIOSTK+2 /PICK UP THE PROJ PROG # OF THE FILE JMS I UTS01 /SEARCH OPEN UFD TABLE RETURN WITH PTR IN AC JMP OPN6 /UFD NOT OPEN, GO OPEN IT OPN2, DCA I OPENTT /SAVE ITS RELATIVE PTR IN ENTTBL TAD I OPENTT /GET RELATIVE ADDRESS OF UFD TBL JMS I BLDP1 /BUILD A PTR TO RETTBL ENTRY DCA FIOSTK+2 /SAVE IT JMS I DS01 /3 WORD SEARCH FIOSTK+2 JMP OPN3 /NO SUCH FILE TAD P0007 /PTR TO RETRIEVAL ENTRY IN BUFFER DCA OPBUFP ISZ OPENTT TAD I ZDS1 /GET THIS FILE'S DIRECTORY ADDRESS DCA I OPENTT /SAVE IN SECOND WORD OF ENTTBL ENTRY CLL CMA RTL /-3 IN AC TAD OPBUFP /PTR TO PROTECTION BIT JMS I OPN11A /CHECK PROTECTION OF THE FILE PRJPRO, 0 TAD I OPBUFP /ADD POINTER TO FIRST RETRIEVAL WINDOW AND DCA PRJPRO /SAVE WITH PROTECTION BIT TAD OPNFI0 /JOB STATUS WORD FILE FOR FILE 0 TAD FIOSTK+1 DCA OPACSC /FOR LINKING A BLOCK TAD I OPBUFP /GET RETRIEVAL WINDOW DCA OPBUFP /SAVE IT TAD FIOSTK+2 JMS I GE01 /GET RETRIEVAL WINDOW IN CORE OPBUFP, 0 DCA OPENTT /SAVE THE BUFFER ADDRESS FGETJT /GET THE ADDRESS OF JOB STATUS FOR THIS FILE OPACSC, 0 DCA OPACSC /SAVE POINTER TAD OPACSC JMS I GTBLO1 /GET A BLOCK LINKED FOR FILE CONTROL JMP OPNOT /NO FREE CORE; CAN'T OPEN THEN DCA OPBUFP /SAVE IT TO BUILD THE FILE CONTROL BLOCK ISZ BASSWT JMP OPN123 TAD I BASWIN /IS BASIC WINDOW ALREADY SET UP? IAC SNA CLA /YES THEN HAS -1 JMP OPRET1 /BASIC WINDOW ALREADY LOADED TAD OPENTT /BUFFER ADDRESS OF THE WINDOW JMS I BAS1A /CREATE BASIC WINDOW OPRET1, TAD BASWIN /PUT BASIC WINDOW POINTER IN CONTROL BLOCK DCA I OPBUFP OPRET, CFLD CLA CMA /ACCESS COUNT IN UFDTBL TAD I UTPRNU /INCREASE BY -1 DCA I UTPRNU DATFLD ISZ OPBUFP ISZ OPBUFP /POINTS TO PROTECTION BIT TAD PRJPRO DCA I OPBUFP /PUT IN THE WRITE PROT BIT CREATED BEFOREHAND JMP I .+1 /EXIT AND WRITE OUT TABLES TABOUT OPN123, TAD OPBUFP /LINK A BLOCK JMS I GTBLO1 JMP OPN4 /NO FREE CORE, CAN'T OPEN DCA OPENTU CFLD CIF BLT CFLD /SOURCE OPENTT, 0 DATFLD OPENTU, 0 -10 JMP OPRET OPN5, SNA /DID THE ACCOUNT EXIST? JMP OPNOT /YES; LACK OF ROOM IN UFDTBL OPN3, STL CLA RTR /NOT FOUND ERROR OPNPRE, TAD P2000 /PROTECTED TAD P2000 OPNOT, CLL CML RAR /NOT OPEN, LACK OF SYSTEM RESOURCES DCA FIUSAC TAD FIOSTK+1 JMS I EBLD0 /BE SURE TO REMOVE ALL THE POINTERS PUT IN BY OPEN DCA OPENTT DCA I OPENTT JMP I FIEXIT OPN4, TAD I OPACSC /CONTROL BLOCK ADDR JMS I RETBK1 /RETURN IT DATFLD DCA I OPACSC /CLEAR POINTER FROM JOB BLOCKS CFLD JMP OPNOT /TELL HIM/HER WE COULDN'T OPEN OPN6, TAD FIOSTK+2 /PICK UP PROJ PROG # JMS I UFO01 /OPEN UFD JMP OPN5 /NO LUCK, ERROR JMP OPN2 /OPENED RELATIVE POSITION IN AC OPNFI0, JOBF0 OPN11A, OPN11 /ROUTINE TO CLOSE A FILE *600 CLS0, DCA CLSIFN /INTERNAL FILE NUMBER TAD C7774 DCA CLCNTR /COUNTER FOR BIT SCAN CLS1, TAD FIOSTK+1 /PICK UP BIT PATTERN RAL DCA FIOSTK+1 SZL JMP CLS3 CLS2, ISZ CLSIFN /NEXT FILE NUMBER ISZ CLCNTR /DONE ALL FOUR? JMP CLS1 /NO, KEEP AT IT JMP I FIEXIT /THROUGH CLS3, TAD CLSIFN /PICK UP INTERNAL FILE NUMBER JMS CL0 /CLOSE THE FILE JMP CLS2 /LOOK FOR MORE CLSIFN, 0 CLCNTR, 0 /ROUTINE TO DO ACTUAL FILE CLOSE CL0, 0 JMS I EBLD0 DCA CLENTP TAD CFH JMS I LNK01 /RETURNS WITH PTR TO FILE CONTROL BLOCK FROM JOB STATUS BLOCK SNA JMP CL3 /FILE WAS NOT OPEN DCA CLPARP /SAVE IT DCA I CFH /CLEAR POINTER TO FILE CONTROL BLOCK --- INDICATES FILE CLOSED CFLD /SET DATA FIELD TO THIS FIELD TAD CLPARP /POINTER TO PARAMETER BLOCK JMS I CLOBA /PROPERLY CLOSE TESTING FOR BASIC DCA CLO3 /SWITCH SET TO -1 IF BASIC FILE CLA CMA CLL TAD I CLENTP /RELATIVE POINTER TO UFD RETRIEVAL TABLE CLL RTL IAC TAD UFDTBL DCA CLUFDP /POINTER TO ACCESS COUNTER DCA I CLENTP /CLEAR PTR IN ENTTBL TO INDICATE FILE IS CLOSED CLA CMA DCA TABSTA /SET TABLE STATUS TO WRITE OUT ISZ I CLUFDP /REMOVE THIS JOB FROM ACCESS COUNT IN UFDTBL JMP I CL0 /THIS WAS THE ONLY GUY USING THIS UFD, SO CLOSE IT OUT ISZ CLO3 /IS IT BASIC FILE BEING CLOSED? JMP CL11 /NO, PROCEED FURTHER DATFLD /YES, JUST ZERO ONE LOC IN FIELD 1 DCA I BASWIN CFLD CL11, CLA CMA /NO ONE IS NOW ACCESSING THIS UFD TAD CLUFDP JMS I TF01 /FREE A TABLE ENTRY CL3, CFLD JMP I CL0 CLOBA, CLOBAS CLPARP, 0 CLENTP, 0 CLUFDP, 0 /SKIPS IF NO OTHER USER IS ACCESSING THIS FILE ENR0, 0 TAD FIOSTK+1 JMS I EBLD0 DCA ENR1 /PTR INTO ENTTBL ISZ ENR1 TAD I ENR1 /GET ADDR IN ENTTBL DCA ENR1 TAD GDRETP /RTABLE JMS I ENS01 /HOW MANY PEOPLE HAVE THIS FILE OPEN? ENR1, 0 SKP /FOUND THE SAME FILE OPEN ISZ ENR0 /...ONLY ONE WHO HAS IT OPEN JMP I ENR0 ENS01, ENS0 /CHANGE THE PROTECTION OF A FILE PRT0, TAD FIOSTK+1 /PICK UP INTERNAL FILE NUMBER RTR RTR RAR AND P0003 /AND OFF PROTECTION BITS DCA PRIFNU /INTERNAL FILE NUMBER TAD PRIFNU JMS I UC01 /CHECK TO SEE IF USER IS OWNER JMP PRT1 /ERROR RETURN, USER IS NOT OWNER JMS I ACC01 /IS HE UNDER ACCOUNT 1? JMP PRT1+1 /YES; ERROR - HE MUST USE #RENAME# TAD PRIFNU JMS I GD01 /GET THIS DIRECTORY ENTRY INTO CORE SNA JMP I DIRBAD /**************DEBUG************* TAD P0004 DCA PRENTP /POINTER TO PROTECTION BITS OF THIS FILE TAD C7637 AND FIOSTK+1 /PICK UP NEW PROTECTION BITS DCA I PRENTP /RESTORE DCA BUFMOD /SCHEDULE WRITE JMP I FIEXIT PRT1, SZA CLA /ERROR CLL CML RAR CLL CML RAR DCA FIUSAC JMP I FIEXIT CLO3, PRIFNU, 0 PRENTP, 0 C7637, 7637 WHO0, JMS I JBLD0 DCA PAS1 CMA /ONE WORD SEARCH JMS I DS01 /SEARCH THE MFD FOR THIS ACC'T # PAS0 JMP I DIRBAD /************DEBUG ONLY*********** DCA PAS1 TAD I PAS1 /GET ACC'T # FROM UFD FILE NAME BLOCK ISZ PAS1 DCA FIOSTK+1 /STORE ACC'T # TAD I PAS1 ISZ PAS1 DCA FIOSTK+2 /STORE FIRST TWO CHRS OF PASSWORD TAD I PAS1 DCA FIOSTK+3 /STORE LAST TWO CHARS OF PASSWORD JMP I PAINF5 /GO STORE THIS INFORMATION FOR RETURN TO MONITOR PAINF5, INF5 PAS0, RTABLE PAS1, JBLD, 0 TAD FIJOB TAD JOBTAB CFLD DCA CFH TAD I CFH JMP I JBLD /ROUTINE TO MOVE THE RETRIEVAL WINDOW IN FIELD ZERO *1000 WND0, TAD FIOSTK+2 /PICK UP INTERNAL FILE NUMBER AND P0003 /AND OFF FIELD BITS JMS I EBLD0 DCA WNENTP /POINTER TO RETRIEVAL INFORMATION POINTER TAD I WNENTP JMS I BLDP1 /GENERATE ABSOLUTE PTR INTO RETTBL DCA WNRETP /RETRIEVAL POINTER TAD FIOSTK+7 DCA WNFCBP /PTR TO THIS FILE'S FILE CONTROL BLOCK TAD FIOSTK+5 DCA WND5 /LOW ORDER DISK ADDRESS DCA WNDCNT /GET INTO CORE TAD WNDCCT /INITIALIZE COUNT DCA WNDSCT TAD C0177 AND FIOSTK+1 /GET HIGH ORDER FILE ADDRESS DCA WNDIRP TAD SEGSIZ /GET RID OF ADDRESS WITHIN SEGMENT CLL CIA AND WND5 RAL TAD WNDIRP /NOW HAVE FILE SEGMENT #; NEED TO SHIFT IT SKP RAL ISZ WNDSCT /SHIFT SEGCCT TIMES? JMP .-2 DCA WNSEGC DATFLD /WNSEGC NOW HAS SEGMENT NUMBER TO GET TAD I WNFCBP /PICK UP FIELD 0 WINDOW POINTER DCA WNDPTR /PNTS TO FILE RETRIEVAL WINDOW FOR THIS FILE ISZ WNFCBP TAD I WNFCBP /PICK UP NUMBER OF CURRENT SEGMENT IN WINDOW DCA WNCURS /CURRENT SEGMENT IN WINDOW TAD WNSEGC /SEGMENT TO GET JMS I WND201 /DIVIDE BY 7 (IGNORE REMAINDER) JMS WND30 /MULTIPLY BY 7 DCA WNSEGC /FIRST SEGMENT IN PROPER WINDOW CLA CMA TAD I WNDPTR /GET FIRST WORD OF FILE RETRIEVAL WINDOW SNA CLA /=7777? JMP WND6 /INVALID WINDOW POINTER TAD WNCURS /CURRENT SEGMENT AT TOP OF CURRENT CORE WINDOW CIA /NOW SEE IF THE SEGMENT BEING SOUGHT IS ONE WHICH FOLLOWS /THOSE WHICH ARE PRESENTLY IN THE CORE WINDOW. IF THE /SOUGHT BLOCK DOES FOLLOW THE PRESENT ONE, WE CAN LOOK /THROUGH THE RETRIEVAL INFORMATION BLOCKS STARTING AT THE ONE /NOW IN CORE. OTHERWISE, WE MUST START AT THE VERY BEGINNING /OF THE LIST OF FILE RETRIEVAL INFORMATION BLOCKS TAD WNSEGC SPA SNA JMP WND6 /PREVIOUS BLOCK, SO MUST START AT BEGINNING OF STRING JMS I WND201 /DIVIDE BY 7 CIA DCA WNDCNT /MOVE FORWARD THIS MANY WINDOWS TAD WNDPTR WND10, DCA WNDIRP TAD I WNDIRP /PICK UP ADDRESS OF NEXT WINDOW CFLD /CHANGE TO CURRENT FIELD SNA JMP WND13 /END OF STRING DCA WND11 TAD WNRETP /POINTER TO UFD RETRIEVAL INFORMATION JMS I GE01 /GET ENTRY INTO CORE WND11, 0 ISZ WNDCNT /HAVE WE MOVED AHEAD ENOUGH BLOCKS? JMP WND10 /NOT PROPER WINDOW, KEEP LOOKING DCA WNDIRP WND13, 6202 /CIF FIELD 0 BLT 6221 /SOURCE FIELD (ALWAYS 2) WNDIRP, 0 /SOURCE DATFLD /DESTINATION FIELD WNDPTR, 0 /DESTINATION -10 /WORD COUNT TAD WNDCNT /CORRECT FOR WINDOWS THAT WEREN'T THERE JMS WND30 /MULTIPLY BY 7 TAD WNSEGC /SEGMENT NUMBER OF FIRST IN WINDOW DATFLD DCA I WNFCBP /FILE CONTROL BLOCK POINTER ISZ WNFCBP /POINT AT PROTECTION WORD IN CONTROL BLOCK TAD I WNFCBP /GET CURRENT STATUS AND P0007 /SAVE ONLY STATUS BITS TAD WND11 /ADD IN POINTER TO CURRENT RETRIEVAL WINDOW DCA I WNFCBP /AND SAVE JMP I .+1 /GO SET #JSIOTC# BEFORE EXITING INF6 WND6, CFLD /CHANGE TO CURRENT FIELD CLA CLL TAD WNSEGC /SEGMENT TO GET INTO IN CORE WINDOW JMS I WND201 /DIVIDE BY 7 CMA DCA WNDCNT /WINDOW NUMBER TO GET INTO CORE ISZ WNENTP TAD I WNENTP /UFD ENTRY ADDRESS OF OPEN FILE DCA WND5 TAD WNRETP /RETRIEVAL INFORMATION POINTER JMS I GE01 /GET ENTRY INTO CORE WND5, 0 TAD P0007 JMP WND10 /ROUTINE TO MULTIPLY A NUMBER BY 7 WNDSCT, WND30, 0 DCA CFH TAD CFH CLL RAL TAD CFH CLL RAL TAD CFH JMP I WND30 WNFCBP, 0 WNENTP, 0 WNRETP, 0 WNDCNT, 0 WNSEGC, 0 WNDCCT, 7773 WNCURS, 0 C0177, 177 IODISP, ASD1 REL1 REN0 OPN0 CLS0 WND0 PRT0 WND0 CRF0 EXT0 RED0 INF0 LGI0 LGO0 WHO0 SEGS0 *1200 /ROUTINE TO CREATE A NEW FILE CRF0, TAD FIOSTK+1 SNA CLA JMP CRF30 JMS I JBLD0 JMS I UTS01 /SEARCH THE UFD TABLE JMP I DIRBAD /***************DEBUG************** JMS I BLDP1 /BUILD A PTR TO RETTBL DCA FIOSTK /MAKE A LINKAGE FOR DIRECTORY SEARCH JMS I ACC01 /IS IT ACCOUNT 1? CMA /YES; MAKE IT A ONE WORD SEARCH JMS I DS01 /SEARCH THE DIRECTORY FOR THIS NAME FIOSTK /POINTER TO SEARCH PARAMETERS JMP CRF2 /COULD NOT FIND THIS NAME, CONTINUE DCA CRBUFP /FOUND A FILE OF THIS NAME IN UFD. PTR INTO CRBUFP JMS I ACC01 /SEE IF THIS IS ACCOUNT 1 JMP CRF30 /CAN'T DELETE UFD'S AS THOUGH THEY ARE FILES TAD I ZDS1 /POINTER TO "DS1"=ADDR WITHIN UFD WHERE THIS FILE NAME'S BLOCK IS DCA CRF11 /UFD ADDRESS OF DIRECTORY ENTRY TAD FIOSTK JMS I CRENS /SEARCH ENT TABLE FOR ACCESSES TO THIS FILE CRF11, 0 /UFD ADDR OF DIRECTORY ENTRY JMP CRF10 /ERROR, FILE IS OPEN /COMES HERE IF A FILE BY THIS NAME ALREADY EXISTS, BUT NO ONE HAS OPENED IT TAD CRF11 DCA I CRGD11 /GD1 TAD FIOSTK DCA GDRETP TAD CRBUFP /PTR TO WHERE IN CORE BUFFER THE UFD BLOCK FOR THIS FILE IS JMS I SAVCRA /DELETE THE EXISTING FILE OF THIS NAME JMS I DS01 /SEARCH THE UFD FOR AN EXISTING FILE OF THE SAME NAME FIOSTK SKP /NONE THERE, SO OKAY TO CREATE ONE JMP I DIRBAD /**************DEBUG ONLY********** /NOW ALL SET TO CREATE THE FILE. TO DO THIS, WE NEED TWO BLOCKS OF /THE UFD -- ONE FOR A NAME BLOCK AND THE SECOND FOR A FILE RETRIEVAL INFORMATION /BLOCK. THESE BLOCKS ARE OBTAINED BY TWO CALLS TO DE0. AFTER THE FIRST, /A DUMMY 7777 IS PUT IN THE FOUND BLOCK TO PREVENT THE SECOND CALL /TO DE0 FROM FINDING THE SAME BLOCK. IF BOTH BLOCKS CANNOT BE OBTAINED, /THE CREATE CANNOT BE EXECUTED. CRF2, DCA CRLINK /ADDR OF LINK WORD OF LAST ENTRY IN UFD CHAIN ISZ UTPRNU /POINTS AT LOGIN DISK QUOTA TAD I UTPRNU /-SEGMENTS ALLOWED WHILE LOGGED IN TAD SEGLIM /PLUS NUMBER OF SEGMENTS FOUND WHILE SEARCHING HIS/HER DIRECTORY ISZ UTPRNU /POINT AT HOLD REG FOR SEGMENT COUNT SMA CLA /IS HE ALLOWED ONE MORE? JMP CRF1 /NO; TELL HIM/HER DIRECTORY FULL TAD FIOSTK /POINTER TO RETRIEVAL INFORMATION JMS I DE01 /FIND AN EMPTY DIRECTORY ENTRY JMP CRF1 /ERROR, NO AVAILABLE ENTRIES DCA CRF4 /ADDRESS OF THIS ENTRY JMS CRF40 /GET THIS ENTRY INTO CORE CLA CMA DCA I CRBUFP /SIMULATE A USED ENTRY DCA BUFMOD /SCHEDULE WRITE TAD FIOSTK JMS I DE01 /FIND ANOTHER ENTRY JMP CRF51 /ERROR DCA CRF3 TAD FIOSTK JMS I GE01 /MAKE SURE SECOND ENTRY IS IN CORE CRF3, 0 DCA INDEX JMS I SATL1 /FIND A FREE SEGMENT IN THE SAT SNA JMP CRF20 /COULD NOT FIND A FREE SEGMENT /AT THIS POINT, WE HAVE A DISC SEGMENT AND TWO BLOCKS FROM THE /UFD. THIS IS ALL THAT IS NEEDED, SO GO AHEAD AND EXECUTE THE CREATE DCA CRF11 /SAVE SEGMENT NUMBER TAD CRF11 DCA I INDEX /PUT IT IN THE FIRST BLOCK OF RETRIEVAL DCA BUFMOD /SCHEDULE WRITE JMS CRF40 /GET FIRST FOUND ENTRY INTO CORE TAD FIOSTK+1 /TRANSFER FILE NAME INTO DIRECTORY ENTRY DCA I CRBUFP TAD CRBUFP /MOVE POINTER TO AUTO-INDEX DCA INDEX TAD FIOSTK+2 DCA I INDEX TAD FIOSTK+3 DCA I INDEX DCA I INDEX /ZERO LINK (THIS IS THE LAST FILE) TAD CRPROT /PICK UP PROTECTION BITS DCA I INDEX /STORE INITIAL PROTECTION CODE JMS I CRFUFA /GO SEE IF WE'RE CREATING A NEW ACCOUNT CDF /CDF FIELD 0 TAD I DATE /GLOBAL TO DATE CFLD /CHANGE TO CURRENT FIELD CRFUFR, DCA I INDEX /STORE DATE OF CREATION TAD CRF3 /POINTER TO RETRIEVAL DCA I INDEX /SET UP PTR TO RETRIEVAL INFORMATION DCA BUFMOD /SCHEDULE WRITE TAD FIOSTK /GET LAST ENTRY ON STRING INTO CORE JMS I GE01 CRLINK, 0 DCA CRBUFP /PTR TO WHERE THE PRESENT LAST ENTRY IS TAD CRF4 DCA I CRBUFP DCA BUFMOD /SCHEDULE WRITE JMS I ACC01 /IS HE CREATING A NEW UFD? JMP CRFUFZ /YES IAC CRFSEG, TAD SEGLIM /STORE SEGMENT COUNT IN THE UFDTBL DCA I UTPRNU JMP I .+1 /REMEMBER TO WRITE OUT THE TABLES TABOUT CRFUFZ, TAD CRF11 JMS I SCL01 /WRITE OUT DIRECTORY BLOCK & CLEAR NEW UFD BLBOCK JMP I FIEXIT /DON'T MODIFY THE MFD'S ENTRY IN THE UFDTBL CRF20, STL RTR /DISK FULL STL RTR DCA FIUSAC /SAVE PARTIAL ERROR CODE CRF51, JMS CRF40 /GET FIRST ENTRY BACK AGAIN DCA I CRBUFP /ZERO OUT THE -1 WE PUT THERE DCA BUFMOD /SCHEDULE WRITE CRF1, CLA CLL CML RTR CLL CML RAR TAD FIUSAC /GET PARTIAL ERROR CODE DCA FIUSAC /SAVE ERROR CODE; EITHER DISK FULL OR DIRECTORY FULL JMP CRFSEG /GO SAVE SEGMENT COUNT ANYWAY CRF30, CLA CLL CML RTR CRF10, TAD C4400 DCA FIUSAC /SAVE ERROR CODE; EITHER FILE IN USE OR BAD FILE NAME JMP I FIEXIT CRF40, 0 TAD FIOSTK JMS I GE01 CRF4, 0 DCA CRBUFP JMP I CRF40 CRPROT, 12 CRGD11, GD1 CRENS, ENS0 SAVCRA, SAVCRE SCL01, SCL0 CRFUFA, CRFUFD CRBUFP, 0 /ROUTINE TO EXTEND A FILE *1400 EXT0, JMS EXT1 /MAKE SURE IT'S OKAY TO EXTEND THIS FILE TAD P0007 /...EXT1 RETURNS WITH PTR TO NAME BLOCK FOR THIS FILE DCA EXBUFP /SAVE POINTER TO RETRIEVAL CHAIN JMS I EXTQUA /CHECK THE DISK QUOTA FOR THIS USER /NOW TRACE THROUGH TO LAST RETRIEVAL INFORMATION BLOCK FOR THIS FILE EXT4, TAD I EXBUFP SNA /END OF CHAIN? JMP EXT3 /YES DCA EXWNDP /WINDOW POINTER TAD EXWNDP JMS EXGE0 /GET WINDOW INTO CORE DCA EXBUFP /SAVE POINTER TO NEXT RETRIEVAL WINDOW JMP EXT4 /KEEP LOOKING FOR END EXT3, TAD C7771 DCA EXT1 /7 SEGS PER WINDOW EXT5, ISZ EXBUFP TAD I EXBUFP /PICK UP ENTRY IN WINDOW SNA CLA /IS IT THE FIRST FREE? JMP EXT7 /YES, FIND A SEGMENT ISZ EXT1 /END OF WINDOW? JMP EXT5 /NO, KEEP LOOKING EXT9, TAD GDRETP /RETRIEVAL POINTER JMS I DE01 /FIND AN EMPTY ENTRY JMP EXT20 /PARTIALLY SATISFIED DCA EXNFRE /FREE SEGMENT ADDRESS TAD EXWNDP /CURRENT WINDOW POINTER JMS EXGE0 /GET IT INTO CORE DCA EXBUFP JMS I SATL1 /GET A FREE DISK SEGMENT FOR THE NEXT WINDOW SNA JMP EXT20 /THERE ARE NONE; AVOID LINKING TO NEXT WINDOW DCA EXPROP /SAVE UNTIL WINDOWS ARE LINKED UP TAD EXNFRE /NEXT FREE WINDOW DCA I EXBUFP /LINK IT ONTO CHAIN DCA BUFMOD /SCHEDULE WRITE TAD EXNFRE DCA EXWNDP /UPDATE CURRENT WINDOW POINTER TAD EXWNDP JMS EXGE0 /GET NEW WINDOW INTO CORE IAC DCA EXBUFP /POINTER TO FIRST ENTRY OF NEW WINDOW TAD C7771 /ALLOW 7 ENTRIES IN NEW WINDOW DCA EXT1 TAD EXPROP /GET DISK SEGMENT EXT12, DCA I EXBUFP /STORE SEGMENT IN RETRIEVAL WINDOW DCA BUFMOD /SCHEDULE WRITE ISZ I EXQ1 /INCREMENT TOTAL COUNT IN UFDTBL ISZ EXBUFP /INCR WINDOW POINTER ISZ EXSEGC /HAVE WE EXTENDED FAR ENOUGH? JMP EXT6 /NO EXT20, TAD EXSEGC CIA DCA FIUSAC /NUMBER OF SEGMENTS WE FAILED TO FIND TAD FIOSTK+1 /REQUEST IS SATISFIED JMS I GD01 /GET DIRECTORY ENTRY INTO CORE TAD C0005 DCA EXBUFP /POINTER TO SEGMENT COUNT TAD FIOSTK+2 /NUMBER OF WORDS TO BE ADDED TAD I EXBUFP /NUMBER ALREADY IN FILE TAD EXSEGC /MINUS NUMBER WE FAILED TO GET DCA I EXBUFP /UPDATE ENTRY DCA BUFMOD /SCHEDULE WRITE JMP I .+1 /EXIT AND WRITE OUT TABLES TABOUT EXT6, ISZ EXT1 /END OF CURRENT WINDOW? SKP /NOT YET JMP EXT9 /YES, TRY LINKING TO ANOTHER EXT7, JMS I SATL1 /GET A FREE SEGMENT FROM SAT SNA JMP EXT20 /PARTIALLY SATISFIED JMP EXT12 /SAVE NEW SEGMENT EXGE0, 0 /GET WORD OF THIS UFD INTO CORE DCA EXGE1 TAD GDRETP JMS I GE01 EXGE1, 0 JMP I EXGE0 EXT30, TAD C4400 JMP EXT10+2 EXT10, CLL CML RAR CLL CML RAR DCA FIUSAC JMP I FIEXIT EXTQUA, EXTQU0 EXFCBP, 0 EXPROP, 0 EXBUFP, 0 EXWNDP, 0 EXSEGC, 0 EXNFRE, 0 /ROUTINE TO SET UP TO ALTER A FILE (BY EITHER EXTENDING IT OR /REDUCING IT). CHECK PROTECTION CODE TO SEE IF THIS IS ALLOWED. MAKE SURE /NO ONE ELSE HAS THIS FILE OPEN. JMP TO ERROR EXIT ON EITHER OF THESE CON- /DITIONS. IF ALL IS OKAY. RETURN WITH PTR TO UFD NAME BLOCK ENTRY EXT1, 0 JMS I IFN01 /MASK OFF BITS 0-9 OF FIOSTK+1 TAD FIOSTK+1 /INTERNAL FILE NUMBER JMS I LNK01 /GET PTR TO APPROPRIATE FILE CONTROL BLOCK SNA JMP EXT10+1 /ERROR, FILE NOT OPEN DCA EXFCBP /FILE CONTROL BLOCK POINTER JMS I ACC01 /AS HE UNDER ACCOUNT1? JMP EXT2 /YES; SKIP PROTECTION CHECK TAD FILPRP /GLOBAL TO "FILPRO" TAD EXFCBP DCA EXPROP /POINTER TO PROTECTION BIT DATFLD /CDF FIELD 1 TAD I EXPROP /PICK UP PROTECTION BIT CFLD /CHANGE TO CURRENT FIELD AND P0004 /STRAIN OFF ANY EXTRANEOUS BITS SZA CLA JMP EXT10 /WRITE PROTECTED EXT2, TAD FIOSTK+1 /INTERNAL FILE NUMBER JMS I GD01 /GET DIRECTORY ENTRY INTO CORE DCA REL6 /POINTS TO WHERE UFD NAME BLOCK IS IN CORE JMS I ENR01 /IS THIS THE ONLY USER WHO HAS THIS FILE OPEN? JMP EXT30 /NO, SO ABORT AND RETURN ERROR CODE TAD FIOSTK+2 /ARE ANY SEGMENTS INVOLVED? SNA JMP I FIEXIT /NO, NOTHING TO DO THEN CIA DCA EXSEGC /SAVE NEGATIVE COUNT DATFLD TAD I EXFCBP /GET POINTER TO CURRENT WINDOW DCA EXPROP IAC DCA I EXPROP /INVALIDATE THE WINDOW CFLD TAD REL6 JMP I EXT1 /ROUTINE TO REDUCE A FILE *1600 RED0, JMS I EXT11 /MAKE SURE IT'S OKAY TO REDUCE THIS FILE DCA REBUFP /...IF OKAY, RETURNS WITH PTR TO FILE NAME BLOCK JMS I ACC01 /IS HE UNDER ACCOUNT 1? JMS I REDUFD /SEE IF HE'S REDUCING A UFD TAD REBUFP TAD C0005 DCA RELINK /NOW POINTS TO NUMBER OF SEGMENTS PRESENTLY IN FILE TAD FIOSTK+2 /SEGMENTS TO BE REMOVED SPA /IS IT NEGATIVE? JMP RED5 /YES; DELETE THE ENTIRE FILE CIA TAD I RELINK SMA SZA /DELETE THE FILE? JMP RED6 /NO, REDUCE IT RED5, CLA CLL /YES, WIPE IT OUT AND CLOSE TAD REBUFP JMS RED1 /WIPE OUT THE FILE NAME BLOCK FROM THE UFD TAD FIOSTK+1 /INTERNAL FILE NUMBER JMS I CL01 /CLOSE THIS FILE SINCE IT NO LONGER EXISTS JMP I FIEXIT RED6, DCA I RELINK /UPDATE SEGMENT COUNT DCA BUFMOD /SCHEDULE WRITE TAD I RELINK DCA CFH ISZ RELINK ISZ RELINK TAD I RELINK DCA RELINK /POINTER TO FIRST WINDOW ON CHAIN TAD CFH JMS RED40 /WIPE OUT REST OF FILE JMP I FIEXIT REDGD1, GD1 RED40, 0 JMS I WND201 /DIVIDE BY 7 CMA DCA REWNDC /NUMBER OF WHOLE WINDOWS WHICH ARE TO REMAIN TAD RELINK /GET POINTER TO FIRST RETRIEVAL WINDOW JMS I RED302 /ROUTINE TO DO ACTUAL REDUCTION JMP I RED40 EXT11, EXT1 LINK01, LINK0 RED302, RED30 REDUFD, REDUF0 REBUFP, 0 /ROUTINE TO DELETE A FILE UFBUFP, RED1, 0 DCA REBUFP /PTR TO THE UFD ENTRY FOR THE FILE TAD REBUFP TAD P0003 DCA RELINK /LINK TO NEXT FILE NAME IN THIS UFD TAD I RELINK DCA RED3 TAD I REDGD1 /UFD ADDR OF THIS DIRECTORY ENTRY DCA RED4 TAD REBUFP TAD P0007 DCA RELINK /NOW POINTS TO A RETRIEVAL BLOCK FOR THIS FILE TAD I RELINK DCA RELINK RED2, DCA I REBUFP /CLEAR OUT FIRST WORD OF ENTRY ISZ REBUFP TAD REBUFP AND P0007 SZA CLA /END OF CURRENT WINDOW? JMP RED2 /NO, KEEP CLEARING DCA BUFMOD /SCHEDULE WRITE JMS I LINK01 RED4, 0 /UFD ADDR OF THIS DIRECTORY ENTRY RED3, 0 /UFD ADDR OF DIRECTORY ENTRY WHICH IS NEXT IN THE CHAIN JMS RED40 /GO WIPE OUT ACTUAL FILE JMP I RED1 /ROUTINE TO EXTEND A UFD /CALLING SEQUENCE: / TAD (RETRIEVAL POINTER) / JMS UFD0 / ERROR RETURN / NORMAL RETURN UFD0, 0 DCA UFRETP /RETRIEVAL POINTER TAD C7771 DCA CFH /COUNTER FOR OVERSIZE UFD /NOW SCAN DOWN THE UFD'S FILE RETRIEVAL BLOCK UFD2, TAD I UFRETP SNA CLA JMP UFD1 /FOUND THE END OF THE LIST OF SEGMENT NUMBERS ISZ UFRETP /POINT TO NEXT SEGMENT NUMBER ISZ CFH /UFD ALREADY MAXIMUM SIZE? JMP UFD2 /NO, LOOK AT NEXT WORD JMP I UFD0 /YES, ERROR RETURN /COMES HERE WHEN IT HAS FOUND THE END OF THE RETRIEVAL BLOCK'S LIST OF SEGMENTS UFD1, JMS I SATL1 /GET A FREE SEGMENT FROM SAT SNA JMP I UFD0 /NO MORE FREE SEGMENTS DCA I UFRETP /ADD TO RETRIEVAL INFORMATION TAD UFRETP JMS I ENS31 /CONVERT ABS RETTBL PTR TO A RELATIVE ENTRY NUMBER CLL RTL /...TIMES FOUR TAD UFDTBL /...PLUS BASE ADDR OF UFDTBL DCA CFH /POINTER TO PROJ,PROG NUMBER OF FILE OWNER TAD I CFH /PICK UP PROJ,PROG NUMBER JMS I UFO61 /GO GET THE RETRIEVAL INFO FOR THIS GUY'S UFD INTO CORE JMP I DIRBAD /*************DEBUG ONLY*********** DCA UFBUFP /PTR TO RETRIEVAL INFORMATION ISZ UFBUFP TAD I UFBUFP SZA CLA /SCAN TO END OF LIST OF SEGMENT NUMBERS JMP .-3 TAD I UFRETP /GET NUMBER OF NEW SEGMENT DCA I UFBUFP /PUT IT IN RETRIEVAL BLOCK LIST DCA BUFMOD /SCHEDULE WRITE STA DCA TABSTA /SET TABLE STATUS TO CHANGE TAD I UFRETP /NEW SEGMENT NUMBER JMS SCL0 /ZERO OUT THE NEW SEGMENT ISZ UFD0 /SET UP NORMAL RETURN JMP I UFD0 ENS31, ENS3 UFO61, UFO6 /ROUTINE TO ZERO OUT A DISC SEGMENT /IT ZEROES THE CORE BUFFER THEN EXECUTES A CALL /TO RD301 (THE ACTUAL READ NEVER HAPPENS). /THUS, THE SYSTEM THINKS THAT THE SEGMENT BEING /CLEARED IS ACTUALLY IN CORE. IT WILL BE WRITTEN OUT LATER. SCL0, 0 DCA UFRETP /SEGMENT NUMBER JMS I WRT1 /MAKE SURE THE BUFFER IS EMPTY TAD P7400 DCA CFH /SET UP COUNTER FOR CLEARING SEGMENT TAD BUFFER DCA UFBUFP UFD3, DCA I UFBUFP /START TO CLEAR BUFFER AREA ISZ UFBUFP ISZ CFH JMP UFD3 STA TAD UFRETP /SEGMENT NUMBER JMS I SCL11 /NOW FAKE A READ DCA BUFMOD /SCHEDULE WRITE JMP I SCL0 RELINK, UFRETP, 0 SCL11, SCL1 P7400, 7400 /ROUTINE TO PROVIDE FILE INFORMATION *2000 INF0, JMS I IFN01 /GET INTERNAL FILE NUMBER IN FIOSTK+1 TAD FIOSTK+1 /INTERNAL FILE NUMBER JMS I EBLD0 DCA CFH /RELATIVE POINTER TO UFD RETRIEVAL INFORMATION TAD I CFH /GET PTR TO RETTBL OUT OF ENTTBL SNA /DOES IT EXIST? JMP INF1 /NO, SO FILE IS NOT OPEN CIA CLL CMA RTL /SUBTRACT ONE; MULTIPLY BY FOUR TAD UFDTBL DCA INUFDP /POINTER TO USER PROJ,PROG NUMBER TAD I INUFDP DCA FIOSTK+2 /SET UP LINKAGE FOR GD0 TAD FIOSTK+1 /INTERNAL FILE NUMBER JMS I GD01 /GET DIRECTORY ENTRY FOR THIS FILE INTO CORE CIA CMA DCA INDEX /SET UP INDEX REGISTER FOR TRANSFER TAD I INDEX /OF NAME AND OTHER DIRECTORY INFORMATION DCA FIOSTK+3 TAD I INDEX DCA FIOSTK+4 TAD I INDEX DCA FIOSTK+5 ISZ INDEX TAD I INDEX DCA FIOSTK+6 TAD I INDEX DCA FIOSTK+7 INF5, DATFLD TAD I FIOPTR /PICK UP JOBLNK WORD FROM JOB STATUS BLOCK DCA INF4 /DESTINATION IN FIELD 0 CFLD /CHANGE TO PRESENT FIELD 6202 /CIF FIELD 0 BLT /MOVE FIOSTK INFORMATION INTO IOT PARAMETER BLOCK 6221 /SOURCE FIELD FIOSTK /SOURCE DATFLD /DESTINATION FIELD INF4, 0 /DESTINATION -10 /WORD COUNT INF6, CDF TAD I OURFLD AND C0200 SZA CLA JMP I FIEXIT /WE WERE CALLED BY SI - DON'T SET JSIOTC OR WE'LL GAG DATFLD TAD I JOBDAT /GLOBAL TO "JOBDAT" IAC DCA INSPTR /NOW POINTS TO STATUS WORD TAD INIOTC /JSIOTC CMA AND I INSPTR /SET JSIOTC TO INDICATE THAT FIP TAD INIOTC /...IS RETURNING INFORMATION IN THE IOT PAR. BLOCK DCA I INSPTR JMP I FIEXIT /EXIT INF1, DCA FIOSTK+2 JMP INF5 INUFDP, 0 INSPTR, 0 OURFLD, CORTBL+1 INIOTC, 40 /ROUTINE TO SKIP IF CALLING USER IS NOT SYSTEM MANAGER ACT01, 0 JMS I JBLD0 /GET PPN CLL RAR SZA CLA /IS IN ACCOUNT 1? ISZ ACT01 /NO; SKIP ON RETURN JMP I ACT01 /LOGIN ROUTINE LGI0, TAD RETTBL /MFD RETRIEVAL IS IN ENTRY 0 DCA FIOSTK+1 /SET UP PTR TO RETRIEVAL INFORMATION CONTAINED IN RETTBL TAD FIOSTK+2 /ACCOUNT #0 SNA CLA JMP LGI20 /UNAUTHORIZED ACCOUNT JMS I DS01 /SEARCH THE MFD (AC=0 TO INDICATE 3-WORD SEARCH) FIOSTK+1 /ADDR OF PTR TO RETRIEVAL INFORMATION OF DIRECTORY TO BE SEARCHED JMP LGI20 /COULD NOT FIND ENTRY IN MFD DCA LGMFDP /OK TO LOG IN - POINTER TO DIRECTORY ENTRY IS IN ACC. TAD FIOSTK+2 /PROJ,PROG NUMBER JMS I UTS01 /SEARCH THE UFD TABLE SKP /THIS PROJ,PROG NUMBER NOT THERE JMP LGI1 /UFD ALREADY ON TABLE - RETURNS WITH ITS RELATIVE POSITION IN TABLE TAD FIOSTK+2 /PROJ,PROG NUMBER JMS I UFO01 /OPEN THE UFD - I.E. MAKE AN ENTRY IN UFDTBL, RETTBL JMP LGI20 /COULD NOT FIND ROOM ON TABLE LGI1, CLA CMA TAD I UTPRNU DCA I UTPRNU /ACCOUNT FOR NEW ENTRY IN ACCESS COUNT /COMES HERE WHEN THE UFDTBL & RETTBL HAVE BEEN UPDATED /TO INCLUDE THIS LOGIN FGETJT JOBSTS DCA LGI3 /ADDRESS OF STR0 TAD FIOSTK+2 /ACCOUNT NUMBER? AND C7774 /IS IT LESS THAN 4? SNA CLA TAD C0200 /YES - SET ACCOUNT PRIVILEGE BIT DATFLD DCA I LGI3 /AND SAVE IT JMS I JBLD0 CLA TAD FIOSTK+2 /PROJ,PROG NUMBER JMP I .+1 RESET LGI20, CFLD CLA CMA /COULD NOT LOGIN - RETURN WITH 7777 DCA FIUSAC /INDICATE INABILITY TO LOG IN JMP I FIEXIT LGMFDP, 0 LGI3, GTBLOK, 0 / VRS: reconstructed from working TSS-8 DCA LGMFDP CFLD TAD LGMFDP CIF 0 GETBLK JMP I GTBLOK DATFLD TAD I LGMFDP ISZ GTBLOK JMP I GTBLOK REN1, SZA CLA CLL CML RAR CLL CML RAR DCA FIUSAC JMP I 55 WR1, 0 TAD BUFSTA TAD BUFMOD SPA CLA JMS I WR01 JMP I WR1 / VRS: End reconstruction /DIRECTORY SEARCH /CALLING SEQUENCE: / CLA OR CIA (3 OR 1 WORD SEARCH) / JMS DS0 / POINTER-----------------RETRIEVAL STACK POINTER / RETURN IF NOT FOUND NA / GOOD RETURN ME / (POINTER IN AC) XX *2200 DS0, 0 SNA CLA /SKIP IF ONE WORD SEARCH CLL CML RTL /THREE WORD COMPARE CMA DCA DSWDNR /MINUS NUMBER OF WORDS TO COMPARE TAD I DS0 /PICK UP POINTER TO RETRIEVAL INFORMATION DCA DSRETS ISZ DS0 TAD DSM160 /SET UP COUNTER ON # ENTRIES CHECKED DCA DSKCNT TAD I DSRETS /GET RETRIEVAL POINTER CIA TAD RETTBL SNA CLA STA /INHIBIT SEGMENT COUNTING OF THE MFD DCA SEGLIM /ZERO SEGMENT COUNTER DS2, DCA DS1 TAD I DSRETS /GET PTR TO RETRIEVAL INFORMATION BLOCK JMS I GE01 /GET THE ENTRY INTO CORE DS1, 0 /WORD NUMBER -- I.E. THE ADDR WITHIN THE DIRECTORY SNA JMP BADDIR /FOULED-UP DIRECTORY! DCA DSENTP /STORE POINTER TO ENTRY TAD C0005 TAD DSENTP DCA DSCNTR /POINTS TO SEGMENT COUNT TAD SEGLIM /THE TOTAL FOR THIS UFD SPA /IS IT A UFD? JMP DS4 /NO; SEE IF WE SHOULD RESET THE MFD TAD I DSCNTR /ADD THIS FILE'S COUNT DCA SEGLIM /SAVE NEW TOTAL DS3, TAD DSWDNR /NUMBER OF WORDS TO COMPARE DCA DSCNTR TAD DSRETS DCA DSOBJT /POINTER TO OBJECT NAME TAD DSENTP DCA DSENT /POINTER TO NAME IN BUFFER DSCOM2, TAD I DSENT ISZ DSENT CIA ISZ DSOBJT TAD I DSOBJT SZA CLA JMP DSCOM1 /NOT FOUND ISZ DSCNTR JMP DSCOM2 /LOOK AT NEXT WORD OF NAME ISZ DS0 /FOUND THE ENTRY TAD DSENTP /PICK UP POINTER JMP I DS0 /RETURN /THIS ENTRY IS NOT THE ONE WE'RE LOOKING FOR, SO WE MUST /GO LOOK AT THE NEXT ONE. IN THIS ENTRY IS A RELATIVE PTR TO THE NEXT ONE /GET IT. DSCOM1, ISZ DSKCNT /BAD DIRECTORY? JMP DSCOM3 /IT ISN'T BAD AT THIS POINT BADDIR, DCA RESFLG /CLEAR AC AND RESET FLAG TAD P5400 /YES, INDICATE BAD DIRECTORY AND GET OUT DCA FIUSAC /ONCE AGAIN, GOODNESS TRIUMPHS OVER EVIL JMP RETURN /GO CLEAN UP BEFORE ABORTING DSCOM3, TAD P0003 /CREATE POINTER TO NEXT ENTRY TAD DSENTP DCA DSCNTR TAD I DSCNTR SZA /IS THIS THE END OF THE DIRECTORY CHAIN? JMP DS2 /NO, SO CONTINUE SEARCH TAD P0003 TAD DS1 JMP I DS0 DS4, TAD RESFLG /SHOULD WE RESET? SZA CLA JMP DS3 /NO DCA I DSCNTR /CLEAR CPU TIME ACCUMULATOR ISZ DSCNTR DCA I DSCNTR /CLEAR DEVICE TIME ACCUMULATOR DCA BUFMOD /REMEMBER TO WRITE IT BACK JMP DS3 DSWDNR, 0 ENRETP, DSRETS, 0 ENADDR, DSENTP, 0 DSOBJT, 0 DSENT, 0 DSM160, -161 /-MAXIMUM # FILES USER CAN OWN (+2) /RETURN A BLOCK OF FREE CORE RESFLG, RETBKS, 0 CFLD CIF RETBLK JMP I RETBKS /RETURN A LINKED LIST OF FREE BLOCKS ENTPTR, DSKCNT, RETBLS, 0 SNA JMP I RETBLS JMS RETBKS JMP .-3 /SEARCH ENTTBL FOR OPENINGS TO FILE /CALLING SEQUENCE: / TAD (RETRIEVAL POINTER) / JMS ENS0 / UFD ADDRESS OF DIRECTORY ENTRY / RETURN - FOUND AN ACCESS / RETURN - FOUND NO ACCESS DSCNTR, ENS0, 0 JMS I ENS30 DCA ENRETP /RELATIVE POINTER TAD I ENS0 /GET FILE DIRECTORY ADDRESS CIA DCA ENADDR ISZ ENS0 /SKIP PAST ARG TAD ENTTBL DCA ENTPTR ENS2, TAD ENRETP CMA TAD I ENTPTR ISZ ENTPTR SZA CLA JMP ENS1 /DIFFERENT UFD ACCESS TAD I ENTPTR /SAME UFD, SAME FILE? TAD ENADDR SZA CLA JMP ENS1 /DIFFERENT FILE TAD FIOSTK /WHICH IOT BROUGHT US HERE? TAD ENSCRF /IF IT'S "CRF" ONE MATCH IS ENOUGH SNA CLA JMP I ENS0 /IT WAS; GET OUT TAD FIOSTK+1 /FOUND A SIMILAR ENTRY JMS I EBLD0 /SEE IF WE FOUND THE ENTRY FOR CMA /THE GUY WHO CAUSED THE CALL TO TAD ENTPTR /ENS0; IF IT IS, IGNORE THIS MATCH SZA CLA JMP I ENS0 /FOUND A SIMILAR ENTRY; DIFFERENT ENTTBL ENTRY ENS1, ISZ ENTPTR TAD ENTPTR CIA TAD ENTEND /END OF ENT TABLE SZA CLA JMP ENS2 /KEEP LOOKING ISZ ENS0 /SKIP ON RETURN JMP I ENS0 ENS30, ENS3 ENSCRF, -CRF /ROUTINE TO LOOK IN THE SAT FOR A FREE SEGMENT /CALLING SEQUENCE: / JMS SATLOK / RETURN (SEGMENT NUMBER IN AC, 0=NONE AVAILABLE) *2400 SATLOK, 0 CLA CMA CLL RAL /7776 DCA SATMSK /MAKE TWO PASSES OF THE TABLE TAD I SATCNT /# OF AVAILABLE DISC SEGMENTS SNA /ARE THERE ANY? JMP I SATLOK /NO, SO FORGET IT CIA CMA DCA I SATCNT /DECREMENT SATCNT DCA SATCT2 CLA CMA DCA SATSTA /SET SAT STATUS TO WRITE OUT /LOOK FOR A WORD IN SAT TABLE WITH A ZERO BIT IN IT SAT1, TAD I SATPNT /GET A WORD FROM SAT TABLE CMA SZA CLA /ARE ALL BITS SET TO ONE? JMP SAT2 /NO, SO WE'VE FOUND A SEGMENT ISZ SATPNT /WAS THIS THE LAST WORD IN THE SAT TABLE? JMP SAT1 /NO, SO KEEP LOOKING TAD SAT5 /START LOOKING FROM THE BEGINNING DCA SATPNT /PTR INTO SAT TABLE ISZ SATMSK JMP SAT1 /MAKE 1 MORE PASS DCA I SATCNT /SOMETHING WRONG.. BETTER AVOID L2Q OVERFLOW /BY SAYING NO SEGMENTS AVAILABLE JMP I SATLOK SAT5, -SATSIZ+2 /WE FOUND A SAT WORD WITH A ZERO BIT. NOW FIND THAT BIT. SAT2, CLL CML RAR /4000 INTO ACC. DCA SATMSK ISZ SATCT2 TAD I SATPNT /GET WORD FROM SAT TABLE AND SATMSK /IS THE BIT CORRESPONDING TO THE ONE IN SATMSK SET? SNA JMP SAT3 /NO, SO WE FOUND THE ZERO BIT RAR /MOVE MASK BIT ONE TO THE RIGHT JMP SAT2+1 /...AND LOOK AT THE NEXT BIT /FOUND THE BIT WITHIN THE WORD - SATCNT INDICATES WHICH ONE IT IS SAT3, TAD SATMSK TAD I SATPNT DCA I SATPNT /SET THE BIT IN SATTBL TO INDICATE THAT THIS SEGMENT IS NOW ALLOCATED TAD SATPNT TAD C0526 DCA SATMSK /NOW CALCULATE THE NUMBER OF THE DISC SEGMENT /WHICH CORRESPONDS TO THIS BIT IN THE SAT TABLE TAD SATMSK CLL RAL TAD SATMSK RTL TAD SATCT2 JMP I SATLOK /EXIT WITH DISC SEGMENT NUMBER IN AC SATPNT, -SATSIZ+2 SATCNT, -SATSIZ+1 SATEMP, SATCT2, 0 SATMSK, 0 /ROUTINE TO RELEASE A SEGMENT IN SAT /CALLING SEQUENCE: / TAD (SEGMENT NUMBER) / JMS SATREL /DIVIDE SEGMENT NUMBER BY 14 (12 DECIMAL) /QUOTIENT INDICATES WHICH WORD IN SAT TABLE CORRESPONDS /TO THIS DISC SEGMENT. REMAINDER INDICATES WHICH BIT IN /THAT WORD. SATREL, 0 TAD P2000 /SUBTRACT 14 X 400 SZL /WAS THE SEGMENT THAT BIG? JMP .+3 /YES TAD P6000 /NO, ADD 14 X 400 CLL /UN-DO THE LINK RAL /SHIFT OUT A BIT OF THE QUOTIENT ISZ CFH JMP SATREL+1 /MORE TO DO YET DCA SATPNT /REMAINDER IN LINK THRU AC2; QUOTIENT IN AC3 THRU AC11 TAD SATPNT AND P7000 RTL RTL CMA /NEGATE THE REMAINDER DCA SATEMP TAD SATPNT AND P0777 /JUST THE QUOTIENT THIS TIME TAD SAT5 DCA SATPNT CLL CMA RAR ISZ SATEMP /SET UP A MASK CORRESPONDING TO PROPER BIT JMP .-2 AND I SATPNT /CLEAR SAT TABLE BIT; SEGMENT IS NOW AVAILABLE DCA I SATPNT ISZ I SATCNT /UPDATE THE AVAILABLE SEGMENTS COUNT CLL STA DCA SATSTA /REMEMBER WE CHANGED THE SAT TABLE JMP I SATREL /ACTUAL I/O ROUTINE /SET UP ALL I/O PARAMETERS IN #FLPARB#, AND JMS FIPIO FIPIO, 0 TAD FIPFLD RAR DCA FLPARB+2 /='S FIELD WE'RE IN TIMES 4 CDF TAD I JOB AND C0400 /FIP OR SI CORTBL BIT ON? SNA CLA JMP .+3 /SI TAD FIJOB DCA I FIPJOB /FIP - KEEP HIGH PRIORITY ON THE SCHEDULER TAD FIRETP /POINTER TO FIORET DCA 1 /RETURN ADDRESS - SET TO RETURN BELOW WHEN FIP IS RESTARTED TAD FIO3 /GET FIPBLK DATFLD DCA I FIUTBA CFLD CIF 00 BLT /MOVE DISC TRANSFER PARAMETERS INTO FREE BLOCK LINKED TO DSUTBL CFLD /FIP ALWAYS IN FIELD 2 FLPARB /PARAMETER BLOCK DATFLD /DESTINATION FIELD FIO3, FIPBLK /DESTINATION -10 /WORD COUNT CDF CIF 00 ISZ I DSBUSY /GLOBAL TO "DSBUSY" WAIT /DISK BUSY JMP I OVER /GO TO FIELD 0 TO INITIATE THE TRANSFER /MONITOR RETURNS CONTROL HERE AFTER COMPLETING THE TRANSFER FIORET, CLA /RETURNS FROM DISC I/O COME HERE TAD C0200 /RESET THE FIP STARTING ADDRESS DCA 1 /... TO 0200 FGETJT JOBSTS DATFLD DCA FIPTR1 TAD I FIPTR1 /PICK UP #JOBSTS# CFLD /CHANGE TO CURRENT FIELD TAD P0003 AND P0007 /CHECK ERROR BITS SZA CLA ISZ FIPIO /NO DISC TRANSFER ERROR JMP I FIPIO /EXIT WITHOUT SKIPPING TO INDICATE DISC TRANSFER ERROR FIPTR1, 0 FIUTBA, DSUTBL+4+4 FIRETP, FIORET C0526, 0526 OVER, OVRLA1 /ROUTINE TO GET A DIRECTORY WORD INTO CORE /CALLING SEQUENCE: / TAD (POINTER TO RETRIEVAL INFORMATION) / JMS GE0 / WORD NUMBER / RETURN (BUFFER POINTER IN AC. 0 IF NON-EXISTENT) *2600 GE0, 0 DCA GERETP /STORE RETRIEVAL INFORMATION POINTER TAD I GE0 CLL RAL RTL RTL AND P0007 TAD GERETP DCA GERETP TAD I GERETP SNA JMP GE3 CIA CMA DCA RDTEMP /FILE READ ROUTINE, CHECKS TO SEE IF BUFFER IS FULL. /IF SO, IS IT THE SEGMENT WE ARE TRYING TO READ? /IF YES, LEAVE. IF NO, WRITE OUT THE BUFFER /BEFORE READING THE PROPER SEGMENT. TAD RDCURR /MAY THE DESIRED SEGMENT ALREADY BE IN THE BUFFER CIA TAD RDTEMP SNA CLA TAD BUFSTA /PROBABLY; IS THE DATA STILL VALID? SPA JMP RD3 /YES SNA /MAYBE JMS I WRT1 /WRONG SEGMENT, SO WRITE IT OUT (IF MODIFIED) DCA BUFSTA /SAVE BUFFER STATUS TAD RDTEMP JMS RD30 /SET UP PARAMETERS FOR A READ OPERATION TAD BUFSTA /WAS THE CORRECT DATA IN THE BUFFER AFTER ALL? SZA CLA JMP RD3 /YES; ONLY NEEDED TO SET THE DISK PARAMETERS JMS I FIO01 /PERFORM THE READ JMP I DIRBAD /ERROR ON READ IAC DCA BUFMOD /NEW DATA AS YET UNCHANGED RD3, CLA CMA DCA BUFSTA /SET BUFFER STATUS TO FULL TAD C0377 AND I GE0 /ADDRESS WITHIN SEGMENT TAD BUFFER /CREATE A POINTER GE3, ISZ GE0 JMP I GE0 /RETURN GERETP, 0 RDTEMP, 0 RDCURR, 0 K7400, 7400 C0377, 0377 /ROUTINE TO DIVIDE A NUMBER BY 7 /REMAINDER IS LEFT IN WNDREM, PAGE 0 WND20, 0 DCA WNDREM DCA CFH TAD WNDREM WND24, TAD C7771 SPA JMP WND21 ISZ CFH JMP WND24 WND21, TAD P0007 DCA WNDREM TAD CFH JMP I WND20 /ROUTINE TO SET UP FOR A READ. /ENTER WITH SEGMENT NUMBER. THIS IS CONVERTED TO /A PHYSICAL DISC ADDRESS. RD30, 0 DCA RDCURR /SAVE SEGMENT NUMBER TAD RDCURR CLL RTR RTR DCA RDTEMP TAD RDTEMP RAR AND K7400 DCA FLPARB+5 TAD RDTEMP AND C0377 TAD FIBASE CLL RTL DCA FLPARB+1 CFLD /CHANGE TO CURRENT FIELD TAD K7400 DCA FLPARB+3 /WORD COUNT (ONE BUFFER) CLA CMA TAD BUFFER DCA FLPARB+4 /CORE ADDRESS TAD C0603 /READ IOT DCA FLPARB JMP I RD30 FIPFIP= C0400 FIX301, FIX30 C5600, 5600 USENAM, 0 /CALLED ONLY ONCE BY RE-NAME ROUTINE TAD FIOSTK+1 /TO SEE IF THE NEW NAME EXISTS IN DIRECTORY DCA FIOSTK JMS I JBLD0 JMS I UTS01 JMP I DIRBAD JMS I BLDP1 DCA FIOSTK+1 JMS I DS01 FIOSTK+1 ISZ USENAM /NO FILE OF THIS NAME FOUND - OK TO RENAME CLA JMP I USENAM NUCOR, CORSRC-2 C7437, SWAP LOCK NOTRUN FIP CJOB JOBMX, -JOBMAX FIPLOC, FIPLOK FIPTIM, TIMFIP REL1, TAD FIOSTK+1 /RELEASE A DEVICE SPA /DON'T LET THE USER RELEASE CONSOLES JMS I REL01 CLA JMP I FIEXIT FIX50, TAD I FIOPTR AND FIPFIP /GLOBAL TO "FIP" SNA CLA /IF FIP BIT IS NOT SET, FIP WAS CALLED BY SI JMP I FIX301 /GET THE SYSTEM INTERPRETER BACK INTO CORE TAD C5600 AND I FIOPTR DCA I FIOPTR /CLEAR OUT THE LOCK BIT TAD JOBMX DCA CFH /SAVE COUNT OF JOBS TO SCAN STL RTL TAD I NUCOR SMA JMP FIX51 DCA I FIPTIM TAD C7437 DCA I FIPLOC FIX51, CLA DATFLD TAD FIJOB TAD DEVOVR DCA INDEX FIX50L, TAD INDEX TAD JEND SZA CLA JMP .+3 TAD DEVOVR DCA INDEX TAD I INDEX SZA JMS I FIX5CK ISZ CFH JMP FIX50L JMP I .+1 FIXOUT JEND, -JOBTBL-JOBMAX FIX5CK, FIXSCH /ROUTINE TO FREE AN ENTRY ON THE UFD TABLE AND RETTBL /CALLING SEQUENCE: / TAD (POSITION ON UFDTBL) / JMS TF0 / RETURN TF0, 0 DCA TFUFDP /POSITION ON TABLE DCA I TFUFDP /CLEAR OWNER'S PROJ,PROG NUMBER TAD UFDTBL /BEGINNING OF TABLE CIA TAD TFUFDP CLL RTR /RELATIVE POSITION ON TABLE IAC JMS I BLDP1 /BUILD A PTR TO RETTBL DCA TFUFDP /POINTER TO RETRIEVAL INFORMATION TAD P7770 /8 WORDS PER ENTRY DCA TFCNTR TF1, DCA I TFUFDP /ZERO OUT THE ENTRY ISZ TFUFDP ISZ TFCNTR JMP TF1 JMP I TF0 TFUFDP, 0 TFCNTR, 0 /ROUTINE TO CHECK WHETHER THE FILE A USER /IS ATTEMPTING TO ACCESS IS HIS/HERS OR SOMEONE ELSE'S. /CALLING SEQUENCE: / TAD (INTERNAL FILE NUMBER) / JMS UC0 / ERROR RETURN (AC=0 IF FILE NOT OPEN) / NORMAL RETURN UC0, 0 JMS I EBLD0 DCA UCENTP TAD I UCENTP /PICK UP ENTRY FOR THIS FILE OF THIS USER'S SNA JMP I UC0 /FILE NOT OPEN CIA CLL CMA RTL /SUBTRACT ONE; MULTIPLY BY FOUR TAD UFDTBL DCA UCUFDP /POINTER TO OPEN UFD TABLE JMS I JBLD0 CIA TAD I UCUFDP SNA /SKIP IF DIFFERENT ISZ UC0 /CORRECT RETURN JMP I UC0 UCENTP, 0 UCUFDP, 0 /LOGOUT ROUTINE LGO0, JMS I ACC01 /IS IT FROM ACCOUNT 1? TAD FIOSTK+1 /YES; SEE IF HE WANTS TO RESET TAD FIJOB /SEE IF HIS/HER AC=JOB SNA CLA JMP I LGRESA /GO CLEAR EVERYBODY'S CPU & DEVICE TIME ACCUMULATORS TAD FIOSTK+1 /DID HE SET HIS/HER AC= TO HIS/HER JOB #? CIA TAD FIJOB SZA CLA JMP I LGO1A /NO; SO SEE IF HE WANTS COUNT OF USERS UNDER HIS/HER ACCOUNT JMS I LNS01 /RELEASE ALL HIS/HER DEVICES JMP .+3 JMS I REL01 JMP .-3 /KEEP GOING JMS I CL01 /CLOSE FILE 0 IAC JMS I CL01 /CLOSE FILE 1 CLL CML RTL JMS I CL01 /CLOSE FILE 2 TAD P0003 JMS I CL01 /CLOSE FILE 3 JMS I JBLD0 DCA LOSRRI+1 /DELIVER TO CALLING SEQUENCE FOR SEARCH TAD CFH DCA LOJOBP CLA CMA JMS I DS01 /FIND MFD ENTRY; 1 WORD SEARCH LOSRRI JMP I DIRBAD /************DEBUG ONLY*********** TAD C0006 DCA LOSRRI+1 /POINTER TO CP TIME COUNTER FGETJT JOBRTM /JOB RUN TIME IN STATUS DCA FIOSTK+6 /INTS TO LOW ORDER RUN TIME DATFLD TAD I FIOSTK+6 RTR RTR RTR /USE ONLY HIGH ORDER OF LOW ORDER RUN TIME AND P0077 DCA FIOSTK+7 ISZ FIOSTK+6 TAD I FIOSTK+6 CFLD /BACK TO THIS FIELD AND P0077 CLL RTL RTL RTL TAD FIOSTK+7 TAD I LOSRRI+1 DCA I LOSRRI+1 /LOW ORDER TIME UPDATE DCA BUFMOD /SCHEDULE WRITE TAD I LOJOBP /PICK UP PROJ,PROG NUMBER JMS I UTS01 /SEARCH UFD TABLE JMP LGO2 /OOPS!! MIGHT AS WELL TRY TO LEAVE GRACEFULLY ISZ I UTPRNU /REMOVE THIS JOB FROM ACCESS COUNT JMP LGO2 CLA CMA /LAST USER ACCESSING THIS UFD TAD UTPRNU JMS I TF01 /FREE THE UFD TABLE ENTRY LGO2, CLA DCA I LOJOBP /REMOVE USER FROM JOB TABLE TAD LGO4A /KLUDGE FIEXIT TO RETURN TO LGO4 DCA I LGKLUJ TABOUT, CLA CMA DCA TABSTA /FORCE TABLES OUT JMP I FIEXIT LOJOBP, 0 LOSRRI, RTABLE 0 LGO4A, LGO4 LGO1A, LGO1 LGKLUJ, FIX500 LGRESA, LGRES0 /ROUTINE TO OPEN A UFD /CALLING SEQUENCE: / TAD (PROJ,PROG NUMBER) / JMS UFO0 / ERROR RETURN (AC=0 IF TABLES FULL; OTHERWISE UFD NOT FOUND) / NORMAL RETURN (POSITION ON TABLE IN AC) *3200 UFO0, 0 JMS UFO6 /GO GET THE RETR. INFO FOR THIS GUY'S UFD INTO CORE JMP I UFO0 /COULDN'T GET IT DCA UOBUFP /POINTER TO RETRIEVAL INFORMATION TAD UFDTBL IAC DCA UOUFDP /UFD TABLE POINTER /SEARCH FOR A FREE SLOT IN UFDTBL UFO3, TAD I UOUFDP SNA CLA JMP UFO2 /FOUND A FREE SLOT ON THE TABLE TAD UOUFDP /THIS SLOT IS OCCUPIED TAD P0004 DCA UOUFDP /NEXT POSITION (ACCES COUNT ENTRY) TAD UFDEND /ARE WE AT THE END OF THE TABLE CMA TAD UOUFDP SNA CLA /HAVE WE SEARCHED THE WHOLE TABLE? JMP I UFO0 /NO ROOM ON TABLE JMP UFO3 /LOOK AT NEXT SLOT /COMES HERE WITH UOUFDP POINTING TO A FREE SLOT IN UFDTBL UFO2, CLL STA RAL /AC=-2 TAD UOUFDP /BACK UP THE POINTER DCA INDEX TAD UFORET+1 JMS I UFQUOA /LOAD THE UFD TABLE STA TAD UFDTBL CIA TAD INDEX CLL RTR DCA UFO6 /RELATIVE POSITION ON TABLE TAD UFO6 JMS I BLDP1 /GENERATE A PTR INTO RETTBL DCA UFORET /RETRIEVAL POINTER TAD C7771 DCA CFH /COUNTER FOR TRANSFER TO TABLE /NOW MOVE RETRIEVAL INFORMATION FOR THIS GUY'S /UFD INTO RETTBL UFO4, ISZ UOBUFP TAD I UOBUFP DCA I UFORET ISZ UFORET ISZ CFH /ENTIRE RETRIEVAL BLOCK TRANSFERRED? JMP UFO4 /NO, KEEP IT UP ISZ UFO0 /YES, PREPARE FOR NORMAL RETURN TAD UFO6 /PICK UP RELATIVE POSITION JMP I UFO0 UFORET, 0 0 UFQUOA, UFQUOT UOUFDP= UTPRNU UOBUFP, 0 UFO6, 0 DCA UFORET+1 /SET UP CALLING SEQUENCE FOR MFD SEARCH TAD RETTBL DCA UFORET CMA JMS I DS01 /ONE WORD MASTER FILE DIRECTORY SEARCH FOR PROJ,PROG MATCH UFORET JMP I UFO6 /COULD NOT FIND UFD ENTRY TAD P0004 /POINT AT DISK QUOTA WORD DCA UFORET TAD I UFORET AND P0077 /SAVE ONLY LOGIN QUOTA DCA SEGLIM /SAVE FOR LATER TAD P0003 TAD UFORET DCA UFORET /POINTER TO UFD RETRIEVAL INFORMATION TAD I UFORET DCA UFO1 TAD RETTBL /POINTER TO RET. INFO OF FILE BEING SEARCHED (IN THIS CASE, THE MFD) JMS I GE01 /GET RETRIEVAL INFORMATION INTO CORE UFO1, 0 ISZ UFO6 JMP I UFO6 /ROUTINE TO SEARCH UFD TABLE FOR PROJ,PROG NUMBER /CALLING SEQUENCE: / TAD (PROJ,PROG NUMBER) / JMS UTS0 / NOT FOUND RETURN / NORMAL RETURN (RETRIEVAL POSITION IN AC) UTS0, 0 DCA UTPR1 /PROJ,PROG NUMBER TAD UFDTBL /PTR TO HEAD OF UFDTBL DCA UTUPTR UTS1, TAD UFDEND /END OF UFD TABLE CIA TAD UTUPTR SNA CLA JMP I UTS0 /COULD NOT FIND PROJ,PROG NUMBER ON TABLE TAD I UTUPTR CIA TAD UTPR1 SNA CLA JMP UTS3 /FOUND ENTRY, GET POINTER TAD UTUPTR /STEP UP ONE SLOT TAD P0004 DCA UTUPTR JMP UTS1 /LOOK IN THE NEXT ENTRY UTS3, TAD UFDTBL CIA TAD UTUPTR CLL RTR /RELATIVE POSITION ON TABLE IAC /THE RELATIVE POSITION ISZ UTPRNU /UTPRNU POINTS TO ACCESS COUNT OF THIS PROJ, PROG # ISZ UTS0 JMP I UTS0 DVT1, UTPR1, 0 UTUPTR= UTPRNU DVT0, 0 /COMPUTE DEVICE TIME AT RELEASE DCA DVT1 /ELAPSED DEVICE TIME JMS I JBLD0 DCA DVT3 /PROJ,PROG NUMBER OF CURRENT USER CLA CMA JMS I DS01 /SEARCH MFD FOR PROJ,PROG NUMBER DVT4 JMP I DIRBAD /***********DEBUG ONLY*********** TAD C0005 DCA CFH /POINTER TO DEVICE TIME WORD TAD DVT1 TAD I CFH /UPDATE USER'S CUMULATIVE DEVICE TIME DCA I CFH DCA BUFMOD /SCHEDULE WRITE DATFLD JMP I DVT0 DVT4, RTABLE DVT3, 0 /COMES HERE IF FIP WAS CALLED BY S.I. /READ S.I. BACK IN AND RETURN TO IT FIX30, CFLD /CHANGE TO CURRENT FIELD TAD C0603 DCA FLPARB /SET UP READ IOT DCA FLPARB+1 /SI IS ON TRACK 0 OF THE DISC JMS I FIX401 JMS I FIO01 /RETURN WILL BE TO SI SCL1, 0 JMS I RD301 /SET UP DISK PARAMETERS STA DCA BUFSTA /FUDGE TO APPEAR THAT READ WAS DONE JMP I SCL1 RD301, RD30 /EXIT ROUTINE /COMES HERE WHEN FIP HAS COMPLETED ITS TASK /FIRST, SEE IF ANY INTERNAL FILES HAVE BEEN CHANGED /THOSE THAT HAVE CHANGED MUST BE WRITTEN BACK OUT TO DISC *3400 /*** ANY DATA FIELD IS OK AT THIS POINT!! FIX0, JMS I WRT1 /MAKE SURE THE BUFFER IS EMPTY ISZ TABSTA /CHECK TABLE STATUS JMP FIX1 /NOTHING CHANGED IN TABLES TAD JOBTAB /BOTTOM OF TABLE AREA JMP FIX2 /SAVE TABLES BEFORE EXIT FIX1, ISZ SATSTA /CHECK SAT STATUS JMP FIX20 /NOTHING TO BE SAVED, EXIT TAD SATBOT /BOTTOM OF SAT FIX2, JMS I FIX401 TAD FIDEXP /GLOBAL TI "FIPDEX" DCA FLPARB+1 /MEMORY FIELD TAD C0605 DCA FLPARB /WRITE IOT JMS I FIO01 /PERFORM THE WRITE HLT /ERROR ON WRITE, FATAL /ALL DISC TABLES ARE NOW UP TO DATE (*** ANY DATA FIELD IS OK AT THIS POINT!!) FIX20, FGETJT JOBSTS DCA FIOPTR DATFLD TAD I FIOPTR AND FISIOT DCA I FIOPTR CFLD FGETJT /RESTORE USER AC JOBREG+2 DCA FIOPTR /ADDRESS OF USER'S AC TAD FIUSAC DATFLD DCA I FIOPTR CDF TAD C002 /FIP ALWAYS RUNS IN FIELD 2 SO ADD 2 TO CORTBL TAD CORTBA /GLOBAL TO "CORTBL" DCA FIOPTR /POINTS TO THIS FIELD'S ENTRY IN CORTBL JMP I .+1 FIX500, FIX50 FISIOT, -JSIOT-1 /ROUTINE TO DETERMINE IF A DEVICE IS ASSIGNED TO THIS JOB /CALLING SEQUENCE: / TAD (DEVICE NUMBER) / JMS DTE0 / 0 (SET BY DTE0 TO POINT TO ENTRY IN DEVTBL) / RETURN (DEVICE NOT ASSIGNED TO THIS JOB) / RETURN (DEVICE ASSIGNED) DTE0, 0 SPA JMP DTE10 /NON-TTY DEVICE TAD NULNM1 /CHECK FOR VALID TTY NUMBER SMA JMP DTE6 /INVALID TTY NUMBER CLL RAL /TWO WORDS PER TTY DTE4, TAD DEVEND /FIND LOCATION IN DEVTBL DTE5, CFLD DCA I DTE0 /RETURN ARGUMENT TAD I DTE0 ISZ DTE0 DCA DTE2 DATFLD TAD I DTE2 /GET POINTER TO DDB SNA /IS THERE ONE? JMP I DTE0 /NO, RETURN DCA DTE2 /YES ISZ DTE2 TAD I DTE2 /GET JOB NUMBER CIA TAD FIJOB /NUMBER OF CURRENT JOB AND P0037 SNA CLA /DOES DEVICE BELONG TO THIS JOB? ISZ DTE0 /YES JMP I DTE0 /RETURN DTE6, STA TAD DEVTBA /POINT TO DUMMY DEVTBL ENTRY JMP DTE5 DTE2, 0 NULNM1, -NULINE-1 P3777, 3777 NUDEVM, DEVTBE-JOBTBL NUDEV, JOBTBL-DEVTBE DTE10, AND P3777 TAD NUDEVM /CHECK DEVICE NUMBER FOR VALIDITY SMA JMP DTE6 /INVALID DEVICE NUMBER TAD NUDEV /GET DEVICE NUMBER BACK JMP DTE4 /GO FINISH UP LNK0, 0 /GET FILE LINKAGE TAD LNKF DCA LNK1 FGETJT LNK1, 0 DCA CFH DATFLD TAD I CFH /PTR TO FILE CONTROL BLOCK JMP I LNK0 LNKF, JOBF0 SAV1, FGETJ0, 0 CFLD TAD I FGETJ0 DCA .+4 TAD JOBDAT CIF GETJTA 0 ISZ FGETJ0 JMP I FGETJ0 SAVCRE, 0 DCA SAV1 TAD SAV1 /FILE ADDR TAD P0004 /PTR TO PROTECTION BITS IN FILE DCA SAV2 TAD I SAV2 /GET THE PROTECTION BITS AND C0020 /IS IT WRITE PROTECTED AGAINST THE OWNER? SZA CLA JMP I EXT10A /YES, RETURN WITH PROT. VIOLATION MESSAGE TAD SAV1 /NO, REDUCE THE FILE TO 0 SEGS JMS I RED11 /GO DO REDUCTION JMP I SAVCRE /RETURN RED11, RED1 EXT10A, EXT10 SAV2, CRFUFD, 0 JMS I ACC01 /IS THIS ACCOUNT 1? JMP CRFUF1 /YES IAC DCA I INDEX /FILE SIZE INITIALLY 1 JMP I CRFUFD /BACK FOR THE DATE CRFUF1, DCA I INDEX /ZERO CPU TIME JMP I .+1 /GO ZERO DEVICE TIME ALSO CRFUFR /CONVERT AN ABSOLUTE PTR INTO RETTBL TO A RELATIVE ENTRY NUMBER ENS3, 0 CIA TAD RETTBL /REL. PTR TO ADDRESS WITHIN RETTBL CIA AND P7770 /ANY POINTER WITHIN THE BLOCK IS OK CLL RTR RAR /DIVIDE BY 8 JMP I ENS3 /ROUTINE TO ASSIGN A DEVICE *3600 ASD1, TAD FIOSTK+1 SMA /TTY? JMP I LGI201 /DON'T LET HIM/HER ASSIGN TTY'S! RETURN WITH AC=7777 JMS I DTE01 /IS THIS DEVICE ASSIGNED TO THIS JOB? ASD2, 0 /SET BY DTE01 TO POINT TO PROPER ENTRY IN DEVTBL SKP JMP ASD4 /YES TAD I ASD2 /GET DDB ADDRESS FOR THIS DEVICE SZA /ZERO? JMP ASD11 /NO, SO SOMEONE HAS IT /COMES HERE IF OKAY TO MAKE THIS ASSIGNMENT CFLD /CHANGE TO CURRENT FIELD TAD ASD2 6202 /CIF FIELD 0 GETDDB /GET A BLOCK FROM THE FREE LIST AND LINK IT INTO DEVTBL JMP I LGI201 /NO BLOCK.. REDO IN CASE OF USER OTHERWISE ERROR RETURN FOR SI DATFLD TAD I ASD2 /PICK DDB ADDRESS FROM DEVTBL DCA CFH /SAVE IT TAD FIOSTK+1 AND P0037 /CLEAR BIT 0 DCA I CFH /SET TO REFLECT THE DEVICE NUMBER ISZ CFH TAD FIJOB DCA I CFH /PLUG IN THE JOB NUMBER ASD7, CFLD JMP I FIEXIT /COMES HERE IF ONE JOB ATTEMPTS TO ASSIGN AN ALREADY ASSIGNED DEVICE ASD11, IAC DCA CFH TAD I CFH SNA CMA DCA FIUSAC /DELIVER TO USER'S AC JMP ASD7 /EXIT ASD4, TAD FIOSTK+1 CLL RAL SZA CLA /PTR? JMP ASD7 /NO TAD I ASD2 CIF 00 JMS I ASDCLR /CLEAR THE READER BUFFER JMP ASD7 ASDCLR, SICLR /ROUTINE TO PERFORM ACTUAL REDUCTION /CALLING SEQUENCE: / TAD (NUMBER OF SEGMENTS TO REMAIN) / JMS RED30 / RETRIEVAL CHAIN POINTER / UFD RETRIEVAL POINTER / RETURN /FIRST TRACE THRU THE LINKED LIST OF FILE INFORMATION /RETRIEVAL BBLOCKS UNTIL WE GET TO THE ONE IN WHICH THE /NEW LAST SEGMENT IS RED30, 0 DCA RED31 /LINKAGE TO RETRIEVAL CHAIN TAD GDRETP /PICK UP RETRIEVAL POINTER JMS I GE01 /GET THIS WORD INTO CORE RED31, 0 DCA REBUFF TAD I REBUFF /PICK UP LINK TO NEXT DCA RED31 /SAVE LINK TAD WNDREM /DELETING ENTIRE WINDOW? SNA CLA JMP RED36 /YES, REMOVE LINK TO LAST WINDOW AS WELL RED37, ISZ REWNDC /AT END OF CHAIN? JMP RED30+2 /NO, KEEP SAVING DCA I REBUFF /YES, TERMINATE IT /FOUND RETRIEVAL BLOCK IN WHICH TO CHOP OFF /THE LIST OF SEGMENTS. /START DELETING THE SEGMENT NUMBERS AND RETURNING /THE ACTUAL DISC SEGMENTS TO THE POOL TAD WNDREM IAC /GET POINTER TO FIRST SEGMENT TO BE DELETED TAD REBUFF DCA REBUFF /POINTER TO FIRST SEGMENT TO REMOVE DCA SEGLIM /CLEAR SEGMENT COUNTER TAD WNDREM /NUMBER OF SEGMENTS TO LEAVE IN RET. WINDOW RED32, TAD C7771 /7 SEGMENTS PER RETRIEVAL WINDOW DCA REWNDC /SAVE COUNT DCA BUFMOD /REMEMBER TO WRITE OUT THE BUFFER RED33, TAD REDM9 DCA CFH /SET COUNT FOR SATREL DIVIDE STL STA TAD I REBUFF /PICK UP THE SEGMENT NUMBER SZL /IS IT A REAL SEGMENT JMP RED38 /NO; END OF WINDOW, END OF FILE JMS I SATREA /RELEASE IT ON SAT DCA I REBUFF /CLEAR THE CCELL ISZ SEGLIM /COUNT SEGMENT ISZ REBUFF ISZ REWNDC /END OF CURRENT RETRIEVAL WINDOW? JMP RED33 /NO, CONTINUE TAD RED31 /YES, MOVE TO NEXT SNA /END OF CHAIN? JMP RED39 /YES, EXIT RED34, DCA RED35 /NO TAD GDRETP JMS I GE01 /GET NEXT WINDOW RED35, 0 DCA REBUFF TAD I REBUFF DCA RED31 /SET UP LINK TO NEXT DCA I REBUFF /CLEAR FIRST WORD OF WINDOW ISZ REBUFF JMP RED32 /KEEP WIPING OUT RED36, STL CLA RTL /ARE WE TWO WINDOWS FROM THE END YET? TAD REWNDC SZA CLA JMP RED37 /NOT EXACTLY DCA I REBUFF /YES, CLEAR LINK TO NOW EMPTY WINDOW DCA BUFMOD /SCHEDULE WRITE JMP RED37 RED38, CLA DCA I REBUFF /CLEAR TO END OF WINDOW ISZ REBUFF ISZ REWNDC /ARE WE THERE YET? JMP RED38 /NO RED39, TAD GDRETP /GET RETRIEVAL POINTER JMS I ENS32 /CONVERT IT INTO A RELATIVE ENTRY NUMBER STL RTL /TIMES 4 PLUS 2 IAC TAD UFDTBL /POINTS TO WORD3 OF UFDTBL ENTRY DCA REBUFF TAD I REBUFF /HAS HIS/HER SEGMENT COUNT BEEN SET UP YET? SNA CLA JMP I RED30 /NO; SO JUST EXIT TAD SEGLIM /NUMBER OF SEGMENTS WE REMOVED FROM THIS FILE CIA TAD I REBUFF /SUBTRACT FROM THOSE THAT WE KNEW ABOUT DCA I REBUFF /UPDATE UFDTBL ENTRY STA DCA TABSTA /REMEMBER TO WRITE OUT THE TABLES JMP I RED30 /EXIT ENS32, ENS3 REDM9, -11 SATREA, SATREL REBUFF, 0 *4000 /RENAME ROUTINE REN0, JMS I ACC01 /IS IT ACCOUNT 1? JMP PASSQU /YES; GO CHANGE PASSWORD AND DISK QUOTA JMS I IFN01 TAD FIOSTK+1 /PICK UP INTERNAL FILE NUMBER JMS I UC01 /USER-OWNER CHECK JMP I REN1A /USER NOT OWNER, ERROR JMS I FILNAM /CHECK IF THIS NEW NAME IS IN DIRECTORY JMP I BADNAM /YES, DON'T RENAME TAD FIOSTK /PICK UP INTERNAL FILE NUMBER NOW SHIFTED TO FIOSTK JMS I GD01 /GET THIS DIRECTORY ENTRY INTO CORE DCA REENTP /POINTER TO DIRECTORY ENTRY TAD REENTP TAD P0004 DCA REPRTP /POINTER TO PROTECTION BITS TAD I REPRTP /PICK UP PROTECTION BITS AND C0020 /WRITE PROTECTED AGAINST OWNER? SZA JMP I REN1A /YES, ERROR TAD FIOSTK+2 /TRANSFER NEW NAME TO DIRECTORY SNA /IS IT A NULL NAME? JMP I BADNAM /YES, DON'T RENAME DCA I REENTP ISZ REENTP TAD FIOSTK+3 DCA I REENTP ISZ REENTP TAD FIOSTK+4 DCA I REENTP DCA BUFMOD /SCHEDULE WRITE JMP I FIEXIT /EXIT FROM FILE PHANTOM REN1A, REN1 FILNAM, USENAM BADNAM, CRF30 SEGS0, TAD I SEGCNT DCA FIUSAC JMP I FIEXIT SEGCNT, -SATSIZ+1 SIFLD, CORTBL+1 PASSQU, CDF 00 TAD I SIFLD /IS THIS REQUEST FROM SI? AND C0200 CFLD SZA JMP I REN1A TAD FIOSTK+1 /OR IS HE TRYING ACCOUNT 0? SNA JMP I BADNAM /YES; ERROR JMP I .+1 PASQU0 /BUILD A RETRIEVAL POINTER GIVEN RELATIVE POSITION ON RETTBL /CALLING SEQUENCE: / TAD (RELATIVE POSITION) / JMS BLDP / RETURN (POINTER IN AC) REENTP, BLDP, 0 DCA CFH CLA CMA TAD CFH CLL RAL RTL TAD RETTBL JMP I BLDP /JMS I LINK01 /MISSING SEGMENT ADD /REPLACEMENT LINK0, 0 DCA LINK1 TAD GDRETP JMS I GE01 LINK1, 0 /GET A DIRECTORY WORD INTO CORE TAD P0003 DCA LINK2 TAD I LINK2 CIA TAD I LINK0 SZA CLA /SEARCH THROUGH UFD UNTIL WE FIND ENTRY BEING SOUGHT JMP LINK3 ISZ LINK0 TAD I LINK0 /TAKE A BLOCK OUT OF THE CHAIN DCA I LINK2 DCA BUFMOD /SCHEDULE WRITE ISZ LINK0 JMP I LINK0 REPRTP, LINK2, 0 LINK3, TAD I LINK2 JMP LINK0+1 /ROUTINE TO SET UP A UFDTBL ENTRY AS FOLLOWS: /WORD 0: PROJECT, PROGRAMMER NUMBER /WORD 1: -ACCESS COUNT /WORD 2: -DISK SEGMENT QUOTA (LOGIN) /WORD 3: ACTUAL NUMBER OF SEGMENTS OWNED. /(WORDS 1 AND 3 ARE INITIALLY SET TO 0.) /WORD 3 IS LOADED BY "CREATE," OR BY "EXTEND" IF IT HAS NOT PREVIOUSLY /BEEN LOADED. "CREATE" & "EXTEND" ALWAYS MODIFY WORD 3, "REDUCE" ONLY /MODIFIES WORD 3 IF IT IS NON-ZERO. UFQUOT, 0 DCA I INDEX /SAVE PROJECT, PROGRAMMER NUMBER DCA I INDEX /ZERO ACCESSES SO FAR TAD SEGLIM /LOGGED IN QUOTA CLL RAL /TIMES 2 TAD SEGLIM /THREE RAL /SIX RTL /TWENTY FOUR TAD SEGLIM /TWENTY FIVE CIA /NEGATE DCA I INDEX /SAVE LOGGED-IN SEGMENT QUOTA DCA I INDEX /NO KNOWN SEGMENTS AS OF YET JMP I UFQUOT /ROUTINE TO GET THE NUMBER OF A DEVICE ATTACHED TO THIS JOB /CALLING SEQUENCE: / JMS LNS0 / RETURN IF NONE AVAILABLE / NORMAL RETURN (DEVICE NUMBER IN AC) LNS0, 0 TAD DEVTBA /GLOBAL TO #DEVTBL# DCA CFH DATFLD /CDF FIELD 0 LNS4, TAD I CFH /PICK UP POINTER TO DDB SNA JMP LNS2 /DEVICE UNASSIGNED IAC DCA LNS3 /POINTER TO SECOOND WORD OF DDB TAD I LNS3 AND P0037 /PICK OFF THE JOB NUMBER OF OWNER CIA TAD FIJOB /NUMBER OF CURRENT JOB SNA CLA JMP LNS5 /THIS DEVICE IS OURS LNS2, ISZ CFH TAD CFH CMA TAD DEVOVR /GLOBAL TO "JOBTBL" SZA CLA JMP LNS4 /CONTINUE LOOKING DOWN TABLE LNS7, CFLD /MAKE SURE WE ARE IN THIS FIELD JMP I LNS0 /FOUND NOW DEVICES LNS5, TAD DEVEND CIA TAD CFH ISZ LNS0 SMA JMP LNS6 TAD LNS10 CLL RAR JMP LNS7 LNS6, TAD C4000 JMP LNS7 LNS10, DEVTBE-DEVTBL LNS3, 0 C4000, 4000 /ROUTINE TO RELEASE A DEVICE *4200 REL00, 0 JMS I DTE01 /IS THIS DEVICE ASSIGNED TO THIS USER? REL5, 0 /SET BY DTE0 TO POINT TO DEVTBL ENTRY FOR THIS DEVICE JMP REL13 /NO, SO DON'T RELEASE IT TAD I REL5 DCA REL6 /SAVE ADDRESS OF DDB FOR LATER TAD REL6 TAD P0003 /POSITION OF TIME IN DDB DCA REL2 TAD I REL2 /GET TIME ASSIGNED CIA DCA REL2 /-TIME ASSIGNED CDF TAD I RELCK1 /GET TIME NOW RTL RTL AND P0007 /JUST SIGNIFICANT PART OF LOW ORDER TIME DCA REL3 TAD I RELCK2 DATFLD RTL RAL AND P7770 /JUST INSIGNIFICANT PART OF HI ORDER TAD REL3 /TIME AT RELEASE CLL TAD REL2 /-TIME AT ASSIGNMENT DCA REL2 /TIME WE OWNED IT TAD REL2 SNL /GONE THRU MIDNITE WHILE ASSIGNED? TAD RELCON /YES, FUDGE TO PROPER VALUE SZA JMS I DVT01 /RECORD TIME SINCE WE USED A MEASURABLE AMOUNT STL TAD REL5 TAD RELCDR /IS IT A CARD READER OR DECTAPE OR RK05? SPA RAR /NO - IS IT A KEYBOARD OR THE PTR? SNL JMP REL11 /EITHER KEYBOARD, PTR, CDR, DTA, OR RK05 TAD RELREG /EITHER PTP OR LPT REL8, DCA REL6 /ENTER HERE FROM REL12 FOR TELEPRINTER STA TAD I REL5 DCA INDEX /POINT TO WORD 0 OF DDB (AUTOINDEXED) TAD I INDEX /CHECK STATUS IF TELEPRINTER SPA CLA JMP REL4 /HE'S IN THE ^S CONDITION - FLUSH HIM/HER OUT DCA I INDEX /CLEAR THE JOB NUMBER ISZ INDEX ISZ INDEX TAD I INDEX /CHECK FILL POINTER SZA CLA JMP REL9 /STILL BUSY - LET "CONOUT" RELEASE IT TAD REL6 SZA CLA /ASSIGNABLE DEVICE? JMP REL7 /YES REL4, TAD I REL5 CIF 00 JMS I RELTBL /MAKE SURE THE BUFFER IS CLEAR DATFLD TAD I REL5 /RELEASE THE DDB JMS I RETBK1 CLA DATFLD DCA I REL5 REL9, CFLD JMP I REL00 REL7, CIF 20 /INHIBIT INTERRUPTS TAD I REL6 CLL RAL SNA JMP REL4 SPA STL RAR DCA I REL6 JMP REL9 REL11, SMA CLA /IS IT A KEYBOARD OR THE PTR? JMP REL12 /NO TAD REL6 CIF 00 JMS I RELTBL /FLUSH OUT THE BUFFER REL12, TAD REL6 JMS I RETBK1 /RELEASE THE DDB CLA DATFLD DCA I REL5 /REMOVE FROM DEVTBL TAD DEVEND CIA TAD REL5 SMA CLA JMP REL9 ISZ REL5 JMP REL8 REL13, CDF TAD I JOB AND C0200 CFLD SZA CLA /CALLED BY SI?? JMP I LGI201 /YES, INDICATE ERROR WITH AC=-1 JMP I REL00 /NO, UUO CALL RELREG, OUTREG+NULINE+3 RELCDR, -DEVTBE-4 DVT01, DVT0 REL2, 0 REL3, 0 RELCK1, CLK1 RELCK2, CLK2 RELCON, 3227 /FUDGE FOR MIDNIGHT OVERFLOW RELTBL, SICLR P0100, 100 FIXSCH, 0 IAC DCA REL5 TAD I REL5 AND P0100 SNA CLA JMP I FIXSCH TAD DEVOVR CIA TAD INDEX FIXOUT, CIF CDF DCA I FIPJOB WAIT EXCEED, 215;212;"[;" ;" ;" ;" ;" ;" ;" ;"E;"X;"C;"E;"E;"D;"I;"N;"G " ;"D;"I;"S;"K;" ;"Q;"U;"O;"T;"A;"];215;212;0 /COMPLETION OF LOGOUT ROUTINE /REMOVES JOB FROM PERMANENT MONITOR TABLES /MUST BE DONE LAST, SINCE WE NEED THE JOB STATUS BLOCKS /TO INDICATE ANY ERRORS IN THE FIP I/O LGO4, TAD LGO500 /RESTORE THE FIP EXIT CFLD DCA I LGOFIX TAD FIJOB /SEE IF HE OWNS ANY CORE FIELDS CIF CORE /SEARCH CORE TABLE FOR HIM/HER FIP SI CJOB JMP LGO5 /NO; NOTHING TO RELEASE AND P0007 /YES; RELEASE THE FIELD TAD CORTBA DCA CFH /POINTS TO ENTRY IN CORTBL CDF DCA I CFH /ZERO THE ENTRY LGO5, TAD FIJOB /RETURN STATUS BLOCKS TAD DEVOVR /START OF JOB TABLE (END OF DEVTBL) DCA LGO6 /POINTS TO JOB TABLE ENTRY DATFLD TAD I LGO6 /GET ADDRESS OF JOB STATUS JMS I LGOBLS /RETURN STATUS DATFLD DCA I JOBDAT /CLEAR JOBDAT DCA I LGO6 /CLEAR POINTER IN JOBTABLE CDF DCA I JOB /CLEAR JOB (SO SAVJOB WON'T SAVE US) JMP I .+1 /AND NOW GO DO FIX50 LGO500, FIX50 LGOBLS, RETBLS LGOFIX, FIX500 LGO1, TAD FIOSTK+1 /LOGOUT WITH AC=0? SZA CLA JMP I LGI201 /NO, SO IT'S AN ERROR TAD FIJOB TAD JOBTAB DCA CFH /GET HIS/HER PROJ-PROG # TAD I CFH CIA DCA FIOSTK+2 /SAVE HIS/HER # TAD JOBTAB DCA INDEX /INITIALIZE TO START OF TABLES TAD LGOMAX /-JOBMAX DCA FIOSTK+3 /COUNT OF JOBS TO CHECK DCA FIOSTK+4 /COUNT OF MATCHES TAD I INDEX TAD FIOSTK+2 /COMPARE SNA CLA ISZ FIOSTK+4 /EXACT MATCH - INDEX COUNT ISZ FIOSTK+3 /DONE? JMP .-5 /NO STA /YES - RETURN # OF MATCHES -1 TAD FIOSTK+4 DCA FIUSAC JMP I FIEXIT /AND AWAY LGOMAX, -JOBMAX OPN11, 0 DCA OPN13 TAD FIOSTK+2 /GET RETRIEVAL POINTER OF UFD BEING ACCESSED CIA TAD RETTBL /IS IT THE MFD? SNA CLA JMP OPN14 /MFD OR UFD, READ OK/WRITE NEVER OK JMS I ACC01 /IS HE THE SYSTEM MANAGER? JMP OPN12 /YES; SKIP PROTECTION CHECK TAD I OPN11 /GET PROPER TEST BITS AND P0007 /JUST TEST FOR READ PROTECTION FIRST AND I OPN13 /COMPARE AGAINST FILE'S PROTECTION WORD SZA CLA JMP I OPNPRA /PROTECTION ERROR TAD I OPN11 /READ OK, GET TEST BITS FOR WRITE CLL RAL /CHECK FOR WRITE PROTECTION AND I OPN13 OPN12, CMA DCA LGO6 /-1 IF OK TO WRITE TAD I ZDS1 /SOME MORE CONDITIONS TO TEST DCA OPN13 TAD FIOSTK+2 JMS I OPN16 /IS HE THE ONLY PERSON TO OPEN THE FILE? OPN13, 0 JMP OPN14 /NO TAD BASSWT CIA DATFLD SZA DCA I BASWIN /MAKE SURE THE BASIC WINDOW GETS LOADED CFLD ISZ LGO6 /IS HE ALLOWED TO MODIFY IT? OPN14, TAD P0004 /NO, SO WRITE PROTECT BIT IS ON ISZ OPN11 /SKIP ON RETURN JMP I OPN11 OPN16, ENS0 OPNPRA, OPNPRE LGO6, FIX40, 0 DCA FLPARB+3 TAD FLPARB+3 DCA FLPARB+5 CLA CMA TAD FLPARB+5 DCA FLPARB+4 JMP I FIX40 *4600 TTYTBA, TTYTBL CLK1A, CLK1 CLK2A, CLK2 RESET, DCA I CFH FGETJT JOBACC DCA ADDR DATFLD TAD FIOSTK+2 DCA I ADDR /PLUG HIS/HER ACCOUNT # INTO HIS JOB STATUS BLOCKS TAD FIJOB /GET JOB # TAD TTYTBA DCA ADDR TAD I ADDR /GET LINE # CLL RAL TAD DEVTBA /FIND THE DDB DCA ADDR TAD P0003 TAD I ADDR DCA ADDR CDF TAD I CLK1A RTL RTL AND P0007 DCA CFH TAD I CLK2A RTL RAL AND P7770 TAD CFH DATFLD /NOW RESET THE DCA I ADDR /ASSIGN TIME JMP I .+1 /THEN EXIT TABOUT BASCO0, 0 JMS I IFN01 /JUST RETURN INTERNAL FILE # IN FIOSTK+1 TAD FIOSTK+1 JMS I CL01 /CLOSE ANY FILE THAT IS OPEN TAD FIOSTK+3 /MAY BE SNA /IS IT A NULL FILE NAME? JMP I OPN3A /YES, ERROR RETURN TAD OPN3A+1 /COMPARE BA SZA CLA JMP BASSET /NO MATCH TAD FIOSTK+2 /IS ACCT # 2? SNA JMS I JBLD0 /WHAT'S HIS/HER ACCOUNT? CLL RTR SNA CLA TAD FIOSTK+4 /COMPARE SI TAD OPN3A+2 SNA CLA TAD FIOSTK+5 TAD OPN3A+3 /COMPARE C SNA CLA CMA /IF BASIC, BASSWT=-1 BASSET, DCA BASSWT /IF NOT, BASSWT=0 TAD FIOSTK+1 JMS I EBLD0 /GET PTR TO ENTTBL WORD 1 RELATIVE PTR WORD 2 ADDRESS IN UFD JMP I BASCO0 /RETURN OPN3A, OPN3 -4241 /-BA -6351 /-SI -4300 /-C CLOBAS, 0 JMS I RETBK1 DCA BAS3 TAD BAS3 CIA TAD BASWIN SNA CLA JMP CLOBA1 TAD BAS3 JMS I RETBK1 CLA SKP CLOBA1, CLA CMA JMP I CLOBAS BAS0, 0 DCA BAS1 /SAVE BUFFER ADDRESS OF RETRIEVAL WINDOW TAD BASWIN /BASIC WINDOW ADDRESS DCA ADDR /GET BUFFER ADDRESS READY BAS5, TAD BAS1 / DCA BAS2 TAD C7771 DCA BAS3 /COUNT OF 7 SEGS PER WINDOW BAS4, ISZ BAS2 CFLD TAD I BAS2 /PICK UP THE SEG # ISZ ADDR SNA JMP BAS6 DATFLD DCA I ADDR /SAVE IT IN WINDOW ISZ BAS3 /COUNT JMP BAS4 /STILL IN SAME BLOCK CFLD TAD I BAS1 /CHANGE THE BLOCK SNA JMP BAS6 /NO MORE SEGMENTS DCA BAS1 TAD FIOSTK+2 /GET THIS BLOCK OF UFD IN BUFFER JMS I GE01 BAS1, 0 DCA BAS1 /SAVE THE BUFFER ADDRESS CONTAINING THE NEEDED BLOCK JMP BAS5 /CONTINUE BAS6, SNA TAD I BAS1 SZA CLA JMP I BAS123 /BASIC MUST BE 39 SEGMENTS OR LESS TO USE SPECIAL WINDOW TAD ADDR SMA CLA JMP .+5 DATFLD DCA I ADDR ISZ ADDR JMP .-2 DATFLD CLA CMA DCA I BASWIN /-1 IN FIRST WORD TO MARK BASIC WINDOW JMP I BAS0 ADDR, 0 BAS2, 0 BAS3, 0 BAS123, OPN123 /ROUTINE TO LET SYSTEM MANAGER CHANGE PASSWORDS AND DISK QUOTAS UFDNAM, RTABLE 0 PASQU0, DCA UFDNAM+1 /SAVE ACCOUNT NUMBER TO SEARCH FOR CMA JMS I DS01 /SEARCH MFD FOR THIS ACCOUNT UFDNAM JMP PASNOT /ACCOUNT NOT FOUND IN MFD DCA INDEX /SAVE POINTER TO OLD PASSWORD TAD FIOSTK+2 /FIRST TWO CHARACTERS OF NEW PASSWORD DCA I INDEX /SAVE IN MFD NAME BLOCK TAD FIOSTK+3 /SECOND TWO CHARACTERS OF NEW PASSWORD DCA I INDEX /SAVE IN MFD ISZ INDEX /SKIP PAST LINK TO NEXT UFD TAD FIOSTK+4 /GET NEW DISK QUOTA DCA I INDEX /SAVE NEW QUOTA DCA BUFMOD /REMEMBER TO WRITE OUT THE MFD SEGMENT TAD FIOSTK+1 /SEE IF THIS ACCOUNT IS CURRENTLY IN THE UFDTBL JMS I UTS01 JMP I FIEXIT /NOT THERE ISZ UTPRNU /POINTS TO -QUOTA ENTRY STA TAD FIOSTK+1 /IS IT THE QUOTA FOR THE "GRACE SPACE"? SNA CLA JMP PASQU1 /YES TAD FIOSTK+4 /TRIM OFF THE LOGOUT PORTION OF THE QUOTA AND P0077 DCA FIOSTK+4 TAD FIOSTK+4 CLL RAL /MULTIPLY BY TWO TAD FIOSTK+4 /THREE RAL /SIX RTL /TWENTY FOUR PASQU1, TAD FIOSTK+4 /TWENTY FIVE; OR ACTUAL COUNT IF FOR "GRACE SPACE" CIA /NEGATE THE RESULT DCA I UTPRNU /SAVE AWAY IN THE UFDTBL JMP I .+1 TABOUT PASNOT, TAD P7000 /RETURN FILE NOT FOUND DCA FIUSAC JMP I FIEXIT /SUBROUTINE TO FIND AN EMPTY DIRECTORY ENTRY /CALLING SEQUENCE: / TAD (POINTER TO UFD RETRIEVAL INFORMATION) / JMS DE0 / BAD RETURN (COULD NOT FIND A FREE ENTRY) / NORMAL RETURN (POINTER TO ENTRY IN AC) DE0, 0 DCA DERETP /SAVE RETRIEVAL PTR DCA DE2 /ZERO THE ADDRESS IN UFD TAD BUFSTA /IS THERE A SEGMENT IN THE BUFFER? SMA CLA JMP DE7 /NO, SO START FROM THE BEGINNING TAD I GERETA /GET THE SEGMENT IN CORE CMA DCA NSEGCR TAD DERETP /GET RETRIEVAL PTR FOR INCREMENT DCA UFDPTR DE5, TAD I UFDPTR SNA /IS THERE A SEGMENT? JMP DE7 /NO, START FROM 0 LOC IN UFD TAD NSEGCR /YES, DOES IT AGREE WITH THE SEGMENT IN CORE? SNA CLA JMP DE6 /YES, START SEARCHING AT THIS POINT TAD DE2 /NO, INCREMENT THE ADDR TAD C0400 DCA DE2 ISZ UFDPTR /POINT TO NEXT SEGMENT IN RETRIEVAL BLOCK JMP DE5 /GO BACK DE7, DCA DE2 /INDICATE THAT SEARCH IS FROM WORD 0 STA DE6, DCA I UFD01 /SAVE SECOND PASS FLAG DE1, TAD DERETP JMS I GE01 /GET ENTRY INTO CORE DE2, 0 SNA /SKIP IF ENTRY EXISTS JMP DE4 /DID NOT EXIST, EXTEND UFD DCA DEBUFP TAD I DEBUFP /FIRST WORD OF ENTRY SZA CLA JMP DE3 /NOT EMPTY, LOOK AT NEXT ENTRY ISZ DEBUFP /ZERO COULD MEAN END OF STRING OF RETRIEVAL INFORMATION BLOCKS TAD I DEBUFP /LOOK AT SECOND WORD OF ENTRY SZA CLA /IF ZERO, EMPTY ENTRY JMP DE3 /NOT EMPTY, KEEP LOOKING TAD DE2 /PICK UP ENTRY POINTER SNA /ENTRY 0 NEVER AVAILABLE JMP DE3 ISZ DE0 /POINT TO NORMAL RETURN JMP I DE0 DE3, TAD C0010 /INCREMENT TO NEXT ENTRY TAD DE2 DCA DE2 /SAVE NEXT ENTRY INDEX JMP DE1 /LOOK AT NEXT ONE DE4, ISZ I UFD01 /HAVE WE TRIED FROM THE BEGINNING YET? JMP DE7 /NO, WELL TRY IT THEN... TAD DERETP JMS I UFD01 /TRY EXTENDING THE UFD JMP I DE0 /TOO BAD, CAN'T EXTEND UFD JMP DE1 /NOW WE HAVE PLENTY OF ROOM DEBUFP, 0 UFD01, UFD0 DERETP, 0 UFDPTR, 0 GERETA, RDCURR NSEGCR, 0 /ROUTINE TO OUTPUT QUOTA EXCEEDED MESSAGE EXTEL0, 0 DATFLD TAD FIJOB /CURRENT JOB NUMBER TAD TTYTAB /POINTS AT POSITION IN TTYTBL DCA DE0 TAD I DE0 /GET CONSOLE NUMBER FOR THIS JOB STL RAL /TIMES 2 PLUS 1 TAD DEVTBA /INDEX TO OUTPUT DDB CDF DCA I CONDVA /STORE FOR FIELD 0 PRINT ROUTINE CFLD TAD EXTMES /GET MESSAGE POINTER DCA INDEX EXTEL1, TAD I INDEX /GET CHARACTER OF THE MESSAGE SNA /ANY LEFT? JMP I EXTEL0 /NO; SO GO EXTEND CIF CDF 00 DCA I FICHAR /STORE FOR PRINT OUT ROUTINE CFLD PRINT /SEND MESSAGE #[EXCEEDING DISK QUOTA]# JMP I EXTEL0 /RAN OUT OF SPACE IN THE OUTPUT BUFFER (TOO BAD!) JMP EXTEL1 /BACK FOR NEXT CHARACTER TTYTAB, TTYTBL CONDVA, CONDBA EXTMES, EXCEED-1 FICHAR, TTCHAR /ROUTINE TO CLEAR ALL CPU AND DEVICE TIME ACCUMULATORS IN THE MFD /THIS IS USED BY THE #RESET# FUNCTION IN THE CUSP #CAT# LGRES0, CLA IAC /SET RESET FLAG IN DIRECTORY SEARCH ROUTINE DCA I RETBK1 TAD RETBK1 DCA EXQ1 /SET POINTER SO FLAG WILL CLEAR ON COMPLETION TAD RETTBL DCA GDRETP /SET RETRIEVAL POINTER JMS LOQUO /GO DO THE RESET CMA /SHOULD RETURN A ZERO IN AC JMP EXTQU1 /ROUTINE TO COUNT TOTAL SEGMENTS OWNED BY A UFD AND /SAVE THE RESULT IN WORD 3 OF THE UFDTBL ENTRY FOR THE RESPECTIVE UFD /CALL: / EXQ1 POINTS TO WORD 3 OF CORRECT UFDTBL ENTRY / JMS LOQUO / RETURN (ENTRY 3 LOADED, TOTAL ALSO IN AC) EXQ3, LOQUO, 0 DCA WNDREM /FUDGE A FILE NAME BEGINNING WITH TWO SPACES JMS I DS01 /SEARCH DIRECTORY TO DETERMINE SEGMENT COUNT GDRETP /(HOPE NO ONE SCRAMBLES LOC. 23-26 ON PAGE 0!!) CLA SKP /GOOD - COULDN'T FIND SUCH A FILE JMP I DIRBAD /FOUND IT! OOPS! TAD SEGLIM /GET THE TOTAL FROM THE DIRECTORY SEARCH DCA I EXQ1 /SAVE IN UFDTBL TAD FIOSTK+1 /INTERNAL FILE NUMBER? SMA /IF THIS IS NOT A "RESET" WE MUST RELOAD JMS I GD01 /THE CORRECT DIRECTORY SEGMENT DCA REL6 /SAVE POINTER TO NAME BLOCK TAD SEGLIM /RETURN WITH CURRENT TOTAL JMP I LOQUO EXTQU8, CLA /WE'VE BEEN HERE BEFORE FOR THIS GUY CFLD TAD EXQ2 /WILL THIS EXTEND CARRY TAD I EXQ1 /THIS FILE ACROSS THE QUOTA BOUNDARY AGAIN? SMA SZA CLA /(I.E. HAS HE REDUCED SINCE LAST EXTEND?) JMP EXTQU9 /NO; HE'S STILL ABOVE QUOTA, EXTEND QUIETLY EXTQU6, TAD EXFILE /ADDRESS WITHIN MESSAGE TO STORE FILE NAME DCA INDEX JMS EXTNAM /CHAR 1 & 2 OF FILE NAME JMS EXTNAM /CHAR 3 & 4 OF FILE NAME JMS EXTNAM /CHAR 5 & 6 OF FILE NAME JMS I EXTELL /NOTIFY USER THAT QUOTA IS BEING EXCEEDED EXTQU9, CLA JMP I EXTQU0 /EXIT TO EXTEND FILE AS REQUESTED EXTQU5, TAD FIOSTK+2 /NUMBER OF SEGMENTS HE WON'T GET EXTQU1, DCA FIUSAC /PASS RESULT BACK TO THE USER JMP I FIEXIT /ROUTINE TO CHECK LOGIN QUOTA BEFORE EXTENDING A FILE EXTQU0, 0 TAD GDRETP /COMPARE RETRIEVAL POINTER CIA TAD RETTBL /AGAINST THE MFD'S ENTRY SNA CLA /IS IT FROM THE SYSTEM MANAGER? JMP I VIOLAT /GET OUT QUICK, BEFORE HE DESTROYS THE SYSTEM TAD FIOSTK+2 /NUMBER OF SEGMENTS TO BE ADDED SPA /IS HE BEING REASONABLE? JMP EXTQU1 /NO - HE DESERVES TO FAIL! CLL CIA TAD I SATSEG /ARE THERE THAT MANY SEGMENTS LEFT ON THE SYSTEM? SNL CLA JMP EXTQU5 /NO; SO DON'T GIVE ANY TAD GDRETP /RETRIEVAL POINTER JMS I ENS33 /CONVERT TO RELATIVE ENTRY NUMBER STL RTL /TIMES FOUR PLUS TWO TAD UFDTBL /POINTS AT -LOGIN QUOTA DCA EXQ1 /SAVE POINTER TAD I EXQ1 /GET NEGATIVE QUOTA DCA EXQ2 /AND SAVE ISZ EXQ1 /POINTS AT CURRENTLY OWNED COUNT TAD I EXQ1 /GET HIS/HER PRESENT TOTAL SNA /HAS THE COUNT BEEN SET UP YET? JMS LOQUO /NO; GO FIGURE IT OUT TAD FIOSTK+2 /ADD THE NUMBER HE WANTS TAD EXQ2 /AND SUBTRACT FROM QUOTA SPA SNA /WILL THIS EXCEED THE QUOTA FOR THIS ACCOUNT? JMP EXTQU9 /NO; GO EXTEND TAD I GRACE /WILL IT GO BEYOND THE #GRACE SPACE#? SMA SZA CLA JMP EXTQU5 /YES; DON'T BOTHER EXTENDING TAD FIOSTK+1 /SEE IF THIS FILE IS ALREADY IN THE GRACE AREA JMS I LNK01 /GET POINTER TO FILE CONTROL BLOCK TAD FILPRP /POINT TO STATUS WORD DCA EXQ3 DATFLD TAD I EXQ3 /GET CURRENT STATUS FOR THIS FILE RAR SZL /IS THIS FILE IN THE GRACE AREA? JMP EXTQU8 /MAYBE; SEE IF HE'S REENTERING STL RAL /SET GRACE BIT DCA I EXQ3 CFLD JMP EXTQU6 /SEND MESSAGE, THEN GO EXTEND /ROUTINE TO PLANT FILE NAME INTO "EXCEEDING QUOTA" MESSAGE EXTNAM, 0 TAD I REL6 /GET PART OF FILE NAME RTR RTR RTR AND P0077 /SAVE LEFT BYTE TAD P0240 /CONVERT TO ASCII DCA I INDEX /STORE IN THE MESSAGE AREA TAD I REL6 /NOW FOR THE RIGHT BYTE AND P0077 TAD P0240 /CONVERT TO ASCII DCA I INDEX /SAVE RIGHT BYTE ISZ REL6 /POINT TO NEXT CHARACTER JMP I EXTNAM /ROUTINE TO CHECK FOR THE SAFE REDUCTION OF A UFD /TWO CONDITIONS MUST BE MET: / THE ACCOUNT CANNOT BE IN USE TO ANYONE / THE ACCOUNT MUST HAVE AN EMPTY DIRECTORY EXQ2, REDUF0, 0 TAD GDRETP /GET RETRIEVAL POINTER CIA TAD RETTBL /IS HE TRYING TO REDUCE A UFD? SZA CLA JMP I REDUF0 /NO; LET HIM/HER REDUCE NORMAL FILES TAD I REL6 /GET THE ACCOUNT NUMBER OF THE UFD IN QUESTION JMS I UTS01 /LOOK IT UP IN THE UFD TABLE JMP REDUF1 /NOT THERE - GOOD CLA TAD C4400 /TELL HIM "FILE IN USE" JMP EXTQU1 REDUF1, TAD I REL6 /GET THE ACCOUNT NUMBER OF THE UFD TO BE DELETED JMS I UFO01 /LOAD ITS RETRIEVAL WINDOW INTO RTABLE JMP EXTQU5 /COULDN'T; PAS HIS/HER OWN AC BACK AS AN ERROR INDICATION JMS I BLDP1 /MAKE A RETRIEVAL POINTER DCA GDRETP /SAVE IT FOR THE SEARCH ISZ EXQ1 /POSITION UFDTBL POINTER FOR THIS ACCOUNT ISZ EXQ1 /TO POINT TO THE SEGMENT ACCUMULATOR JMS LOQUO /SEE IF THIS UFD STILL CONTAINS FILES CLL STA RTL /AC=-3 TAD EXQ1 /POSITION WE'VE BEEN ASSIGNED ON UFDTBL JMS I TF01 /FREE THE POSITION TAD I EXQ1 /DID HE OWN ANY SEGMENTS? SZA CLA JMP I VIOLAT /STILL SOME FILES IN THERE! STA DCA FIOSTK+2 /FORCE HIM/HER TO COMPLETELY DELETE THIS UFD JMP I REDUF0 VIOLAT, PRT1+1 ENS33, ENS3 SATSEG, -SATSIZ+1 EXFILE, EXCEED+2 EXTELL, EXTEL0 P0240, 240 GRACE, UTABLE+2 $%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$