SUBTTL 3-NOV-75 ; ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1976,1977,1986,1988. ;ALL RIGHTS RESERVED. ; ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER COPIES THEREOF ;MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO ;TITLE TO OR OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED. ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ;CORPORATION ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ; ; ; VWHO==0 VFE==2 VMINOR==0 VEDIT==50 IFNDEF .PSECT,< .DIRECT .XTABM> SALL SEARCH MACSYM SYN IFE,IF ;SO THAT "IF TOPS-10" WORKS ; ; PARAMETERS ; IFNDEF FTDB, ;1: ENABLE CODE TO SUPPORT RP04 (DB) REQUESTS IFNDEF TOPS, ;10: TOPS-10 SUPPORT; 20: TOPS-20 SUPPORT IFNDEF FIDNUM, ;ALLOW 4 OPEN FILE-ID'S IFNDEF PDLEN, ;STACK LENGTH IF TOPS-20,< TITLE FE -- FE DEVICE INTERFACE FOR TOPS-20 SEARCH MONSYM .REQUIRE SYS:MACREL FTDTE.==0 ;NO DTE. UUO'S!!! >; END IF TOPS-20 IF TOPS-10,< TITLE FE -- FE DEVICE INTERFACE FOR TOPS-10 SEARCH UUOSYM COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1976,1988. ALL RIGHTS RESERVED. \;END OF COPYRIGHT MACRO IFNDEF UICNUM, ;ALLOW 10. UIC TABLE ENTRIES IFNDEF FTPATH, ;ALLOW PATH SPECS IN UIC TABLE IFNDEF FTDTE., ;0: USE FE DEVICE JSYS'ES 1: USE DTE. UUO'S IFN FTDB, IFE FTDTE.,< SEARCH MONSYM .REQUIRE SYS:MACREL >; END IFE FTDTE. >; END IF TOPS-10 ; ; REGISTERS ; F= 0 ;FLAGS T1= 1 ;GENERAL USE, T1-T4 MUST BE 1-4 T2= 2 ; . . T3= 3 ; . . T4= 4 ; . . P1= 5 ;NOT-SO-GENERAL USE P2= 6 ; . . P3= 7 ; . . P4= 10 ; . . ; HDR= 11 ;ADDRESS OF CURRENT HEADER AREA FID= 12 ;ADDRESS OF CURRENT FILE-ID BLOCK C= 13 ;RANDOM CHARACTERS ; P= 17 ;STACK POINTER ; ; FLAGS -- IN REGISTER F ; F.PROC==1B0 ;PROCCESSING A REQUEST-- DON'T ALLOW IPCF F.WRIT==1B1 ;WRITE REQUEST ; ; MACROS ; IF TOPS-10,< DEFINE TMSG(MSG),< OUTSTR [ASCIZ\MSG\] > >; END IF TOPS-10 DEFINE WARN(MSG,GOTO,IL),< IFB , TMSG <% MSG > IFNB , IFB ,< IFB , ]> > ; DEFINE RETERR(ERR,IL),< IFB , MOVEI T1, IFNB , IFB , > ; OPDEF CALL [PUSHJ P,] OPDEF CALLR [JRST] OPDEF RETURN [POPJ P,] DEFINE RETSKP, DEFINE CALLRX (WHERE),,>> ; ; TOPS-20 HOM BLOCK DEFINITIONS ; HOMNAM==0 ;ALWAYS CONTAINS SIXBIT/HOM/ HOMSNM==3 ;NAME OF STRUCTURE IN SIXBIT HOMLUN==4 ;LH: TOTAL # UNITS IN STR, RH: CURRENT UNIT # HOMSIZ==13 ;SIZE OF THIS UNIT IN BLOCKS HOMFE0==61 ;SECTOR ADDRESS OF F-E-F-S, BIT 2 SET IF EXISTS HOMFE1==62 ;SIZE OF F-E-F-S IN SECTORS ; ; -11 STYLE BITS ; DEFINE ..BIT(IT),> RADIX 10 $$$BIT==-1 REPEAT 16,<..BIT(\<$$$BIT==$$$BIT+1>)> RADIX 8 SUBTTL DATA DEFINITIONS ; ; MACROS TO DO DEFINITIONS OF -11 DATA STRUCTURES ; DEFINE .BYT (NAME,LOC,OFF),< $$$BIT==^D17 IFN <&BIT1>,<$$$BIT==$$$BIT+^D18> IFN <&BIT0>,<$$$BIT==$$$BIT-^D8> DEFSTR (NAME,<<<</4>>>+LOC>,$$$BIT,^D8) > DEFINE .WRD (NAME,LOC,OFF),< $$$BIT==^D17 IFN <&BIT1>,<$$$BIT==$$$BIT+^D18> IFN <&BIT0>, DEFSTR (NAME,<<<</4>>>+LOC>,$$$BIT,^D18) > DEFINE .DWRD (NAME,LOC,OFF),< IFN <&>, DEFSTR (NAME,<<<</4>>>+LOC>,^D35,^D36) > DEFINE PNTR (STR,Y),<..STR0 (..PNTR,AC,STR,Y)> DEFINE ..PNTR (AC,LOC,MASK),,)> ; DEFINE .RAD50 (X),,<$$$CHR=="X"-"0"+36> IFGE <"X"-"A">,<$$$CHR=="X"-"A"+1> $$$R50==<$$$R50*50>+$$$CHR > XWD $$$R50_-^D16,$$$R50&177777 >> ; ; GENERAL BYTE AND WORD DEFINITIONS ; .BYT (BYTE0,,0) .BYT (BYTE1,,1) .BYT (BYTE2,,2) .BYT (BYTE3,,3) .WRD (WORD0,,0) .WRD (WORD1,,2) ; ; HEADER FROM -11 ; .WRD (HDRFN,0(HDR),0) ;FUNCTION CODE .WRD (HDRDV,0(HDR),2) ;DEVICE NAME IN 8-BIT ASCII .BYT (HDRUN,0(HDR),4) ;UNIT NUMBER OF DEVICE .WRD (HDRP1,0(HDR),6) ;PARAMETER #1 .WRD (HDRP2,0(HDR),10) ;PARAMETER #2 .WRD (HDRSZ,0(HDR),12) ;SIZE OF FOLLOWING DATA BLOCK HDRLEN==14 ;SIZE OF HEADER IN BYTES ; ; FILE CONTROL PRIMITIVES DATA ; .DWRD (FILID,SCRBUF,0) ;FILE-NAME BLOCK IS ALWAYS FIRST .WRD (FILP1,SCRBUF,4) ;FILE PARAMETER #1 (ACCESS OR EXTEND) .WRD (FILP2,SCRBUF,6) ;FILE PARAMETER #2 (EXTEND) .WRD (FILAT0,SCRBUF,10-2) ;ATTRIBUTE CONTROL BLOCK (PRE-POINTER FOR ILDB) .WRD (FILACB,SCRBUF,10) ;ATTRIBUTE CONTROL BLOCK ; ; READ/WRITE VIRTUAL BLOCK DATA ; .WRD (RWVBH,SCRBUF,4) ;HIGH PART VBN .WRD (RWVBL,SCRBUF,6) ;LOW PART VBN .WRD (RWVSZ,SCRBUF,10) ;TRANSFER SIZE IN BYTES .WRD (RWVDW0,SCRBUF,12-2) ;PRE-POINTER TO FIRST DATA WORD .BYT (RWVDB,SCRBUF,12) ;FIRST BYTE OF DATA ; ; FILE-NAME BLOCK ; .DWRD (N.FID,SCRBUF,0) ;FILE-ID .WRD (N.FNM0,SCRBUF,6-2) ;FILE-NAME (POINTER FOR ILDB/IDPB) .WRD (N.FNAM,SCRBUF,6) ;FILE NAME (3 WORDS) .WRD (N.FTYP,SCRBUF,14) ;FILE TYPE .WRD (N.FVER,SCRBUF,16) ;FILE VERSION # .WRD (N.STAT,SCRBUF,20) ;STATUS BITS: NB.SVR==BIT3 ;WILD VERSION NB.STP==BIT4 ;WILD FILE TYPE NB.SNM==BIT5 ;WILD FILE NAME .WRD (N.NEXT,SCRBUF,22) ;CONTEXT SAVE FOR WILD OPERATIONS .DWRD (N.DID,SCRBUF,24) ;DIRECTORY ID .WRD (N.DOW,SCRBUF,30) ;DIRECTORY OWNER S.DRFN==32 ;SIZE FOR DIRECTORY FUNCTIONS ; ; FILE HEADER ; .WRD (H.IDOF,FILHDR,0) ;ID/MAP AREA OFFSETS .WRD (H.FNUM,FILHDR,2) ;FILE NUMBER .WRD (H.FSEQ,FILHDR,4) ;FILE SEQUENCE # .WRD (H.FLEV,FILHDR,6) ;FILE SYSTEM LEVEL .WRD (H.FOWN,FILHDR,10) ;FILE OWNER (UIC) .WRD (H.FPRO,FILHDR,12) ;FILE PROTECTION CODE .WRD (H.CHAR,FILHDR,14) ;FILE CHARACTERISTICS .WRD (H.UFAT,FILHDR,16) ;USER FILE ATTRIBUTES (16. WORDS) .BYT (H.RTYP,FILHDR,16+0) ;RECORD TYPE .BYT (H.RATT,FILHDR,16+1) ;RECORD ATTRIBUTES .WRD (H.RSIZ,FILHDR,16+2) ;RECORD SIZE .WRD (H.HHBK,FILHDR,16+4) ;HIGHEST VBN IN USE (HIGH PART) .WRD (H.LHBK,FILHDR,16+6) ; . . . (LOW PART) .WRD (H.HEFB,FILHDR,16+10) ;END-OF-FILE BLOCK # (HIGH PART) .WRD (H.LEFB,FILHDR,16+12) ; . . . (LOW PART) .WRD (H.FFBY,FILHDR,16+14) ;FIRST FREE BYTE IN END-OF-FILE BLOCK .WRD (I.FNM0,FILHDR,56-2) ;FILENAME RAD50 .WRD (I.FNAM,FILHDR,56) ;FILENAME RAD50 .WRD (I.FTYP,FILHDR,64) ;FILE TYPE .WRD (I.FVER,FILHDR,66) ;FILE VERSION # .WRD (I.RVNO,FILHDR,70) ;REVISION # .BYT (I.RVDT,FILHDR,72) ;REVISION DATE (7 BYTES) .BYT (I.RVTI,FILHDR,101) ;REVISION TIME (6 BYTES) .BYT (I.CRDT,FILHDR,107) ;CREATION DATE (7 BYTES) .BYT (I.CRTI,FILHDR,116) ;CREATION TIME (6 BYTES) .WRD (I.EDTW,FILHDR,124) ;EXPIRATION DATE .BYT (I.EXDT,FILHDR,124) ;EXPIRATION DATE (7 BYTES) SUBTTL QUEUE I/O DEFINITIONS ; ; I/O FUNCTIONS ; DEFINE IO(XXX,FUNC,SUB),< IO.'XXX== B<35-8>+B<35-0> > ; IO WLB,1 ;WRITE LOGICAL BLOCK IO RLB,2 ;READ LOGICAL BLOCK IO LOV,2,10 ;LOAD OVERLAY IO ATT,3 ;ATTACH DEVICE IO FCP,3,1 ;FILE CONTROL PRIMITIVE IO DET,4 ;DETACH DEVICE ; IO CLN,7 ;CLOSE OUT LUN ; IO FNA,11 ;FIND NAME IN DIRECTORY IO RNA,13 ;REMOVE NAME FROM DIRECTORY IO ENA,14 ;ENTER NAME IN DIRECTORY ; IO ACR,15 ;ACCESS FOR READ IO ACW,16 ;ACCESS FOR READ, WRITE IO ACE,17 ;ACCESS FOR READ, WRITE, EXTEND IO DAC,20 ;DE-ACCESS FILE IO RVB,21 ;READ VIRTUAL BLOCK IO WVB,22 ;WRITE VIRTUAL BLOCK IO EXT,23 ;EXTEND FILE IO CRE,24 ;CREATE FILE IO DEL,25 ;MARK FILE FOR DELETE IO RAT,26 ;READ FILE ATTRIBUTES IO WAT,27 ;WRITE FILE ATTRIBUTES IO APC,30 ;ACP CONTROL IO APV,30,10 ;PRIVILEDGED ACP CONTROL ; ; STATUS RETURN CODES ; RADIX 10 ;** NOTE RADIX 10 ** IS.SUC==+1 ;SUCCESSFULL COMPLETION ; IE.BAD==-1 ;BAD PARAMETERS IE.IFC==-2 ;ILLEGAL FUNCTION CODE IE.DNR==-3 ;DEVICE NOT READY IE.VER==-4 ;PARITY OR DEVICE ERROR IE.ONP==-5 ;HARDWARE OPTION NOT PRESENT IE.SPC==-6 ;ILLEGAL USER BUFFER IE.EOF==-10 ;END OF FILE IE.EOV==-11 ;END OF VOLUME IE.WLK==-12 ;WRITE LOCKED DEVICE IE.DAO==-13 ;DATA OVERRUN IE.SRE==-14 ;SEND/RECEIVE FAILURE IE.ABO==-15 ;OPERATION ABORTED IE.PRI==-16 ;PRIVILEDGE VIOLATION IE.RSU==-17 ;SHARABLE RESOURCE IN USE IE.OVR==-18 ;ILLEGAL OVERLAY REQUEST IE.BYT==-19 ;BYTE-ALIGNED BUFFER IE.BLK==-20 ;LOGICAL BLOCK # TOO LARGE ; IE.NOD==-23 ;LACK OF NODE SPACE IE.DFU==-24 ;DEVICE FULL IE.IFU==-25 ;INDEX FILE FULL IE.NSF==-26 ;NO SUCH FILE IE.LCK==-27 ;LOCKED FROM WRITE ACCESS IE.HFU==-28 ;FILE HEADER FULL IE.WAC==-29 ;ACCESSED FOR WRITE IE.CKS==-30 ;FILE HEADER CHECKSUM ERROR IE.WAT==-31 ;ATTRIBUTE CONTROL LIST FORMAT ERROR IE.RER==-32 ;FCP DEVICE READ ERROR IE.WER==-33 ;FCP DEVICE WRITE ERROR IE.ALN==-34 ;FILE ALREADY ACCESSED ON LUN IE.SNC==-35 ;FILE ID, FILE NUMBER CHECK IE.SQC==-36 ;FILE ID, SEQUENCE NUMBER CHECK IE.NLN==-37 ;NO FILE ACCESSED ON LUN IE.CLO==-38 ;FILE NOT PROPERLY CLOSED IE.DUP==-57 ;ENTER - DUPLICATE NAME IN DIRECTORY IE.BVR==-63 ;BAD VERSION NUMBER IE.BHD==-64 ;BAD FILE HEADER ; IE.IDU==-92 ;INVALID DEVICE OR UNIT NUMBER ; RADIX 8 ;** END OF RADIX 10 ** SUBTTL IMPURE DATA ; ; BUFFERS FOR HEADERS TO AND FROM THE -11 ; HEADER: BLOCK /4 ;MESSAGE HEADER FROM -11 FNCHDR: BLOCK /4 ;MESSAGE TO -11 ; ; STACK ; PDL: BLOCK PDLEN ;STACK ; ; VARIABLES ; INICLR==. ;START OF AREA TO CLEAR ON STARTUP IFN FTDB,< FSJFN: BLOCK 1 ;JFN OF FRONT-END-FILE-SYSTEM FILE DSKOFS: BLOCK 1 ;OFFSET IN BLOCKS TO UNIT WITH F-E-F-S ON IT FEADDR: BLOCK 1 ;SECTOR ADDRESS OF F-E-F-S FESIZE: BLOCK 1 ;SIZE (IN SECTORS) OF F-E-F-S CFSPAG: BLOCK 1 ;CURRENT F-E-F-S PAGE # CFSSIZ: BLOCK 1 ;CURRENT F-E-F-S AREA SIZE MAPPED IN PAGES > ;END IFN FTDB ; IF TOPS-20,< FEJFN: BLOCK 1 ;JFN OF FE DEVICE CHN1PC: BLOCK 1 ;PC AT CHANNEL 1 PSI FNMBLK: BLOCK 10+10+10+3 ;FILE NAME STRING BUFFER FILFDB: BLOCK .FBLEN ;WHOLE FDB >; END IF TOPS-20 IF TOPS-10,< CHNMSK: BLOCK 1 ;MASK OF ACTIVE CHANNELS TMPFIL: BLOCK 1 ;CURRENT NUMBER FOR TEMP FILES IFN FTDTE.,< FEDNUM: BLOCK 1 ;FE DEVICE # DTEFNC: BLOCK 1 ;CURRENT DTE. FUNCTION CODE >; END IFN FTDTE. IFE FTDTE.,< FEJFN: BLOCK 1 ;JFN OF FE DEVICE >; END IFE FTDTE. >; END OF IF TOPS-10 ; BLKSIZ: BLOCK 1 ;SIZE OF CURRENT INPUT BLOCK IN BYTES FROM FE USECNT: BLOCK 1 ;USE COUNT OF FILE-ID'S DATBUF: BLOCK 5 ;SCRATCH FOR DATE TEXT ; ATTRCB: BLOCK 10 ;SCRATCH ATTRIBUTE CONTROL BLOCK FILHDR: BLOCK 1000/4 ;SIMULATED FILE HEADER FOR FCP STSBLK: BLOCK 3 ; . . STATISTICS BLOCK FILHDE: ;END OF FILE HEADER DATA ; FIDTAB: ;FILE-ID CORRESPONDENCE BLOCK: REPEAT FIDNUM,< PHASE 0 FIDFID==. BLOCK 1 ;FILE-ID OF FILE (LH= INDEX INTO FIDTAB ; RH= SEQUENCE # FIDJFN==. BLOCK 1 ;JFN OF FILE FJ.WLN==1B0 ;WILD NAME FJ.WLT==1B1 ;WILD TYPE FJ.WLG==1B2 ;WILD GENERATION # FJ.WLD==FJ.WLN!FJ.WLT!FJ.WLG ;WILD ARGS TO GETNAM FJ.ALL==1B3 ;STRUCTURE NAME IS ALL STRUCTURES FJ.DSK==1B4 ;STRUCTURE NAME IS DISK SEARCH LIST FIDFLG==. BLOCK 1 ;FLAGS WORD FI.ACC==1B0 ;FILE IS ACCESSED FI.WRT==1B1 ;FILE IS ACCESSED FOR WRITE FI.TMP==1B2 ;FILE IS TEMP FILE (I.E. NO NAME YET) FI.ASC==1B3 ;FILE IS 7-BIT ASCII FIDNAM==. BLOCK 1 ;LH= FILENAME (1) RH= FILENAME (2) FIDTYP==. BLOCK 1 ;LH= FILENAME (3) RH= FILE TYPE FIDVER==. BLOCK 1 ;LH= FILE VERSION # FIDUIC==. BLOCK 1 ;RH= UIC OF FILE OWNER FIDUCT==. BLOCK 1 ;USE COUNT FIDFBP==. BLOCK 1 ;CURRENT FILE BYTE POINTER IF TOPS-10,< FIDSTR==. BLOCK 1 ;CURRENT STRUCTURE NAME FOR WILD LOOKUPS FIDDIX==. BLOCK 1 ;DIRECTORY INDEX FOR CURRENT WILD FILE FIDLEB==. BLOCK .RBALC+1 ;EXTENDED LOOKUP/ENTER BLOCK >; END IF TOPS-10 ; FIDSIZ==. ;SIZE OF EACH BLOCK DEPHASE >; END REPEAT FIDNUM FIDTBE: ; CLREND==.-1 ; ; UIC-DIRECTORY CORRESPONDENCE TABLE ; UICSIZ==0 ;SIZE OF ENTRY UICUIC==1 ;CORRESPONDING UIC IF TOPS-20,< UICNAM==2 ;START OF NAME IN ASCIZ >; END IF TOPS-20 IF TOPS-10,< UICSTR==2 ;STRUCTURE NAME IN SIXBIT, OR 0 (ALL) OR 1 (DSK) UICPTH==2 ;PATH BLOCK STARTS HERE: JUNK UICSCS==3 ;SCAN SWITCH= 0 UICPPN==4 ;P,PN UICSFD==5 ;FIRST WORD OF SFD SPECS >; END IF TOPS-10 IF TOPS-20,< DEFINE .UIC(PJ,PG,NAME,%END),< EXP %END-. ;LENGTH OF ENTRY BYTE (36-16)0 (8)PJ (8)PG ;UIC= [PJ,PG] ASCIZ /NAME/ ;DIRECTORY %END==. ;END OF THE ENTRY > >; END IF TOPS-20 IF TOPS-10,< DEFINE .UIC(PJ,PG,STR,PROJ,PROG,%END),< EXP %END-. ;LENGTH OF ENTRY BYTE (36-16)0 (8)PJ (8)PG ;UIC= [PJ,PG] EXP STR EXP 0 XWD PROJ,PROG EXP 0 %END==. ;END OF THE ENTRY > ; IFN 0,< .UIC 1,1,0,1,1 .UIC 1,4,0,1,4 .UIC 5,5,0,10,3606 .UIC 5,6,0,10,757 EXP 0 >; END IFN 0 UICTAB: BLOCK 10*UICNUM BLOCK 1 UICTBL==.-UICTAB >; END IF TOPS-10 ; ; MISC. DATA BUFFER ; IF TOPS-20,< LOC 100K ;ALSO MORE RANDOM >; END IF TOPS-20 SCRBUF: ;THIS IS BUFFER SPACE IF TOPS-10,< BLOCK 2K >; END IF TOPS-10 ; ; BUFFER FOR DUMP I/O ; IF TOPS-20,< LOC 200K ;ALSO MORE RANDOM >; END IF TOPS-20 DMPBUF: IF TOPS-10,< BLOCK 2K >; END IF TOPS-10 ; IFN FTDB,< ; ; PAGE BUFFER FOR I/O TO AND FROM THE -11 FILE SYSTEM ; LOC 300K ;RANDOM PLACE ; FEFBUF: ;HERE ON IS BUFFER SPACE >; END IFN FTDB IF TOPS-20,< RELOC >; END IF TOPS-20 SUBTTL PURE DATA ; ; ENTRY VECTORS ; ENTVEC: JRST START ;START IF TOPS-20,< JRST FEWAIT ;REENTER >; END IF TOPS-20 IF TOPS-10,< LOC 137 >; END IF TOPS-10 BYTE (3)VWHO (9)VFE (6)VMINOR (18)VEDIT IF TOPS-10,< RELOC >; END IF TOPS-10 IF TOPS-20,< ; ; PSI TABLES ; LEVTAB: EXP CHN1PC,0,0 CHNTAB: EXP 0,0,0,0,0,0,0,0,0 ;00-08: UNUSED XWD 1,ILLTRP ;09: PDL OV EXP 0 ;10: UNUSED XWD 1,IOERR ;11: FILE DATA ERROR EXP 0,0,0 ;12-14: UNUSED XWD 1,ILLTRP ;15: ILLEGAL INSTRUCTION XWD 1,ILLTRP ;16: ILLEGAL MEMORY READ XWD 1,ILLTRP ;17: ILLEGAL MEMORY WRITE XWD 1,ILLTRP ;18: ILLEGAL MEMORY EXECUTE EXP 0 ;19: UNUSED XWD 1,ILLTRP ;20: MACHINE SIZE EXCEEDED EXP 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;21-35: UNUSED ; ; UIC-DIRECTORY TABLE ; UICTAB: .UIC 1,1,SYSTEM .UIC 1,2,OPERATOR .UIC 1,4,SUBSYS .UIC 5,5,FRONT-END EXP 0 ;END OF TABLE >; END OF IF TOPS-20 IF TOPS-10,< ; ; DUMP I/O LIST ; DMPLST: IOWD 200,DMPBUF EXP 0 >;END IF TOPS-10 SUBTTL INITIALIZATION IF TOPS-20,< ; ; HERE ON PANIC CHANNEL PSUEDO-INTERRUPT ; ILLTRP: WARN ,,X >; END IF TOPS-20 ; ; INITIALIZE ; START: RESET ;RESET I/O STATE MOVE P,[IOWD PDLEN,PDL] ;INITIALIZE STACK POINTER SETZB F,INICLR ;CLEAR FLAGS, AND FIRST WORD OF STORAGE MOVE T1,[XWD INICLR,INICLR+1] ;SET TO CLEAR BLT T1,CLREND ; ALL OF VARIABLES ; ; INITIALIZE FE DEVICE ; IFE FTDTE.,< ; ; ASSIGN A JFN TO DEVICE 'FE' AND OPEN IT ; MOVEI P1,0 ;START WITH FE #0 ; GETFE: HRROI T1,SCRBUF ;POINT TO NAME AREA HRROI T2,[ASCIZ/FE/] ;GET FIRST PART OF NAME SETZ T3, ;IN ASCIZZ SOUT ;PUT IT IN SCRBUF MOVE T2,P1 ;GET THE # OF FE WE WANT THIS TIME MOVX T3,^D8 ; IN OCTAL NOUT ;STORE IN GTJFN STRING JSHLT ;OOPS MOVEI T2,":" ;FINISH IT OFF IDPB T2,T1 ; . . MOVEI T2,0 ; . . IDPB T2,T1 ; . . ; MOVX T1,GJ%OLD!GJ%SHT ;1/ OLD FILE, SHORT GTJFN CALL HRROI T2,SCRBUF ;2/ ASCIZ FILE STRING GTJFN ;ASSIGN A JFN TO FE JRST [CAIE 1,GJFX29 ;IS DEVICE NOT AVAILABLE? JSHLT ;YES-- GIVE UP AOJA P1,GETFE] ;NO-- TRY AGAIN MOVEM T1,FEJFN ;SAVE THE JFN FOR FE0 ; MOVX T2,<^D16>B5!OF%RD!OF%WR ;2/ OPEN FOR READ, WRITE, 16 BIT BYTES OPENF ;OPEN FE0 JRST [CAIE T1,OPNX7 ;DEVICE NOT AVAILABLE? JSHLT ;NO-- GIVE UP HRRZ T1,FEJFN ;YES-- GET THE JFN RLJFN ; AND RELEASE IT JFCL ;OOPS AOJA P1,GETFE] ;AND TRY AGAIN MOVX T2,.MODTE ;2/ FUNCTION: GET A DTE MOVX T3,0 ;3/ DTE #0 MTOPR ;GET A DTE ERJMP JSHLT0 ;OOOOOPS ; MOVE T1,FEJFN ;1/ JFN OF FE DEVICE MOVX T2,.MOEOF ;2/ PERFORM AN END-OF-FILE MOVX T3,0 ;3/ REALLY SEND THE EOF MTOPR ;TELL -11 WE HAVE JUST RESTARTED ; >; END IFE FTDTE. IFN FTDTE.,< GETFE: MOVEI T1,.DTEGF ;FUNCTION= GET FE DEVICE CALL DTESET ;SET UP REGISTERS DTE. T4, ;ATTEMPT TO GET AN FE JRST [ CAIN T4,DTENF% ;NON-EX FE DEVICE? WARN ,[EXIT] CAIE T4,DTEFB% ;BUSY WITH ANOTHER JOB? CALL DTEERR ;NO-- OTHER FATAL ERROR AOS FEDNUM ;YES-- GET NEXT FED # JRST GETFE] ;AND TRY AGAIN MOVEI T1,.DTEFS ;SET FE DEVICE STATUS MOVX T3,DT.EOF ; TO END-OF-FILE CALL DTEUUO ; . . . >; END IFN FTDTE. ; ; MORE INITIALIZATION . . . ; IF TOPS-20,< MOVX T1,.FHSLF ;1/ OUR FORK MOVE T2,[XWD LEVTAB,CHNTAB] ;2/ TABLE ADDRESSES SIR ;SET INTERRUPT TABLE ADDRESSES MOVX T2,1B9+1B11+1B15+1B16+1B17+1B18+1B20 ;2/ PANIC CHANNELS AIC ;ENABLE PANIC CHANNELS EIR ;ENABLE THE PSUEDO-INTERRUPT SYSTEM >; END IF TOPS-20 IF TOPS-10,< MOVX T1,-1B15&<^-<1B0>> ;GET BITS 1-15 MOVEM T1,CHNMSK ;SET CHANNELS 1-15 AVAILABLE ; TIMER T1, ;GET A RANDOM NUMBER MOVEM T1,TMPFIL ;INIT TEMP FILE NUMBER ; ; READ FEUIC.TXT INTO UICTAB ; ; EACH LINE IN FEUIC.TXT IS FORMATTED AS FOLLOWS: ; ; [GRP,USR]=STR:[P,PN,SFD,SFD,...] ; ; WHERE: ; [GRP,USR] IS THE UIC TO BE DEFINED. ; STR: IS A FILE STRUCTURE NAME, ; IF "DSK:" THEN DSK SEARCH LIST IS USED, ; IF BLANK THEN ALL SYSTEM STRUCTURES ARE SEARCHED. ; [P,PN,SFD,SFD,...] IS THE DIRECTORY FOR THIS UIC. ; ; THE NUMBER OF UIC'S ALLOWED IS GOVERNED BY THE PARAMETER "UICNUM". ; ; SFD'S MAY BE SPECIFIED ONLY IF FTPATH IS ENABLED (NOT COMPLETELY CODED). ; ; COMMENTS MAY BE ENTERED IN THE FILE BY USING EITHER ";" OR "!". ; REDUIC: PUSH P,.JBFF ;SAVE .JBFF FOR NOW MOVNI P4,2 ;INIT LOOP FLAG MOVE P3,[IOWD UICTBL,UICTAB] ;POINT TO DIRECTORY TABLE REDIRT: AOJG P4,[WARN (,REDIRX,X)] MOVSI T2,'SYS' ;GET FIRST DEVICE SKIPL P4 ;FIRST TIME THROUGH? MOVSI T2,'DSK' ;NO-- TRY DISK MOVX T1,.IOASL ;ASCII, LINE MODE MOVX T3, ;POINT TO INPUT BEFFER HEADER ADDRESS OPEN T1 ;OPEN SYS OR DSK JRST REDIRT ;TRY THE OTHER DEVICE DMOVE T1,[SIXBIT /FEUIC/ SIXBIT /TXT/] SETZB T3,T4 ;SET TO LOOKUP FEUIC.TXT LOOKUP T1 ;FIND FILE JRST REDIRT ;TRY AGAIN REDIR3: MOVE P2,P3 ;SAVE THIS ADDRESS CALL REDCHR ;GET FIRST CHAR ON LINE JUMPL C,REDIRX ;EOF-- ALL DONE CAIN C,12 ;END-OF-LINE? JRST REDIR3 ;YES-- IGNORE BLANK LINES CAIE C,"[" ;LEGAL START DELIMITER? JRST REDERR ;NO PUSH P3,[EXP 0] ;STORE A ZERO TO BE FIXED LATER CALL REDOCT ;GET OCTAL USER GROUP CODE SKIPG P1,T1 ;SAVE THAT NUMBER JRST REDERR ;ZERO OR -VE IS NO GOOD CAIG T1,377 ;TOO BIG? CAIE C,"," ;RIGHT SEPERATOR? JRST REDERR ;NO CALL REDOCT ;GET USER NUMBER JUMPLE T1,REDERR ;0, -VE N.G. CAIG T1,377 ;SMALL ENOUGH? CAIE C,"]" ;RIGHT SEPERATOR? JRST REDERR ;NO LSH P1,^D8 ;SHIFT GROUP TO HIGH BYTE IOR T1,P1 ;MUSH IT ALL TOGETHER PUSH P3,T1 ;STORE THE UIC ; CALL REDCHR ;GET NEXT CHAR CAIE C,"=" ;PROPER SEP? JRST REDERR ;NO CALL REDSIX ;GET SIXBIT STR NAME CAMN T1,[SIXBIT/DSK/] ;IS IT "DSK"? MOVEI T1,1 ;YES-- SPECIAL FLAG PUSH P3,T1 ;SAVE THE STR NAME JUMPE T1,REDIR4 ;IF NO STR NAME, THEN USE ALL: CAIE C,":" ;PROPER DEVICE TERMINATOR? JRST REDERR ;NO CALL REDCHR ;GET NEXT CHAR REDIR4: CAIE C,"[" ;PROPER START? JRST REDERR ;NO PUSH P3,[EXP 0] ;SCAN SWITCH= 0 CALL REDOCT ;GET PROJECT # SKIPG P1,T1 ;SAVE IT JRST REDERR ; . . . CAIG P1,777777 ;SIZE OK? CAIE C,"," ;SEPARATOR OK? JRST REDERR ;NO CALL REDOCT ;GET PROG # JUMPLE T1,REDERR ;OOPS CAILE P1,777777 ;OK? JRST REDERR ;NO HRL T1,P1 ;MUSH IN PROJ # PUSH P3,T1 ;SAVE P,PN REDIR5: IFE FTPATH,< CAIE C,"]" ;END-OF-LINE? JRST REDERR ;NO DICE . . . >; END IFE FTPATH IFN FTPATH,< CAIN C,"]" ;END-OF-LINE? JRST REDNXT ;YES-- GET NEXT LINE CAIE C,"," ;GOOD SEPERATOR? JRST REDERR ;NO CALL REDSIX ;GET SFD NAME JUMPE T1,REDERR ;NO NAME IS NO GOOD PUSH P3,T1 ;SAVE THE NAME JRST REDIR5 ;BACK FOR MORE >; END IFN FTPATH ; REDNXT: CALL REDCHR ;GET NEXT CHARACTER CAIE C,12 ;MUST BE END-OF-LINE JRST REDERR ;NO DICE PUSH P3,[EXP 0] ;TERMINATE THE LIST MOVE T1,P2 ;GET INITIAL ADDRESS SUBM P3,T1 ;FIND LENGTH OF THIS ENTRY HRRZM T1,1(P2) ;STORE LENGTH BACK AT START OF ENTRY JRST REDIR3 ;GO BACK FOR ANOTHER LINE ; REDERR: WARN ,,X MOVE P3,P2 ;RESTORE ADDRESS POINTER REDER1: CALL REDEAT ;EAT THIS LINE JRST REDIR3 ;TRY FOR NEXT LINE ; REDOCT: MOVX T1,0 ;START OUT EMPTY REDOC1: CALL REDCHR ;GET CHARACTER CAIL C,"0" ;OC- CAILE C,"7" ; TAL? RETURN ;NO-- ALL DONE ASH T1,^D3 ;MULTIPLY BY ^O10 ADDI T1,-"0"(C) ;ADD IN CURRENT DIGIT JRST REDOC1 ;BACK FOR MORE ; REDSIX: SETZ T1, ;RESET THE VALUE MOVE T2,[POINT 6,T1] ;POINT TO INPUT REDSX1: CALL REDCHR ;GET A CHARACTER CAIL C,"A" ;ALPHA- CAILE C,"Z" ; BETIC? JRST [ CAIL C,"0" ;NO-- NUM- CAILE C,"9" ; ERIC? RETURN ;NO-- GIVE UP JRST .+1] ;YES-- USE NUMBER SUBI C," "-' ' ;CONVERT TO SIXBIT TRNN T1,77 ;LAST CHARACTER IN ALREADY? IDPB C,T2 ;NO-- STORE THIS ONE JRST REDSX1 ;BACK FOR SOME MORE SX ; REDCHR: SOSGE SCRBUF+2 ;DECREMENT BYTE COUNT JRST [ IN ;EXHAUSTED-- GET ANOTHER BUFFER JRST REDCHR ;OK-- TRY AGAIN MOVX C,-1 ;EOF OR ERROR-- MARK EOF RETURN] ;AND BACK TO CALLER ILDB C,SCRBUF+1 ;GET NEXT CHARACTER CAIE C,0 ;NULL? CAIN C,15 ;? JRST REDCHR ;YES-- IGNORE CAIE C," " ;IGNORE SPACES CAIN C," " ; AND TABS JRST REDCHR ; . . . CAIE C,"!" ;COMMENT? CAIN C,";" ; ?? CALLR REDEAT ;YES-- EAT IT CAIL C,"@"+40 ;LOWER CASE? SUBI C,40 ;YES-- CONVERT TO UPPER RETURN ;AND DONE WITH REDCHR ; REDEAT: CALL REDCHR ;GET ANOTHER CHARACTER CAIL C,0 ;EOF?? CAIN C,12 ;? RETURN ;YES-- RETURN NOW JRST REDEAT ;NO-- KEEP ON EATING ; REDIRX: PUSH P3,[EXP 0] ;TERMINATE THE TABLE RELEASE ;FINISH OFF I/O CHANNEL 0 POP P,.JBFF ;RESTORE .JBFF >; END IF TOPS-10 ; IFN FTDB,< ; ; SEE IF THERE IS REALLY A FILES-11 AREA ON THIS SYSTEM, AND WHERE IT IS ; REDHM1: MOVEI T1,1 ;START WITH BLOCK #1 REDHM2: MOVEI T2,1K ;A BLOCK'S WORTH OF BYTES MOVE T4,T1 ;SAVE THAT BLOCK CALL DSKIN ;READ THE HOM BLOCK JRST REDHM5 ;OOPS-- LET'S TRY AANOTHER ONE MOVE T1,SCRBUF+HOMNAM ;GET THE NAME OF THIS BLOCK CAME T1,[SIXBIT/HOM/] ;MATCH A HOM BLOCK'S NAME? JRST REDHM5 ;NO, SORRY MOVE T1,SCRBUF+HOMSNM ;GET THE STRUCTURE NAME CAME T1,[SIXBIT/PS/] ;IS THIS THE PUBLIC STRUCTURE? JRST REDHM7 ;NO-- CAN'T HAVE THE F-E-F-S HLRZ P1,SCRBUF+HOMFE0 ;GET FIRST -11 WORD OF FE INFO (HIGH ADDR) TXZN P1,BIT15 ;THIS THE RIGHT PLACE? JRST REDHM6 ;NO-- LOOK FOR ANOTHER PACK LSH P1,^D16 ;YES-- SHIFT TO HIGH WORD HRRZ T1,SCRBUF+HOMFE0 ;GET THE LOW ADDR IOR P1,T1 ;MUSH TOGETHER AS WHOLE DISK ADDRESS HLRZ P2,SCRBUF+HOMFE1 ;NOW GET THE SIZE, HIGH PART LSH P2,^D16 ;SHIFT IT UP TO THE RIGHT AREA HRRZ T1,SCRBUF+HOMFE1 ;LOW PART, TOO IOR P2,T1 ;BOTH TOGETHER, SIZE OF AREA IN P2 JRST FNFEFS ;NOW TO FIND THE FILE ITSELF ; REDHM5: WARN ,,X MOVEI T1,^D10 ;TRY NEXT HOM BLOCK, IF THAT ONE BAD SOJE T4,REDHM2 ; AND IF THAT WAS HOM BLOCK 1 JRST FEWAIT ;ELSE WE HAVE NO F-E-F-S ; REDHM6: MOVE T1,SCRBUF+HOMLUN ;GET THE LUN WITHIN PS OF THIS UNIT HLRZ T2,T1 ; AND THE TOTAL UNITS IN THIS STRUCTURE CAIG T2,(T1) ;THIS LAST (OR WORSE) UNIT IN PS? WARN ,FEWAIT ; REDHM7: MOVE T1,SCRBUF+HOMSIZ ;ON TO NEXT UNIT-- GET THE SIZE OF THIS UNIT ADDM T1,DSKOFS ; AND BUMP THE OVERALL DISK ADDRESS JUMPG T1,REDHM1 ;OK-- BACK TO READ NEXT UNIT WARN ,FEWAIT,X ; ; ALSO GET A JFN FOR THE FRONT-END-FILE-SYSTEM ; FNFEFS: MOVX T1,GJ%OLD!GJ%SHT ;1/ OLD FILE, SHORT GTJFN HRROI T2,[ASCIZ/FRONT-END-FILE-SYSTEM.BIN/] GTJFN ;ASSIGN JFN TO THE FILE SYSTEM JRST [JSERR WARN (<FRONT-END-FILE-SYSTEM.BIN NOT AVAILABLE>,FEWAIT,X)] MOVEM T1,FSJFN ;SAVE THE JFN ; MOVX T2,OF%RD!OF%WR ;2/ READ, WRITE ACCESS OPENF ;OPEN THE FILE-SYSTEM JRST [JSERR WARN (<FRONT-END-FILE-SYSTEM.BIN NOT AVAILABLE>,FEWAIT,X)] MOVEM P1,FEADDR ;SAVE THE FOUND ADDRESS OF THE AREA MOVEM P2,FESIZE ;SAVE THE SIZE OF THE AREA ; >; END IFN FTDB SUBTTL WAIT FOR SOMETHING FROM THE -11 TO DO ; ; HERE WHEN WE ARE DONE WITH A REQUEST ; ; WAIT FOR A REQUEST FROM THE -11, OR AN IPCF INTERRUPT FROM THE -20 ; FEWAIT: MOVE P,[IOWD PDLEN,PDL] ;RESET STACK SETZ F, ;RESET ALL FLAGS MOVEI HDR,HEADER ;POINT TO THE INPUT BUFFER FOR THE NEXT HEADER MOVE T2,HDR ; ALSO FOR FEIN MOVEI T3,HDRLEN ;READ 12 BYTES OF HEADER CALL FEIN ;WAIT FOR IT ; ; WE HAVE AN -11 REQUEST-- PROCESS IT ; TXO F,F.PROC ;WE HAVE GOT SOMETHING-- NO IPCF NOW LOAD T1,HDRSZ; ;GET WORDS TO READ MOVNM T1,BLKSIZ ;SAVE THAT, IN CASE OF FAILURE OF FUNCTION LOAD T1,HDRFN; ;GET THE FUNCTION TXNE T1,BIT15 ;-VE FUNCTION (RESPONSE)? JRST FEPRSP ;YES-- PROCESS THAT MOVN T2,T1 ;NO-- MAKE THIS FUNCTION STOR T2,HDRFN; ; INTO A RESPONSE ; LOAD T2,HDRDV; ;GET THE DEVICE CODE IFN FTDB,< CAIN T2, ;IS THIS DB (RP04)? JRST DBPROC ;YES-- PROCESS REQUEST >; END IFN FTDB CAIN T2, ;IS THIS FE (TOPS-20 FILE REWUEST)? JRST FEPROC ;YES-- CHECK IT OUT WARN ,START,X ; IF TOPS-20,< ; ; HERE ON I/O ERROR PSI ; IOERR: TXZN F,F.PROC ;DOING A REQUEST? JRST ILLTRP ;NO-- WE ARE SICK MOVEI T1,RETXXX ;YES-- SEND IT BACK MOVEM T1,CHN1PC ; . . MOVEI T1,IE.ABO ; WITH OUR LOVE, OF COURSE DEBRK ;RETURN THE ERROR >; END IF TOPS-20 SUBTTL PROCESS FUNCTION RESPONSE FROM -11 ; ; HERE WITH RESPONSE FUNCTION CODE FOR A FUNCTION WE REQUESTED ; FEPRSP: WARN ,START,X SUBTTL PROCESS REQUEST FOR "DB" -- RP04 ; IFN FTDB,< ; ; REQUESTS FOR PR04 ARE TAKEN HERE ; ; FUNCTIONS ACCEPTED: ; IO.RLB ; IO.WLB ; DBPROC: LSH T1,-^D8 ;GET HIGH FUNCTION CODE CAIN T1,IO.RLB_-^D8 ;THIS READ LOGICAL? JRST DBPRLB ;YES-- DO READ CAIE T1,IO.WLB_-^D8 ;WRITE LOGICAL? RETERR IE.IFC TXO F,F.WRIT ;YES-- SAY TO WRITE ; DBPRLB: LOAD T1,HDRP1; ;GET PARAMETER 1 LSH T1,^D16 ;MOVE TO HIGH PART OF BLOCK # LOAD T2,HDRP2; ;GET LOW PART FROM SECOND PARAMETER IORB T1,T2 ;GET BLOCK # TO BOTH T1 AND T2 SUB T1,FEADDR ;COMPUTE RELATIVE BLOCK IN F-E-F-S FILE JUMPL T1,DBPRL1 ;BELOW START-- SEE IF HOM BLOCKS LOAD T3,HDRSZ; ;GET SIZE OF REQUESTED READ/WRITE ADDI T3,1K-1 ;ROUND UP ASH T3,-^D9 ; TO NEXT BLOCK (OF BYTES) ADD T3,T1 ;ADD CURRENT LENGTH IN BLOCKS CAML T1,FESIZE ;WITHIN RANGE? RETERR IE.BLK IDIVI T1,4 ;CONVERT RELATIVE BLOCK TO PAGE IN FILE MOVE T4,T2 ;SAVE THE OFFSET WITHIN THE PAGE ADDI T3,4-1 ;ROUND UP LAST BLOCK ASH T3,-2 ; TO NEXT PAGE SUB T3,T1 ;COMPUTE LENGTH OF AREA TO BE TRANSFERRED IN PAGES CAMN T1,CFSPAG ;IS THIS PAGE SAME AS LAST ONE? CAMLE T3,CFSSIZ ; AND WITHIN LAST RANGE? SKIPA ;NO-- MUST DO ANOTHER PMAP JRST DBPRW1 ;YES-- PMAP ALREADY DONE MOVEM T1,CFSPAG ;SAVE THIS PAGE MOVEM T3,CFSSIZ ; AND LENGTH IN PAGES HRL T1,FSJFN ;MAKE HANDLE TO THE F-E-F-S FILE MOVE T2,[XWD .FHSLF,FEFBUF/1K] ;MAKE DEST. HANDLE TO OUR BUFFER TXO T3,PM%RD!PM%WT!PM%CNT ;READ, WRITE, ITERATION COUNT OF PAGES IN B17-35 PMAP ;MAP THE CURRENT SEGMENT OF THE F-E-F-S FILE TO BUFFER ; ; THE DESIRED SEGMENT OF THE FILE HAS BEEN MAPPED TO FEFBUF ; DBPRW1: MOVE T2,T4 ;COPY THE OFFSET IN BLOCKS FROM THE BEGGINGING OF THE PAGE ASH T2,^D7 ;CONVERT IN TO A WORD (-20) ADDRESS ADDI T2,FEFBUF ; WITHIN THE BUFFER LOAD T3,HDRSZ; ;GET # BYTES TO BE TRANSFERRED TXNN F,F.WRIT ;IS THIS A WRITE REQUEST? JRST DBPRL2 ;NO-- GO DO A READ ; ; WRITE REQUEST ; CALL FEIN ;INPUT ALL THE DATA TO BE WRITTEN MOVE T1,CFSPAG ;GET CURRENT PAGE # HRL T1,FSJFN ; IN F-E-F-S FILE MOVE T2,CFSSIZ ;AND SIZE OF MAPPED AREA UFPGS ;UPDATE FILE PAGES RETERR IE.VER JRST DBPRL4 ;FINISH WRITE REQUEST ; ; READ BLOCK NOT IN FILE SYSTEM-- MUST BE LESS THAN 10. (HOM BLOCKS) ; DBPRL1: SKIPN FESIZE ;IS THERE A FILE SYSTEM??? RETERR IE.BLK ;NO-- SORRY, CAN'T READ THAT BLOCK TXNE F,F.WRIT ;WRITING?? JRST DBPRL3 ;YES-- ONLY BLOCK 0 (BOOT) MOVE T1,T2 ;GET THE BLOCK # LOAD T2,HDRSZ; ; AND LENGTH TO TRANSFER CALL DSKIN ;READ THE BLOCK RETERR IE.VER ;OOPS LOAD T3,HDRSZ; ;GET THE SIZE BACK TO TRANSFER MOVEI T2,SCRBUF ;WHERE THE BLOCK IS AT ; ; READ DATA BACK TO THE FE DEVICE ; DBPRL2: HRLZ T1,T3 ;WITH PROPER # BYTES TRANSFERRED JRST DBPRL5 ;FINISH REQUEST ; ; WRITE REQUEST OUT OF -11 AREA-- ONLY BOOT BLOCK 0 ALLOWED ; DBPRL3: LOAD T3,HDRSZ; ;GET THE SIZE OF REQUESTED TRANSFER CAIN T2,0 ;THIS TO BLOCK 0? CAILE T3,1K ; AND LESS THAN ONE BLOCK? RETERR IE.VER MOVEI T2,SCRBUF ;POINT TO DISK BUFFER CALL FEIN ;READ IT IN SETZ T1, ;SET TO BLOCK 0 ONLY LOAD T2,HDRSZ; ; AND THE TRANSFER SIZE CALL DSKOUT ;WRITE THAT BLOCK (0) RETERR IE.VER ; ; FINISH WRITE REQUEST ; DBPRL4: LOAD T1,HDRSZ; ;GET REQUESTED SIZE, IN BYTES MOVS T1,T1 ;SET AS PARAMETER #2 SETZ T3, ;NO BYTES ; ; FINISH REQUEST ; DBPRL5: HRRI T1,IS.SUC ;SAY SUCCESS AS PARAMETER #1 CALL FEHDR ;SEND THAT HEADER JRST FEWAIT ;BACK FOR ANOTHER ; >; END IFN FTDB SUBTTL PROCESS REQUEST FOR FILE CONTROL ; ; DEVICE REQUESTED IS FE-- PERFORM SPECIFIED FUNCTION ; FEPROC: CAIN T1,IO.FCP ;IS THIS FILE CONTROL FUNCTION? JRST T20FCP ;YES-- DO THE FILE-CONTROL PRIMITIVES RETERR IE.IFC,X ;NO-- ILLEGAL FUNCTION SUBTTL FE DEVICE I/O ROUTINES ; ; FEIN -- READ A BUFFER FROM THE FE DEVICE ; T2 -- ADDRESS OF BUFFER TO STORE DATA ; T3 -- LENGTH OF BUFFER IN 8 BIT BYTES ; ; T1,T2,T3,T4 USED ; FEIN: ADDM T3,BLKSIZ ;DECREMENT COUNT OF BYTES LEFT IN THIS PACKET IFE FTDTE.,< MOVE T1,FEJFN ;1/ JFN OF FE DEVICE HRLI T2,(POINT 18,) ;2/ INPUT STRING POINTER ADDI T3,1 ;3/ LENGTH OF STRING ASH T3,-1 ; IN 18 BIT BYTES MOVN T3,T3 ; -VE COUNT SIN ;READ THE BLOCK FROM THE FE DEVICE GTSTS ;CHECK OUT THE STATUS TXNN T2,GS%EOF ;END-OF-FILE? >; END IFE FTDTE. IFN FTDTE.,< ADDI T3,1 ;ROUND UP ASH T3,^D<18-1> ; TO WORDS IN LH HRR T3,T2 ;GET BUFFER ADDRESS MOVEI T1,.DTEIF ;INPUT FROM FE CALL DTEUUO ; . . . MOVEI T1,.DTEFG ;GET FE DEVICE STATUS CALL DTEUUO ; . . . TXNN T4,DT.EOF ;END-OF-FILE?? >; END IFN FTDTE. RETURN ;RETURN OK WARN ,START,X ; ; RETOK -- RETURN IS.SUC (SUCCESS) AND BACK TO WAITING ; RETOK: MOVEI T1,IS.SUC ;SUCCESS ; ; RETXXX -- RETURN ERROR CODE IN STATUS ; T1 -- ERROR CODE ; RETXXX: MOVN T3,BLKSIZ ;GET BYTES LEFT IN PACKET JUMPLE T3,RETXX1 ;OK IF ALL READ PUSH P,T1 ;SAVE THE CODE MOVEI T2,SCRBUF ;POINT TO RANDOM BUFFER CALL FEIN ;READ THE TRASH POP P,T1 ;RESTORE ERROR CODE ; RETXX1: SETZ T3, ;NO BUFFER CALL FEHDR ;OUTPUT THE HEADER JRST FEWAIT ;BACK TO WAITING ; ; FEHDR -- OUTPUT A BLOCK TO THE FE DEVICE, WHITH HEADER ; T1 -- RH: PARAMETER #1, LH: PARAMETER #2 ; T2 -- ADDRESS OF BUFFER ; T3 -- SIZE OF BUFFER IN 8 BIT BYTES ; HDR -- ADDRESS OF CURRENT HEADER ; ; T1,T2,T3,T4 USED ; FEHDR: PUSH P,T2 ;SAVE ADDR PUSH P,T3 ; AND SIZE STOR T1,HDRP1; ;STORE THE STATUS MOVS T1,T1 ;GET SECOND PARAM STOR T1,HDRP2; ; . . . STOR T3,HDRSZ; ;AND THE SIZE OF THE TRANSFER BLOCK MOVEI T2,HEADER ;POINT TO HEADER MOVEI T3,HDRLEN ;SET TO HEADER SIZE CALL FEOUT ;SEND IT POP P,T3 ;RESTORE POP P,T2 ; . . . JUMPE T3,CRET ;THAT'S IT IF NO DATA CALLRX FEOUT ;ELSE OUTPUT THE DATA BLOCK ; ; FEOUT -- OUTPUT A BLOCK TO THE FE DEVICE ; T2 -- ADDRESS OF BLOCVK ; T3 -- SIZE OF BLOCK IN 8 BIT BYTES ; ; USES T4,T2,T3,T1 ; FEOUT: IFE FTDTE.,< MOVE T1,FEJFN ;1/ JFN OF FE DEVICE HRLI T2,(POINT 18,) ;2/ 18-BIT BYTE POINTER TO SOURCE STRING ADDI T3,1 ;3/ SIZE OF STRING ASH T3,-1 ; IN 16 BIT BYTES MOVN T3,T3 ; -VE COUNT SOUT ;SEND TO FE DEVICE MOVX T2,.MOEOF ;PERFORM AN EOF FUNCTION MOVX T3,-1 ; BUT DON'T SEND EOF MTOPR ;SO AS TO FORCE OUT THE BUFFER RETURN ;RETURN FROM FEOUT >; END IFE FTDTE. IFN FTDTE.,< ADDI T3,1 ;ROUND UP ASH T3,^D<18-1> ; TO WORDS IN LH HRR T3,T2 ;GET BUFFER ADDRESS MOVEI T1,.DTEOF ;OUTPUT TO FE DEVICE CALLRX DTEUUO ;OUTPUT TO FE DEVICE AND RETURN FROM FEOUT ; ; DTEUUO -- PERFORM DTE. UUO FUNCTION ; T1 -- FUNCTION CODE ; T3 -- ADDITIONAL DATA ; RETURNS +1: ; T4 -- DATA FROM DTE. UUO ; DTEUUO: CALL DTESET ;SET UP REGISTERS DTE. T4, ;DO A DTE UUO CALLR DTEERR ;ERROR-- TYPE IT OUT RETURN ;OK-- RETURN FROM DTEUUO ; ; DTESET -- SET UP REGISTERS FOR DTE. UUO ; T1 -- DTE FUNCTION CODE ; RETURNS +1: ; T1 -- XWD 0,-1 ;CPU 0, PRIV DTE-20 ; T2 -- FE DEVICE # ; T4 -- XWD FUNC,T1 ; DTESET: MOVEM T1,DTEFNC ;SAVE THE FUNCTION CODE FOR ERROR TYPEOUT MOVS T4,T1 ;COPY FUNCTION CODE TO LH HRRI T4,T1 ;SET ADDRESS OF DTE FUNCTION BLOCK MOVX T1, ;CPU #, DTE # MOVE T2,FEDNUM ;GET FE DEVICE # RETURN ;FROM DTESET ; ; DTEERR -- REPORT DTE. UUO FAILURE ; DTEERR: OUTSTR [ASCIZ/% DTE. UUO FAILURE /] MOVE T1,T4 ;GET ERROR CODE CALL TYPOCT ;TYPE IT OUTSTR [ASCIZ/ FOR FUNCTION /] MOVE T1,DTEFNC ;GET SAVED CODE CALL TYPOCT ;TYPE IT EXIT 1, ;GIVE UP RETURN ;CONTINUE WILL GO ON . . . >; END IFN FTDTE. ; IFN FTDB,< ; ; DSKIN/DSKOUT -- READ/WRITE A PHYSICAL DISK BLOCK TO/FROM SCRBUF ; T1 -- BLOCK # ; T2 -- SIZE OF DATA IN 8 BIT BYTES ; ; USED T1,T3,T2 ; DSKOUT: ADDI T2,3 ;2/ SIZE OF BUFFER ASH T2,-2 ; IN WORDS TXO T2,DOP%WR ;DO A WRITE JRST DSKIO ;DO IT... ; DSKIN: ADDI T2,3 ;2/ SIZE OF BUFFER ASH T2,-2 ; IN WORDS ; DSKIO: TXO T1,DOP%SA ;1/ SOFTWARE DISK ADDRESS ADD T1,DSKOFS ;ADD IN OFFSET FOR THIS UNIT ADDI T2,200-1 ;2/ BUFFER SIZE IN WORDS TXZ T2,200-1 ; ROUNDED UP TO 200 WORDS MOVEI T3,SCRBUF ;3/ ADDRESS OF DATA BUFFER DSKOP ;PERFORM READ JUMPN T1,CRET ;ERROR-- RETURN +1 CALLRX CRET1 ;OK-- RETURN +2 ; >; END IFN FTDB ; CRET1: AOS (P) ;OK-- RETURN +2 CRET: RETURN ;RETURN FROM DSKIN SUBTTL TOPS-20 FILE CONTROL REQUEST ; ; HERE WITH REQUEST FOR FE DEVICE, FUNCTION IO.FCT (FILE CONTROL) ; T20FCP: LOAD T3,HDRSZ; ;GET THE REQUESTED SIZE OF DATA TO COME HERE MOVEI T2,SCRBUF ;POINT TO SCRACTH BUFFER CALL FEIN ;READ THEM BYTES LOAD T1,HDRP1; ;GET THE I/O FUNCTION CODE OF THE PRIMITIVE LSH T1,-^D8 ; BUT JUST THE MAJOR CODE CAIL T1,LOWFNC ;WITHIN RANGE? CAILE T1,HGHFNC ; FOR A FILE-CONTROL FUNCTION? ILLFNC: RETERR IE.IFC CALL @FCPDSP-LOWFNC(T1) ;CALL THE REQUESTED FUNCTION CODE ; ; HERE ON COMPLETION OF A FUNCTION ; T1 -- (LH) SECOND I/O STATUS WORD (RH) BYTE COUNT TO RETURN TO -11 ; FCPXIT: HRRZ T3,T1 ;COPY LENGTH OF RETURN BLOCK HRRI T1,IS.SUC ;SAY SUCCESS NOW MOVEI T2,SCRBUF ;RETURN DATA IN SCRBUF, ALSO CALL FEHDR ;SEND THE SUCCESS INFO TO THE -11 JRST FEWAIT ;THAT'S ALL FOLKS ; ; DISPATCH TABLE FOR FILE PRIMITIVES ; LOWFNC==11 ;LOWEST FUNCTION ALLOWED FCPDSP: EXP FCPFNA ;(11) FNA: FIND FILENAME IN DIRECTORY EXP ILLFNC ;(12) UNUSED EXP FCPRNA ;(13) RNA: REMOVE NAME FROM DIRECTORY EXP FCPENA ;(14) ENA: ENTER NAME IN DIRECTORY EXP FCPACR ;(15) ACR: ACCESS FOR READ EXP FCPACW ;(16) ACW: ACCESS FOR READ, WRITE EXP FCPACE ;(17) ACE: ACCESS FOR READ, WRITE, EXTEND EXP FCPDAC ;(20) DAC: DEACCESS FILE EXP FCPRVB ;(21) RVB: READ VIRTUAL BLOCK EXP FCPWVB ;(22) WVB: WRITE VIRTUAL BLOCK EXP FCPEXT ;(23) EXT: EXTEND FILE EXP FCPCRE ;(24) CRE: CREATE FILE EXP FCPDEL ;(25) DEL: DELETE FILE EXP FCPRAT ;(26) RAT: READ ATTRIBUTES EXP FCPWAT ;(27) WAT: WRITE ATTRIBUTES EXP FCPAPC ;(30) APC: ACP CONTROL HGHFNC==30 ; ; HERE TO RETURN NOTHING TO THE -11 ; FCPZX: TDZA T1,T1 ;SAY NOTHING ; ; HERE TO RETURN BYTE COUNT FROM P4 ; FCPP4X: HRRZ T1,P4 ;COPY BYTE COUNT RETURN ;RETURN SUCCESS SUBTTL FNA -- FIND FILE-NAME IN DIRECTORY ; ; FCPFNA: LOAD T2,N.DID; ;GET DIRECTORY ID CAME T2,[XWD 177777,177777] ;ID OF MFD? JRST FCPFNF ;NO-- LOOK FOR A FILE ; ; FIND DIRECTORY NAME ; MOVEI P4,UICTAB ;POINT TO TABLE OF DIRECTORIES ; LOAD T2,N.DOW; ;GET DIRECTORY OWNER LOAD T1,N.STAT; ;GET FLAGS FOR THIS FILE TXNE T1,NB.SNM ;WILD NAME? LOAD T2,N.NEXT; ;YES-- START LOOKING AT "NEXT" DIRECTORY IF TOPS-20,< CAIGE T2,340B<35-8> ;THIS UIC GREATER THAN [340,0]? JRST FCPFD1 ;NO-- SCAN THE TABLE MOVE T4,T2 ;COPY DIRECTORY UIC SUBI T2,340B<35-8> ;YES-- GET DIRECTORY NUMBER HRROI T1,FNMBLK ;SCRATCH AREA TO STORE NAME DIRST ;GET DIRECTORY NAME RETERR IE.NSF ;NO SUCH DIRECTORY JRST FCPFD3 ;STORE THE NAME >; END IF TOPS-20 ; FCPFD1: SKIPN T3,UICSIZ(P4) ;GET SIZE OF THIS BLOCK RETERR IE.NSF ;END OF LIST-- NOT FOUND CAMG T2,UICUIC(P4) ;UIC MATCH? JRST FCPFD2 ;YES-- GOT IT ADD P4,T3 ;NO-- BUMP TO NEXT ENTRY IN DIRECTORY TABLE JRST FCPFD1 ;LOOP FOR ALL UIC'S IN TABLE ; FCPFD2: MOVE T4,UICUIC(P4) ;GET DIRECTORY WE FOUND TXNE T1,NB.SNM ;WILD? JRST FCPFD3 ;YES-- OK CAME T2,T4 ;NO-- EXACT MATCH? RETERR IE.NSF ;NO-- NOT FOUND ; ; CONVERT DIRECTORY NAME TO RAD50 AS FILE NAME ; FCPFD3: IF TOPS-20,< MOVE T1,[POINT 7,FNMBLK] ;POINT TO SCRATCH TEXT AREA MOVX T3,NO%LFL!NO%ZRO+3B17+^D8B35 ;OCTAL, 3 COLUMNS LDB T2,[POINT 8,T4,35-8] ;GET HIGH BYTE NOUT ;MAKE IT TEXT RETERR IE.RER LDB T2,[POINT 8,T4,35-0] ;THEN LOW BYTE NOUT ;TEXT, ALSO RETERR IE.RER HRROI T2,[ASCIZ/.DIR.0/] ;MAKE IT A DIRECTORY SETZ T3, ;ASCIZ SOUT ;PUT IN STRING >; END IF TOPS-20 IF TOPS-10,< MOVEI FID,DMPBUF ;POINT TO SCRATCH AREA CALL CLRFNM ;RESET FILE-NAME BLOCK LDB T2,[POINT 8,T4,35-8] ;GET HIGH BYTE CALL OCTSIX ;CONVERT OCTAL TO SIXBIT HLLZM T3,FIDLEB+.RBNAM(FID) ;STORE AS FIRST THREE CHARS OF NAME LDB T2,[POINT 8,T4,35-0] ;THEN LOW BYTE CALL OCTSIX ;YOU TOO HLRM T3,FIDLEB+.RBNAM(FID) ; . . MOVX T1, ;DIRECTORY FILE TYPE MOVEM T1,FIDLEB+.RBEXT(FID) ; . . >; END IF TOPS-10 CALL PUTNAM ;PUT THE FOUND NAME IN THE FNB RETERR IE.RER ; MOVEI T1,1(T4) ;GET NEXT POSSIBLE DIRECTORY NUMBER STOR T1,N.NEXT; ;STORE THE DIRECTORY NUMBER FOR WILD HRLI T4,BIT15 ;MAKE IT A DIRECTORY FID STOR T4,N.FID; ;STORE IT IN THE FNB JRST FCPDRX ;RETURN THE NEW FNB ; ; FIND FILENAME ; FCPFNF: LOAD T1,N.NEXT; ;GET CONTEXT FOR WILD LOOKUP, IF ANY JUMPN T1,FCPFNW ;N.NEXT SPECIFIED-- DO A WILD CALL ALCFID ;GET A FILE-ID CALL GETNAM ;CONVERT RAD50 NAME TO TEXT STRING IF TOPS-20,< MOVX T1,GJ%OLD!GJ%SHT!GJ%IFG ;SET SHORT JFN, FILE MUST EXIST, INPUT FILE GROUP GTJFN ;GET THE JFN FOR THE FILE >; END IF TOPS-20 IF TOPS-10,< CALL LOOK ;LOOKUP WILD(?) FILE >; END IF TOPS-10 RETERR IE.NSF MOVEM T1,FIDJFN(FID) ;STORE JFN BACK IN FILE-ID BLOCK LOAD T1,N.DID; ;GET DIRECTORY ID MOVEM T1,FIDUIC(FID) ;STORE THE UIC FOR LATER JRST FCPFNN ;GET THE NAME ; ; WILD NAME FROM LAST TIME-- CHECK IT OUT ; FCPFNW: MOVE FID,T1 ;COPY THE SPECIFIED N.NEXT AS FILE-ID IMULI FID,FIDSIZ ;MAKE IT AN OFFSET ADDI FID,FIDTAB-FIDSIZ ; INTO FIDTAB CAIL FID,FIDTBE ;BEYOND END? RETERR IE.SNC ;YES-- BAD FILE-ID ; FCPFWN: MOVE T2,FIDFLG(FID) ;GET THE FLAGS TXNN T2,FI.ACC ;ACCESSED????? SKIPN T1,FIDJFN(FID) ;GET THE JFN RETERR IE.RER SETZM FIDFLG(FID) ;RESET THE FLAGS FOR THE NEW FILE AOS FIDFID(FID) ;GET NEW SEQUENCE # IF TOPS-20,< GNJFN ;GET NEXT FILE >; END IF TOPS-20 IF TOPS-10,< CALL WLOOKN ;LOOKUP NEXT FILE >; END IF TOPS-10 JRST [SETZM FIDJFN(FID) ;FAILED-- NO LONGER JFN'ED RETERR (IE.NSF,X)] ;SAY NO SUCH FILE CALL SETUCT ;NOTE THAT THIS FILE-ID HAS BEEN USED ; FCPFNN: IF TOPS-20,< HRRZ T2,FIDJFN(FID) ;GET THE JFN, ONLY HRROI T1,FNMBLK ;STRING POINTER TO THE NAME MOVX T3,1B8+1B11+1B14+1B35 ;FILE.EXT.VER JFNS ;CONVERT WHAT JFN WE HAVE TO A STRING >; END IF TOPS-20 CALL PUTNAM ;STORE THE FILE-NAME JRST FCPFWN ;TOO LONG-- LOOK AGAIN ; MOVE T1,FIDFID(FID) ;GET THE FILE-ID OF THIS FILE STOR T1,N.FID; ;STORE THE DOUBLE-WORD IN FNB HLRZ T1,T1 ;GET THE FILE-ID NUMBER STOR T1,N.NEXT; ; AND SAVE FOR NEXT FNA ; MOVE T1,[PNTR (N.FNM0)] ;POINT TO THE FNB TO STORE MOVE T2,[POINT 18,FIDNAM(FID)] ;ALSO TO BEFORE NAME TO SAVE IT CALL MOVNAM ;MOVE THE FILE-NAME ; MOVX P1,FI.ASC ;GET ASCII FILE BIT IF TOPS-20,< CALL GETFDB ;GET THE FDB FOR THIS FILE LDB T1,[POINT 6,FILFDB+.FBBYV,11] ;GET THE FILE'S BYTE SIZE CAIN T1,^D18 ;BINARY FILE FOR SURE? JRST FCPDRX ;YES-- ALL DONE CAIE T1,^D7 ;ASCII FILE FOR SURE? >; END IF TOPS-20 IF TOPS-10,< LDB T1,[POINT 4,FIDLEB+.RBPRV(FID),12] ;GET FILE MODE CAIN T1,.IOIMG ;IMAGE BINARY? JRST FCPDRX ;YES-- FILE IS BINARY FOR SURE CAILE T1,.IOASL ;MODE= 0 OR 1 (ASCII)? >; END IF TOPS-10 CALL CHKTYP ;NO-- SEE IF BINARY FILE TYPE IORM P1,FIDFLG(FID) ;NOT BINARY-- SET ASCII FLAG JRST FCPDRX ;RETURN FILE-NAME BLOCK TO -11 SUBTTL RNA, ENA -- REMOVE/ENTER NAME IN DIRECTORY ; ; FCPRNA: CALL FCPFNF ;FIND THE FILE TO REMOVE IF TOPS-10,< HRRZ T1,FIDJFN(FID) ;GET CHANNEL # CALL XCTUUP ;LOOKUP CURRENT FILE LOOKUP FIDLEB(FID) ; . . . RETERR IE.RER PUSH P,FID ;SAVE CURRENT FILE-ID MOVEI FID,DMPBUF ;POINT TO SCRATCH AREA >; END IF TOPS-10 CALL GETTMP ;GET A TEMP FILE TO RENAME THIS ONE TO JRST FCPERN ;DO THE RENAME ; ; FCPENA: CALL GETFID ;GET THE FILE-ID OF THE FILE BEING ENTERED MOVE T4,FIDFLG(FID) ;GET THE FLAGS FOR THIS FILE TXNE T4,FI.TMP ;THIS A TEMP FILE (MUST BE)? TXNE T4,FI.ACC ;FILE ACCESSED? RETERR IE.ALN IF TOPS-10,< HRRZ T1,FIDJFN(FID) ;GET CHANNEL # CALL XCTUUP ;LOOKUP TEMP FILE LOOKUP FIDLEB(FID) ; . . . RETERR IE.RER PUSH P,FID ;SAVE CURRENT FILE-ID MOVEI FID,DMPBUF ;POINT TO SCRATCH AREA >; END IF TOPS-10 CALL GETNAM ;GET THE NAME HE WANTS TO ENTER IT AS TXNE T1,FJ.WLD ;WILD *'S SEEN? RETERR IE.BAD IF TOPS-20,< MOVX T1,GJ%FOU!GJ%SHT!GJ%NEW ;NEXT VERSION, MUST BE NEW FILE, SHORT CALL GTJFN ;GET A JFN FOR IT IN T1 RETERR IE.DUP >; END IF TOPS-20 ; ; T1 = FILE-NAME TO BE, FID POINTS TO FILE-ID BLOCK OF EXISTING FILE ; FCPERN: IF TOPS-20,< HRRZ T2,T1 ;COPY FINAL JFN HRRZ T1,FIDJFN(FID) ;GET THE EXISTING JFN RNAMF ;RENAME THE FILE RETERR IE.RER HRRZM T2,FIDJFN(FID) ;STORE THE NEW JFN >; END IF TOPS-20 IF TOPS-10,< POP P,T2 ;GET FID FOR EXISTING FILE EXCH T2,FID ;T2= FID AREA FOR NEW FILE, FID= OLD FILE HRRZ T1,FIDJFN(FID) ;GET CHANNEL # CALL XCTUUP RENAME FIDLEB(T2) ;RENAME TO/FROM TEMP FILE RETERR IE.DUP HRLZI T1,FIDLEB(T2) ;SUCCESS-- SET NEW FILE-NAME HRRI T1,FIDLEB(FID) ; INTO OLD FID BLOCK BLT T1,FIDLEB+.RBALC(FID) ; . . . >; END IF TOPS-10 MOVX T1,FI.TMP ;GET TEMP FILE BIT XORM T1,FIDFLG(FID) ;SET/CLEAR IT SETZRO N.NEXT; ;NO WILD CARDS ALLOWED ; JRST FCPDRX ;RETURN THE NEW FILE-NAME BLOCK ; ; ALL DONE. RETURN FILE-NAME BLOCK ; FCPDRX: MOVEI T1,S.DRFN ;RETURN WHOLE BLOCK RETURN ;FROM DIRECTORY OPERATION SUBTTL ACR, ACW, ACE -- ACCESS FILE ; ; FCPACE: FCPACW: TXO F,F.WRIT ;NOTE WRITE ACCESS FCPACR: CALL FCPRAT ;READ THE ATTRIBUTES, IF ANY ; HRRZ T1,FIDJFN(FID) ;GET CHANNEL # MOVE T4,FIDFLG(FID) ;GET THE FLAGS TXNE T4,FI.ACC ;ALREADY ACCESSED? RETERR IE.ALN TXO T4,FI.ACC!FI.WRT ;ASSUME SUCCESS FLAGS IF TOPS-20,< MOVX T2,OF%RD+^D7B5 ;ASSUME READ, ASCII TXNN T4,FI.ASC ;ASCII FILE? MOVX T2,OF%RD+^D18B5 ;NO-- USE 18 BIT BYTES, -11 STYLE TXNE F,F.WRIT ;WRITE ACCESS? TXOA T2,OF%WR ;YES-- SAY SO TXZ T4,FI.WRT ;NO-- MARK NOT WRITE ACCESS OPENF ;OPEN THE FILE RETERR IE.RER ;OOPS >; END IF TOPS-20 IF TOPS-10,< CALL XCTUUP ;LOOKUP FILE . . LOOKUP FIDLEB(FID) ; . . . RETERR IE.RER TXNN F,F.WRIT ;WRITE ACCESS REQUESTED? JRST FCPAC1 ;NO-- DON'T ALLOW IT CALL XCTUUP ;IN UPDATE MODE, ENTER FIDLEB(FID) ;ATTEMPT TO ENTER THE FILE RETERR IE.WER JRST FCPAC2 ; FCPAC1: TXZ T4,FI.WRT ;NO-- DON'T ALLOW IT FCPAC2: >; END IF TOPS-10 SETZM FIDFBP(FID) ;RESET FILE BYTE POINTER MOVEM T4,FIDFLG(FID) ;SET THE NEW ACCESS BITS JRST FCPP4X ;RETURN THE ATTRIBUTE BLOCK FROM ACCESS SUBTTL DAC -- DEACCESS FILE ; ; FCPDAC: CALL FCPWAT ;WRITE THE FILE ATTRIBUTES MOVE P1,FIDFLG(FID) ;GET THE FLAGS FOR THIS FILE TXNN P1,FI.ACC ;FILE ACCESSED? RETERR IE.NLN ;NO-- CAN'T DEACCESS IT MOVX T1,FI.WRT!FI.ACC ;CLEAR THE OPEN BITS ANDCAM T1,FIDFLG(FID) ; FOR THIS FILE IF TOPS-20,< HRRZ T1,FIDJFN(FID) ;GET THE JFN FOR THE FILE TXO T1,1B0 ;DON'T RELEASE THE JFN CLOSF ;CLOSE THE FILE RETERR IE.WER ;OOPS >; END IF TOPS-20 TXNN P1,FI.WRT ;ACCESSED FOR WRITE? JRST FCPDA9 ;NO-- DON'T SET EOF ; ; ACCESSED FOR WRITE-- MUST UPDATE EOF IF SPECIFIED ; LOAD T1,H.HEFB; ;GET HIGH PART EOF BLOCK # LSH T1,^D16 ;INTO HIGH WORD LOAD T2,H.LEFB; ;ALSO LOW PART IOR T2,T1 ;GET EOF BLOCK # INTO T2 SOJL T2,FCPZX ;START VBN'S AT 1-- SKIP IF NO EOF SPECIFIED ASH T2,^D9 ;CONVERT VBN TO BYTES LOAD T3,H.FFBY; ;GET FIRST FREE BYTE IN THAT LAST BLOCK ADDB T3,T2 ;EOF BYTE NOW IN T3 AND T2 HRRZ T1,FIDJFN(FID) ;GET JFN OF THE FILE IF TOPS-20,< TXNE P1,FI.ASC ;ASCII FILE? JRST FCPDA3 ;YES-- BYTE COUNT IS OK ADDI T3,1 ;NO-- ROUND UP ASH T3,-1 ; TO WORDS ; FCPDA3: HRLI T1,.FBSIZ ;SET TO CHANGE SIZE IN BYTES MOVX T2,-1 ;WHOLE WORD TO CHANGE CHFDB ;CHANGE THE EOF BYTE POINTER >; END IF TOPS-20 IF TOPS-10,< MOVEI T4,^D4 ;ASSUME BINARY TXNE P1,FI.ASC ;ASCII FILE? MOVEI T4,^D5 ;YES-- FIVE BYTES/WORDS ADDI T2,-1(T4) ;ROUND UP IDIV T2,T4 ; TO WORDS IDIVI T2,200 ;FULL BLOCKS TO T2, EXTRA WORDS TO T3 JUMPE T3,FCPDA3 ;SKIP INPUT IF NO EXTRA WORDS MOVN T3,T3 ;GET -VE WORDS EXTRA HRLZ T3,T3 ;FORM HRRI T3,DMPBUF-1 ; IOWD TO DMPBUF MOVX T4,0 ;END I/O LIST CALL XCTUUO USETI 1(T2) ;SET TO INPUT LAST PARTIAL BLOCK CALL XCTUUO IN T3 ;INPUT LAST BLOCK SKIPA ;OK-- GO ON RETERR IE.RER FCPDA3: ADDI T2,2 ;COUNT THE RIBS MOVEM T2,FIDLEB+.RBALC(FID) ;STORE # FULL BLOCKS TO TRUNCATE TO SUBI T2,2 ;BACK TO REAL SIZE CALL XCTUUP RENAME FIDLEB(FID) ;TRUNCATE AND CLOSE FILE RETERR IE.WER JUMPLE T2,FCPDA4 ;WRITING FROM BEGINNING OF FILE-- SUPERCEDE JUMPE T3,FCPZX ;ALL DONE IF NO EXTRA WORDS CALL XCTUUP LOOKUP FIDLEB(FID) ;RE-LOOKUP FILE RETERR IE.RER FCPDA4: CALL XCTUUP ENTER FIDLEB(FID) ;RE-ENABLE UPDATE MODE RETERR IE.WER JUMPE T3,FCPDA9 ;DONE IF NO WORDS TO WRITE CALL XCTUUO USETO 1(T2) ;SET OUTPUT TO LAST BLOCK (NOW NON-EX) CALL XCTUUO OUT T3 ;OUTPUT EXTRA WORDS IN LAST BLOCK SKIPA RETERR IE.WER >; END IF TOPS-10 FCPDA9: IF TOPS-10,< CALL CLOSEF ;CLOSE FILE RETERR IE.WER ;OOPS >; END IF TOPS-10 JRST FCPZX ;DONE WITH DAC SUBTTL EXT, CRE, DEL -- EXTEND/CREATE/DELETE FILE ; ; FCPEXT: CALL GETFID ;CHECK OUT THE FILE-ID MOVSI T1,4 ;SET EXTEND SIZE TO 4 BLOCKS (I/O STATUS WORD 2) RETURN ;FROM FCPEXT ; ; FCPCRE: CALL ALCFID ;ALLOCATE A FILE-ID FOR THE FILE CALL GETTMP ;GET A TEMPORARY JFN IF TOPS-10,< CALL GETCHN ;GET A FREE CHANNEL RETERR IE.NOD MOVX T2,.IODMP ;DUMP MODE MOVX T3, ; FOR DEVICE DSK: MOVX T4,0 ;NO BUFFERS CALL XCTUUO OPEN T2 ;OPEN DEVICE NOW JRST FCPCRF ;OOPS!! >; END IF TOPS-10 MOVEM T1,FIDJFN(FID) ;STORE THE TEMP JFN MOVE T1,FIDFID(FID) ;GET THE FILE-ID STOR T1,FILID; ;SAVE TO RETURN TO THE -11 CALL FCPWAT ;WRITE ATTRIBUTES, IF ANY TO SET UP HEADER MOVE T1,[PNTR (I.FNM0)] ;POINT TO FILE-NAME FROM HEADER MOVE T2,[POINT 18,FIDNAM(FID)] ;POINT TO FILE-ID BLOCK TOO CALL MOVNAM ;MOVE THE NAME, 5 WORDS MOVX P1,FI.TMP ;GET TEMP FILE BIT FOR NOW LOAD T1,H.RTYP; ;GET RECORD TYPE BYTE TXNE T1,2 ;VARIABLE RECORD LENGTH (I.E. FORMATTED FILE)? JRST FCPCR1 ;YES-- MUST BE BINARY FILE CALL CHKTYP ;SEE IF BINARY FILE TYPE TXO P1,FI.ASC ;NO-- MUST BE AN ASCII FILE FCPCR1: IORM P1,FIDFLG(FID) ;SET THE FLAGS HRRZ T1,FIDJFN(FID) ;GET THE JFN TO OPEN IF TOPS-20,< MOVX T2,OF%RD!OF%WR ;OPEN FOR READ/WRITE OPENF ;OPEN THE FILE JRST FCPCRF ;FAILED-- RELEASE AND COMPLAIN TXO T1,1B0 ;DON'T RELEASE THE CLOSED JFN CLOSF ;CLOSE THE FILE TO CREATE IT >; END IF TOPS-20 IF TOPS-10,< CALL XCTUUP ENTER FIDLEB(FID) ;ATTEMPT TO WRITE SUCH FILE JRST FCPCRF CALL CLOSEF ;CLOSE FILE >; END IF TOPS-10 JRST FCPCRF ;FAILED-- RELEASE JFN MOVEI T1,4 ;OK-- SET TO RETURN THE FILE-ID RETURN ;RETURN THE FILE-ID FROM CREATE ; FCPCRF: HRRZ T1,FIDJFN(FID) ;GET THE JFN BACK SETZM FIDJFN(FID) ;NO LONGER A VALID FILE-ID IF TOPS-20,< RLJFN ;RELEASE THE JFN JFCL ;OOPS >; END IF TOPS-20 IF TOPS-10,< CALL RELCHN ;RELEASE CHANNEL >; END IF TOPS-10 RETERR IE.IFU,X ; ; FCPDEL: CALL GETFID ;GET THE FILE-ID OF THE THING HE WANTS US TO DELETE LOAD T1,FILP1; ;GET EXTEND WORD TXNE T1,BIT15 ;ENABLED (FOR TRUNCATE)? JRST FCPZX ;YES-- DO NOTHING FOR TRUNCATE HRRZ T1,FIDJFN(FID) ;GET THE JFN OF THE FILE TO DELETE IF TOPS-20,< DELF ;DELETE THE FILE >; END IF TOPS-20 IF TOPS-10,< CALL XCTUUP LOOKUP FIDLEB(FID) ;LOOKUP THE FILE RETERR IE.RER SETZB T2,T3 ;RENAME TO ZERO= DELETE CALL XCTUUO RENAME T2 ;ZAP!! >; END IF TOPS-10 RETERR IE.WER ;OOPS! SETZM FIDJFN(FID) ;NO LONGER JFN'D IF TOPS-10,< CALL RELCHN ;RELEASE CHANNEL >; END IF TOPS-10 JRST FCPZX ;RETURN HAPPY FROM DELETE SUBTTL RVB, WVB -- READ/WRITE VIRTUAL BLOCK ; ; FCPWVB: TXO F,F.WRIT ;NOTE WRITING FCPRVB: CALL GETFID ;GET THE SPECIFIED FILE-ID MOVE T4,FIDFLG(FID) ;GET THE FLAGS FOR THE FILE TXNN T4,FI.ACC ;FILE OPEN? RETERR IE.NLN TXNN F,F.WRIT ;WRITING? JRST FCPRW1 ;NO-- GO ON TXNN T4,FI.WRT ;ACCESSED FOR WRITE? RETERR IE.WAC ; FCPRW1: HRRZ T1,FIDJFN(FID) ;GET THE JFN LOAD P2,RWVBH; ;GET THE HIGH VBN LSH P2,^D16 ;SHIFT TO HIGH WORD LOAD T3,RWVBL; ;GET LOW VBN IOR P2,T3 ;MUSH IT TOGETHER SOJGE P2,FCPRW2 ;VIRTUAL BLOCKS START AT 1 RETERR IE.BLK,X ; FCPRW2: ; IF TOPS-20,< ASH P2,^D9 ;CONVERT IT TO A BYTE OFFSET TXNN T4,FI.ASC ;THIS 7-BIT ASCII? ASH P2,-1 ;NO-- MAKE IT A WORD OFFSET CAMN P2,FIDFBP(FID) ;ARE WE SET TO THE RIGHT POINT IN THE FILE? JRST FCPRW3 ;YES-- GO ON SFPTR ;NO-- SET THE POINTER RETERR IE.RER ; FCPRW3: LOAD P4,RWVSZ; ;GET THE BYTE SIZE REQUESTED MOVE T3,P4 ;COPY THE COUNT TXNE T4,FI.ASC ;7-BIT ASCII? JRST FCPRWA ;YES-- PROCESS THAT ; ADDI T3,1 ;ROUND UP ASH T3,-1 ; SIZE TO WORDS ADD P2,T3 ;COMPUTE WHERE POINTER WILL BE MOVEM P2,FIDFBP(FID) ;SAVE THAT AS CURRENT POINTER MOVN T3,T3 ;-VE BYTE COUNT: NOT ZERO TERMINATED STRING TXNE F,F.WRIT ;THIS WRITE? JRST FCPRW5 ;YES-- DO THAT ; MOVE T2,[POINT 18,SCRBUF] ;NO-- POINT TO READ DATA AREA CALL SINCLR ;INPUT THE DATA REQUESTED JRST FCPP4X ;RETURN, BYTE COUNT IN P4 ; FCPRW5: MOVE T2,[PNTR (RWVDW0)] ;POINT TO DATA WORDS SOUT ;WRITE THEM WORDS JRST FCPZX ;RETURN NOTHING FROM FCPWVB ; FCPRWA: ADD P2,T3 ;UPDATTE BYTE POINTER MOVEM P2,FIDFBP(FID) ; AS CURRENT FILE BYTE POINTER TXNE F,F.WRIT ;THIS WRITE? JRST FCPWTA ;YES-- DO IT ; MOVN T3,P4 ;GET -VE BYTE COUNT MOVE T2,[POINT 7,DMPBUF] ;POINT TO DISTANT SCRATCH AREA CALL SINCLR ;INPUT THE DATA REQUESTED MOVE T1,[POINT 7,DMPBUF] ;GET POINTER TO FRESH DATA MOVE T2,[PNTR (BYTE0,SCRBUF)] ;ALSO POINTER TO DATA TO STORE MOVE T3,P4 ;GET BYTE COUNT TO CONVERT CALL ASCBYT ;CONVERT 7-BIT TO 8-BIT ASCII JRST FCPP4X ;RETURN, BYTE COUNT IN P4 ; FCPWTA: MOVE T1,[POINT 7,DMPBUF] ;POINT TO REMOTE SCRATCH MOVE T2,[PNTR (RWVDB)] ;ALSO TO WHERE THE DATA IS CALL BYTASC ;CONVERT THE 8-BITS TO 7-BITS HRRZ T1,FIDJFN(FID) ;GET THE JFN BACK MOVE T2,[POINT 7,DMPBUF] ;POINT TO FRASH DATA MOVN T3,P4 ;GET -VE BYTE COUNT SOUT ;WRITE THEM BYTES INTO THE FILE JRST FCPZX ;RETURN NOTHING FROM FCPWVB >; END IF TOPS-20 ; IF TOPS-10,< MOVX P3,0 ;ASSUME BYTE OFFSET IS ZERO (I.E. BINARY FILE) MOVX T2,^D4 ; WITH 4 BYTES/WORD TXNN T4,FI.ASC ;ASCII FILE? JRST FCPRW3 ;NO-- GO ON WITH BIANRY FILE ASH P2,^D9 ;YES-- GET BYTES UP TO THIS VBN IDIVI P2,200*^D5 ;GET # 1000 BYTE BLOCKS TO THIS VBN IN P2, BYTE OFFSET TO P3 MOVX T2,^D5 ;ASCII IS 5 BYTES/WORD FCPRW3: CAMN P2,FIDFBP(FID) ;ARE WE AT THE REQUESTED BLOCK? JRST FCPRW4 ;YES-- NO NEED TO USET CALL XCTUUO USETI 1(P2) ;NO-- SET TO CURRENT BLOCK FCPRW4: LOAD P1,RWVSZ; ;GET TRANSFER SIZE IN BYTES PUSH P,P1 ;SAVE THAT SIZE FOR LATER . . . ADD P1,P3 ;ADD BYTE OFFSET TO DATA IN BLOCK ADDI P1,-1(T2) ;ROUND UP PUSH P,P2 ;SAVE BLOCK # IDIV P1,T2 ; TO WORDS TO READ POP P,P2 ;RESTORE BLOCK # EXCH P1,P3 ;BYTE OFFSET TO P1, LENGTH IN WORDS TO P3 ADDI P3,200-1 ;ROUND UP ASH P3,-^D7 ; TO NEXT BLOCK MOVE T2,P2 ;GET CURRENT BLOCK # ADD T2,P3 ;COMPUTE END BLOCK MOVEM T2,FIDFBP(FID) ;STORE THE NEW BLOCK # ASH P3,^D<7+18> ;GET # WORDS TO TRANSFER IN LH MOVN P3,P3 ;-VE # WORDS HRRI P3,DMPBUF-1 ; AND DATA ADDRESS-1 FORM IOWD MOVX P4,0 ;END I/O LIST ; TXNE T4,FI.ASC ;ASCII FILE? JRST FCPRWA ;YES-- GO DO IT TXNN F,F.WRIT ;WRITING FILE? JRST FCPRDB ;NO-- READ BINARY FILE ; ; WRITE BINARY ; POP P,T3 ;RESTORE BYTE COUNT ADDI T3,1 ;ROUND UP ASH T3,-1 ;CONVERT BYTES TO WORDS MOVE T1,[PNTR (RWVDW0)] ;GET POINTER TO DATA TO BE WRITTEN MOVE T2,[POINT 18,DMPBUF] ;ALSO WHERE TO MOVE IT TO CALL MOVSTR ;MOVE IT HRRZ T1,FIDJFN(FID) ;GET CHANNEL # JRST FCPWTB ;FINISH WRITE ; ; READ BINARY ; FCPRDB: HRRI P3,SCRBUF-1 ;MAKE IOWD POINT TO SCRBUF CALL XCTUUO IN P3 ;INPUT REQUESTED DATA SKIPA ;OK-- GO ON RETERR IE.RER JRST FCPRDX ;RETURN DATA TO FE ; ; READ/WRITE ASCII ; FCPRWA: TXNE F,F.WRIT ;WRITE FILE? JRST FCPWTA ;YES-- DO IT ; ; READ ASCII ; CALL INEOF ;INPUT DATA, IGNORE EOF MOVE T3,(P) ;ALSO GET BYTE COUNT SAVED ON STACK MOVE T1,P1 ;GET # BYTES IN BUFFER BEFORE ACTUAL DATA ADJBP T1,[POINT 7,DMPBUF] ;MAKE POINTER TO ACTUAL USER DATA MOVE T2,[PNTR (BYTE0,SCRBUF)] ;GET POINTER TO OUTPUT DATA BACK TO FE CALL ASCBYT ;CONVERT 7-BIT ASCII TO 8-BIT HALFWORD FORMAT FCPRDX: POP P,P4 ;RESTORE BYTE COUNT JRST FCPP4X ;RETURN DATA TO FE ; ; WRITE ASCII ; FCPWTA: CALL INEOF ;INPUT DATA, IGNORE EOF POP P,T3 ;RESTORE BYTE COUNT MOVE T1,P1 ;GET # BYTES IN BUFFER BEFORE ACTUAL DATA ADJBP T1,[POINT 7,DMPBUF] ;MAKE POINTER TO ACTUAL USER DATA MOVE T2,[PNTR (RWVDB)] ;GET POINTER TO INPUT DATA IN 8-BIT FORMAT CALL BYTASC ;CONVERT 8-BIT TO 7-BIT ASCII HRRZ T1,FIDJFN(FID) ;GET CHANNEL # CALL XCTUUO USETO 1(P2) ;SET OUTPUT BLOCK # FCPWTB: CALL XCTUUO OUT P3 ;WRITE OLD AND NEW DATA BACK SKIPA ;OK-- GO ON RETERR IE.WER JRST FCPZX ;RETURN COMPLETE TO -11 FROM FCPWVB ; >; END IF TOPS-10 SUBTTL RAT -- READ FILE ATTRIBUTES ; ; NOTE THIS IS ALSO CALLED FROM ACCESS, BYTE COUNT PRESERVED IN P4 ; FCPRAT: CALL GETFID ;VERIFY THE USER'S FILE-ID CALL MAKHDR ;MAKE A FAKE HEADER BLOCK MOVE P1,[PNTR (FILAT0)] ;POINT TO ATTRIBUTE CONTROL BLOCK MOVE P2,[POINT 18,ATTRCB] ;ALSO POINT TO SCRATCH AREA FCPRA0: ILDB T1,P1 ;GET A WORD IDPB T1,P2 ;SAVE IT TXNE T1,BIT7 ;DONE? JRST FCPRA0 ;NO-- SAVE SOME MORE ; MOVE P1,[POINT 18,ATTRCB] ;POINT TO START MOVE P2,[POINT 18,SCRBUF] ;ALSO POINT TO OUTPUT BUFFER SETZ P4, ;START BYTE COUNT AT ZERO ; FCPRA1: ILDB T1,P1 ;GET A CONTROL WORD IDPB T1,P2 ;STORE IN OUTPUT, ALSO ADDI P4,2 ;BUMP BYTE COUNT SETZ T2, ;START WITH ZERO SIZE ROTC T1,^D<36-8> ;GET THE SIZE FROM HIGH BYTE INTO T2 ASH T1,^D<8-36> ; AND SIGN-EXTEND FUNCTION INTO T1 JUMPGE T1,FCPP4X ;ALL DONE IF ZERO (NO +VE FUNCTIONS FOR READ) MOVN T1,T1 ;MAKE +VE FUNCTION CAILE T1,ATRMAX ;TOO BIG?? RETERR IE.RER MOVE T1,ATRPTR-1(T1) ;GET BYTE POINTER TO REQUESTED ATTRIBUTES SKIPN T2 ;SIZE= 0? MOVEI T2,1K ;YES-- IMPLIES WHOLE BLOCK ADDI T2,1 ;ROUND ASH T2,-1 ; UP TO WORDS ; FCPRA4: LDB C,T1 ;GET A WORD IBP T1 ;NOW BUMP THE POINTER IDPB C,P2 ;SEND TO OUTPUT ADDI P4,2 ;BUMP BYTE COUNT SOJG T2,FCPRA4 ;LOOP FOR ALL SUCH ATTRIBUTES JRST FCPRA1 ;BACK FOR ANOTHER ATTRIBUTE SUBTTL WAT -- WRITE ATTRIBUTES ; ; FCPWAT: CALL GETFID ;CHECK OUT THE FILE-ID CALL CLRHDR ;START WITH A CLEAR HEAD MOVE P1,[PNTR (FILAT0)] ;POINT TO ATTRIBUTE CONTROL LIST ; FCPWA1: ILDB T1,P1 ;GET AN ATTRIBUTE WORD SETZ T2, ;CLEAR SIZE WORD ROTC T1,^D<36-8> ;SHIFT SIZE INTO T2 ASH T1,^D<8-36> ;SIGN-EXTEND FUNCTION BYTE IN T1 JUMPLE T1,FCPZX ;DONE IF ZERO (-VE FUNCTIONS ONLY FOR READ) CAILE T1,ATRMAX ;TO BIG? RETERR IE.RER MOVE T1,ATRPTR-1(T1) ;GET POINTER TO DATA IN HEADER SKIPN T2 ;SIZE= 0? MOVEI T2,1K ;YES-- IMPLIES WHOLE BLOCK ADDI T2,1 ;ROUND ASH T2,-1 ; UP TO WORDS ; FCPWA4: ILDB C,P1 ;GET AN INPUT BYTE DPB C,T1 ;STORE IN HEADER IBP T1 ; THEN BUMP THE POINTER SOJG T2,FCPWA4 ;LOOP FOR ALL THE WORDS JRST FCPWA1 ;NOW BACK FOR ANOTHER ATTRIBUTE ; ; ATTRIBUTE CONTROL POINTERS ; ATRPTR: PNTR (H.FOWN) ;(1) FILE OWNER PNTR (H.FPRO) ;(2) FILE PROTECTION PNTR (H.CHAR) ;(3) FILE CHARACTERISTICS PNTR (H.UFAT) ;(4) USER'S FILE ATTRIBUTES PNTR (I.FNAM) ;(5) FILE NAME PNTR (I.FTYP) ;(6) FILE TYPE PNTR (I.FVER) ;(7) FILE VERSION NUMBER PNTR (I.EDTW) ;(8) EXPIRATION DATE POINT 18,STSBLK,17 ;(9) STATISTICS BLOCK POINT 18,FILHDR,17 ;(10) ENTIRE FILE HEADER ATRMAX==^D10 ;MAX SUBTTL APC -- ACP CONTROL FUNCTIONS ; ; FUNCTIONS MOUNT, DISMOUNT: BOTH MERELY CLEAN UP FILE DATA BASE ; FCPAPC: MOVEI FID,FIDTAB ;POINT TO FID TABLE ; FCPAP1: SKIPN T1,FIDJFN(FID) ;THIS FILE GOT A JFN? JRST FCPAP3 ;NO-- JUST CLEAN UP HRRZ T1,T1 ;JUST THE JFN IF TOPS-20,< CLOSF ;CLOSE ANY OPEN FILE JFCL >; END IF TOPS-20 IF TOPS-10,< CALL RELCHN ;RELEASE CHANNEL >; END IF TOPS-10 ; FCPAP3: SETZM FIDUCT(FID) ;CLEAR SETZM FIDFLG(FID) ; IMPORTANT SETZM FIDJFN(FID) ; WORDS ADDI FID,FIDSIZ ;BUMP TO NEXT FILE-ID CAIGE FID,FIDTBE ;BEYOND END? JRST FCPAP1 ;NO-- BACK FOR ANOTHER ; SETZB T1,USECNT ;RESET GLOBAL USE COUNT RETURN ;RETURN FROM APC, NO DATA SUBTTL FILE HEADER SUBROUTINES ; ; MAKHDR -- MAKE A FILE HEADER AND STATISTICS BLOCK ; MAKHDR: CALL CLRHDR ;START WITH A CLEAR HEAD IF TOPS-20,< CALL GETFDB ;GET THE FDB FOR THIS FILE >; END IF TOPS-20 MOVEI T1,27027 ;MAGIC STOR T1,H.IDOF; ; . . HLRZ T1,FIDFID(FID) ;GET FILE NUMBER STOR T1,H.FNUM; ; . . HRRZ T1,FIDFID(FID) ;AND SEQ # STOR T1,H.FSEQ; ; . . MOVE T1,FIDUIC(FID) ;ALSO GET UIC STOR T1,H.FOWN; ; ; SETZ T1, ;START WITH ALL ACCESS IF TOPS-20,< MOVE T3,[POINT 6,FILFDB+.FBPRT,17] ;POINT TO PROTECTION FIELDS >; END IF TOPS-20 IF TOPS-10,< MOVE T3,[POINT 3,FIDLEB+.RBPRV(FID)] ;POINT TO PROTECTION FIELDS >; END IF TOPS-10 MOVEI T4,3 ;THREE OF THEM MAKHD1: ILDB T2,T3 ;GET A CODE IF TOPS-20,< LSH T2,-2 ;ONLY FOUR HIGH BITS >; END IF TOPS-20 MOVE T2,PROTAB(T2) ;CONVERT THE PROTECTION ROTC T1,-4 ;SHIFT THE BITS INTO HIGH PART OF T1 SOJG T4,MAKHD1 ;LOOP FOR ALL THE BITS ; LSH T1,^D<16-36> ;SHIFT DOWN INTO LOW BITS STOR T1,H.FPRO; ;STORE THE PROTECTION ; MOVE T1,[POINT 18,FIDNAM(FID)] ;POINT TO START OF FILE NAME MOVE T2,[PNTR (I.FNM0)] ;AND TO WHERE TO PUT IT CALL MOVNAM ;MOVE THE WHOLE FILE-NAME NOW ; IF TOPS-20,< HLRZ T1,FILFDB+.FBCNT ;GET # WRITES STOR T1,I.RVNO; ;# REVISIONS >; END IF TOPS-20 ; MOVE T2,[PNTR (I.RVDT)] ;POINT TO REVISION DATE,TIME, CREATION DATE,TIME IF TOPS-20,< MOVE T1,FILFDB+.FBWRT ;GET DATE/TIME OF LAST WRITE (REVISION) >; END IF TOPS-20 IF TOPS-10,< LDB T1,[POINT 15,FIDLEB+.RBEXT(FID),35] ;GET LAST ACCESS DATE >; END IF TOPS-10 CALL BYTDTM ;STORE THE STRING IN THE HEADER IF TOPS-20,< MOVE T1,FILFDB+.FBCRV ;GET DATE/TIME OF CREATION >; END IF TOPS-20 IF TOPS-10,< LDB T1,[POINT 12,FIDLEB+.RBPRV(FID),35] ;GET LOW ORDER 12 BITS OF CREATION DATE LDB T3,[POINT 3,FIDLEB+.RBEXT(FID),20] ;GET HIGH ORDER THREE BITS . . . DPB T3,[POINT 3,T1,35-12] ;STORE THEM . . . LDB T3,[POINT 11,FIDLEB+.RBPRV(FID),23] ;GET CREATION TIME HRL T1,T3 ;PUT TIME IN LH, DATE IN RH >; END IF TOPS-10 CALL BYTDTM ;CONVERT TO 8-BIT ASCII ; MOVE T3,FIDFLG(FID) ;GET THE FILE FLAGS MOVE T4,[PNTR (H.UFAT)] ;POINT TO USER ATTRIBUTES MOVEI T1,1002 ;RECORD TYPE: VARIABLE TXNE T3,FI.ASC ;ASCII (IMAGE ASCII) FILE? MOVEI T1,1 ;YES-- RECORDS ARE FIXED LENGTH (UNFORMATTED) DPB T1,T4 ; . . MOVEI T1,1000 ;RECORD SIZE: 1000 IDPB T1,T4 ; . . ; IF TOPS-20,< HRRZ T1,FILFDB+.FBBYV ;# PAGES ASH T1,2 ;CONVERT TO BLOCKS >; END IF TOPS-20 IF TOPS-10,< MOVE T1,FIDLEB+.RBALC(FID) SUBI T1,2 ;MINUS THE PRIME AND SPARE >; END IF TOPS-10 MOVEI T2,4 ;ASSUME BINARY (4 BYTES/WORD) TXNN T3,FI.ASC ;ASCII FILE? JRST MAKHD5 ;NO-- OK MOVEI T2,5 ;YES-- 5 BYTES/WORD IMULI T1,5 ;COMPUTE ASH T1,-2 ; BLOCKS IN ASCII MAKHD5: ROT T1,-^D16 ;GET THE HIGH PART OF BLOCK SIZE FIRST IDPB T1,T4 ;SAVE IN USER ATTRIBUTES HRLZM T1,STSBLK+1 ;ALSO IN STATISTICS BLOCK ROT T1,^D16 ;RESTORE THE LOW ORDER BITS IDPB T1,T4 ;SAVE . . HRRM T1,STSBLK+1 ; BOTH WAYS ; IF TOPS-20,< MOVE T1,FILFDB+.FBSIZ ;GET FILE SIZE IN BYTES TO EOF IMUL T1,T2 ;*BYTES/WORD = SIZE*(BYTES/WORD) LDB T3,[POINT 6,FILFDB+.FBBYV,11] ;BYTE SIZE MOVEI T2,^D36 ;COMPUTE IDIV T2,T3 ; BYTES/WORD ADDI T1,-1(T2) ;ROUND UP IDIV T1,T2 ; TO 4/5 BYTES/WORD >; END IF TOPS-20 IF TOPS-10,< MOVE T1,FIDLEB+.RBSIZ(FID) ;GET SIZE IN WORDS IMUL T1,T2 ;CONVERT TO BYTES >; END IF TOPS-10 IDIVI T1,1000 ;GET LAST BLOCK NUMBER ADDI T1,1 ;VBN'S ALWAYS START WITH ONE ROT T1,-^D16 ;GET HIGH PART FIRST IDPB T1,T4 ;SAVE IN ATTRIBUTES ROT T1,^D16 ;BACK TO LOW PART IDPB T1,T4 ;STORE THAT TOO.... IDPB T2,T4 ;ALSO SAVE WHICH BYTE IN LAST BLOCK IS EOF RETURN ;FROM MAKHDR ; ; PROTAB -- PROTECTION CORRESPONDENCE TABLE ; BITS ARE IN THE ORDER DELETE, EXTEND, WRITE, READ: ; A "1" MEANS THAT SUCH ACCESS IS DENIED; ; A "0" MEANS THAT SUCH ACCESS IS ALLOWED. ; TABLE IS INDEXED BY TOPS-10/TOPS-20 PROTECTION CODE ; PROTAB: IF TOPS-20,< RADIX 2 EXP 1111,1011,0111,0011,1101,1001,0101,0001 EXP 1110,1010,0110,0010,1100,1000,0100,0000 RADIX 8 >; END IF TOPS-20 IF TOPS-10,< RADIX 2 EXP 0000,0000,1000,1000,1010,1110,1111,1111 RADIX 8 >; END IF TOPS-10 ; ; CLRHDR -- CLEAN THE FILE HEADER FOR NEW DATA ; CLRHDR: SETZM FILHDR+0 ;CLEAR FIRST WORD MOVE T1,[XWD FILHDR+0,FILHDR+1] ;BLT POINTER TO CLEAR BLT T1,FILHDE-1 ;DOWN TO THE END RETURN ;WASHED UP FROM CLRHDR SUBTTL FILE-ID SUBROUTINES ; ; ALCFID -- ALLOCATE A FILE-ID BLOCK ; T1 -- JFN WORD OF FILE NEEDING AN ID ; ALCFID: MOVEI T3,FIDTAB ;POINT TO TABLE OF FILE-ID'S SETZ FID, ;FLAG NO FREE ONE FOUND HRLOI T4,377777 ;START WITH USE COUNT OF INFINITY ; ALCFI1: SKIPE FIDJFN(T3) ;THIS FILE-ID IN USE? JRST ALCFI2 ;YES-- SEE IF ACCESSED MOVE FID,T3 ;NO-- THIS IS THE ONE JRST ALCFI4 ;SO USE IT ; ALCFI2: MOVE T2,FIDFLG(T3) ;GET FLAGS WORD TXNN T2,FI.ACC ;ACCESSED? CAMG T4,FIDUCT(T3) ; OR NOT LOWEST USE COUNT? JRST ALCFI3 ;YES-- SKIP IT MOVE T4,FIDUCT(T3) ;LOWEST USE COUNT SO FAR-- GET IT MOVE FID,T3 ;SAVE THIS FILE-ID ; ALCFI3: ADDI T3,FIDSIZ ;BUMP TO NEXT FILE-ID CAIGE T3,FIDTBE ;PAST END YET? JRST ALCFI1 ;NO-- LOOK AT ANOTHER ; JUMPN FID,ALCFI4 ;GOT FID-- GO ON RETERR IE.NOD,X ; ALCFI4: MOVX T1,0 ;RESET JFN EXCH T1,FIDJFN(FID) ;STORE THE JFN, GET OLD ONE JUMPE T1,ALCFI5 ;NO PREVIOUS JFN-- GO ON HRRZ T1,T1 ;GET JUST THE JFN IF TOPS-20,< RLJFN ;RELEASE IT JFCL ;SO SORRY >; END IF TOPS-20 IF TOPS-10,< CALL RELCHN ;RELEASE CHANNEL >; END IF TOPS-10 ; ALCFI5: MOVE T1,FID ;COPY FID BLOCK ADDR SUBI T1,FIDTAB-FIDSIZ ;MAKE IT IDIVI T1,FIDSIZ ; A NUMBER OF A FILE-ID AOS FIDFID(FID) ;BUMP THE SEQUENCE # HRLM T1,FIDFID(FID) ;STORE THE FILE-ID SETZM FIDFLG(FID) ;RESET THE FLAG WORD CALLR SETUCT ;SET USE COUNT AND RETURN FROM ALCFID ; ; GETFID -- GET AN EXISTING FILE-ID AND VERIFY IT ; GETFID: LOAD T1,FILID; ;GET THE USER-SPECIFIED FILE-ID HLRZ FID,T1 ;GET THE FILE-ID NUMBER IMULI FID,FIDSIZ ;MAKE IT AN OFFSET ADDI FID,FIDTAB-FIDSIZ ; INTO FILE-ID TABLE CAIGE FID,FIDTBE ;BEYOND END? CAME T1,FIDFID(FID) ;NO-- NO MATCH? RETERR IE.SQC ;THAT'S-A-NO-GOOD SKIPN FIDJFN(FID) ;GET THE JFN IF ANY RETERR IE.RER ;BROKEN CALLRX SETUCT ;SET USE COUNT AND RETURN FROM GETFID ; ; SETUCT -- UPDATE USE COUNT FOR CURRENT FILE-ID ; SETUCT: AOS T1,USECNT ;UPDATE GLOBAL USE COUNT MOVEM T1,FIDUCT(FID) ;SET IT RETURN ;FROM SETUCT SUBTTL FILE-NAME SUBROUTINES ; ; GETNAM -- GET ASCIZ FILENAME IN FNMBLK FROM RAD50 FILENAME IN FNB ; GETNAM: IF TOPS-10,< CALL CLRFNM ;RESET FILE-NAME BLOCK >; END IF TOPS-10 MOVX P3,0 ;START WITH NO WILDS LOAD T2,N.DID; ;GET THE DIRECTORY ID TLZN T2,BIT15 ;IS THIS REALLY A DIRECTORY? RETERR IE.SNC ;SORRY-- YOU CAN'T REMEMBER WHAT I TOLD YOU MOVEI P4,UICTAB ;POINT TO TABLE OF DIRECTORIES IF TOPS-20,< MOVE T1,[POINT 7,FNMBLK] ;POINT TO FILE-NAME BLOCK MOVEI C,74 ;START DIRECTORY OFF RIGHT IDPB C,T1 ; . . CAIGE T2,340B<35-8> ;THIS UIC GREATER THAN [340,0]? JRST GETNM2 ;NO-- SCAN THE TABLE SUBI T2,340B<35-8> ;YES-- CONVERT IT TO A DIRECTORY NUMBER DIRST ;GET THE STRING RETERR IE.RER ;ALREADY CHECKED OUT-- OOPS JRST GETN35 ;OK-- STORE THE WIDGET >; END IF TOPS-20 ; GETNM2: SKIPN T3,UICSIZ(P4) ;GET A DIRECTORY TABLE ENTRY RETERR IE.SQC ;SORRY NO SUCH DIRECTORY CAMN T2,UICUIC(P4) ;MATCH? JRST GETNM3 ;YES-- GOT IT ADD P4,T3 ;BUMP TO NEXT ENTRY JRST GETNM2 ;BACK FOR ANOTHER ; GETNM3: IF TOPS-20,< HRROI T2,UICNAM(P4) ;GET ADDRESS OF STRING SETZ T3, ;STRING IS ASCIZ SOUT ;PUT THE STRING AWAY ; GETN35: MOVEI C,76 ;GET THE CLOSING WIDGET IDPB C,T1 ;STORE IN FILE-NAME >; END IF TOPS-20 IF TOPS-10,< MOVE T1,UICSTR(P4) ;GET STR NAME FOR THIS UIC CAIN T1,0 ;ALL: ? TXO P3,FJ.ALL ;YES-- NOTE THAT CAIN T1,1 ;DSK: ? TXO P3,FJ.DSK ;YES-- NOTE THAT MOVEM T1,FIDSTR(FID) ;SET STR NAME MOVE T1,UICPPN(P4) ;GET P,PN OF DIRECTORY IFN FTPATH,< SKIPE UICSFD(P4) ;IS THERE ANY PATHS SPEC? MOVEI T1,UICPTH(P4) ;YES-- GET PATH BLOCK ADDRESS INSTEAD >; END IFN FTPATH MOVEM T1,FIDLEB+.RBPPN(FID) ;STORE DIRECTORY POINTER MOVE T1,[POINT 6,FIDLEB+.RBNAM(FID)] ;POINT TO FILE NAME IN SIXBIT >; END IF TOPS-10 ; MOVE P2,[PNTR (N.FNM0)] ;GET POINTER TO START OF RAD50 FILE-NAME MOVEI P1,3 ;THREE WORDS LOAD P4,N.STAT; ;GET FILE FLAGS TXNE P4,NB.SNM ;WILD NAME? JRST GETNM5 ;YES-- GET IT ; GETNM4: ILDB T2,P2 ;NO-- GET A RAD50 WORD IF TOPS-10,< CAIE P1,1 ;IGNORE LAST THREE CHARS >; END IF TOPS-10 CALL R50ASC ;CONVERT IT TO ASCII SOJG P1,GETNM4 ;DO THREE WORDS JRST GETNM6 ;ON TO FILE TYPE ; GETNM5: IF TOPS-20,< MOVEI C,"*" ;GET A STAR IDPB C,T1 ;STORE IT >; END IF TOPS-20 TXO P3,FJ.WLN ;NOTE WILD NAME GETN51: IBP P2 ;SKIP OVER SOJG P1,GETN51 ; FILE-NAME ; GETNM6: IF TOPS-20,< MOVEI C,"." ;DO A IDPB C,T1 ; . BETWEEN FILE AND TYPE >; END IF TOPS-20 IF TOPS-10,< MOVE T1,[POINT 6,FIDLEB+.RBEXT(FID)] >; END IF TOPS-10 ILDB T2,P2 ;GET THE TYPE TXNE P4,NB.STP ;WILD TYPE? JRST GETNM7 ;YES-- DO IT CALL R50ASC ; INTO ASCII JRST GETNM8 ;ON TO VERSION ; GETNM7: IF TOPS-20,< MOVEI C,"*" ;GET A STAR IDPB C,T1 ;STORE IT >; END IF TOPS-20 TXO P3,FJ.WLT ;NOTE WILD TYPE ; GETNM8: IF TOPS-20,< ILDB T2,P2 ;GET THE VERSION TXNN P4,NB.SVR ;WILD VERSION? JUMPE T2,GETNMX ;VERSION ZERO-- DON'T PUT ANYTHING IN STRING MOVEI C,"." ;PUNTUATE IDPB C,T1 ; THE VERSION TXNE P4,NB.SVR ;WILD VERSION? JRST GETNM9 ;YES-- DO IT TXNN T2,BIT15!BIT14 ;THIS A FUNNY (-VE) VERSION? TXZN T2,BIT13 ;NO-- IS IT A TEMP VERSION (20000+N)? JRST GETN82 ;NO-- GO ON ADDI T2,^D100000 ;YES-- MAKE IT A TEMP VERSION JRST GETN83 ;AND DON'T SIGN-EXTEND IT ; GETN82: LSH T2,^D<36-16> ;SIGN ASH T2,^D<16-36> ; EXTEND THE NUMBER ; GETN83: MOVX T3,^D10 ;VERSION IS IN DECIMAL NOUT ;MAKE A NUMBER RETERR IE.BVR JRST GETNMX ;JUST ABOUT DONE ; GETNM9: MOVEI C,"*" ;GET A STAR IDPB C,T1 ;STORE IT TXO P3,FJ.WLG ;NOTE WILD GENERATION ; GETNMX: MOVEI C,0 ;MAKE THE STRING IDPB C,T1 ; ASCIZ HRROI T2,FNMBLK ;POINT TO THE NAME STRING >; END IF TOPS-20 MOVE T1,P3 ;GET THE WILD FLAGS BACK RETURN ;FROM GETNAM ; ; PUTNAM -- PUT FILENAME FROM FNMBLK (IN ASCIZ) INTO FNB FOR RETURN ; RETURNS +1 IF BAD (TOO LONG) NAME, ; +2 IF OK ; PUTNAM: MOVE P2,[PNTR (N.FNM0)] ;POINT TO FILE-NAME IF TOPS-20,< MOVE T1,[POINT 7,FNMBLK] ;ALSO TO WHERE TO GET IT FROM >; END IF TOPS-20 IF TOPS-10,< MOVE T1,[POINT 6,FIDLEB+.RBNAM(FID)] >; END IF TOPS-10 MOVEI P1,3 ;DO THREE WORDS OF FILE-NAME ; PUTNM2: CALL ASCR50 ;CONVERT THREE CHARS TO RAD50 IF TOPS-10,< RETURN ;BAD CHAR IN NAME CAIG P1,2 ;END OF NAME? >; END IF TOPS-10 JRST PUTNM3 ;END OF NAME-- ON TO EXTENSION IDPB T2,P2 ;STORE THE NAME WORD SOJG P1,PUTNM2 ;LOOP FOR THREE CHARS IF TOPS-20,< ILDB C,T1 ;GET THE TERMINATING CHARACTER >; END IF TOPS-20 JRST PUTNM4 ;ON TO GET EXT ; PUTNM3: IDPB T2,P2 ;STORE LAST PARTIAL WORD SETZ T2, ;NOW CLEAR REMAINING WORDS SOJG P1,PUTNM3 ;LOOP FOR ALL THEM EXTRA WORDS ; PUTNM4: IF TOPS-20,< CAIE C,"." ;IS THIS END OF FILE-NAME? RETURN ;NO-- SORRY, IT SHOULD BE >; END IF TOPS-20 CALL ASCR50 ;YES-- CONVERT THE FILE TYPE SKIPA ;SHORT-- GOT TERMINATOR IF TOPS-20,< ILDB C,T1 ;GET TERMINATOR CAIE C,"." ;START OF VERSION? RETURN ;NO-- ERROR >; END IF TOPS-20 IDPB T2,P2 ;STORE THE FILE TYPE IF TOPS-20,< MOVEI T3,^D10 ;VERSION IS IN DECIMAL NIN ;GET THE VERSION # RETURN ;BAD VERSION # CAIGE T2,BIT13 ;TOO BIG FOR -11 TO HANDLE? JRST PUTNM5 ;NO-- STORE IT CAIGE T2,^D100000 ;TEMP VERSION #? RETURN ;NO-- VERSION TOO BIG SUBI T2,^D100000 ;YES-- GET THE JOB # TXO T2,BIT13 ;MARK AS A TEMP VERSION # >; END IF TOPS-20 IF TOPS-10,< SETZ T2, ;ALWAYS ZERO >; END IF TOPS-10 ; PUTNM5: IDPB T2,P2 ;STORE THE VERSION # RETSKP ;YES-- ALL OK ; ; GETTMP -- GET A TEMP FILE JFN ; RETURNS JFN IN T1 ; GETTMP: IF TOPS-20,< MOVX T1,GJ%SHT!GJ%NEW!GJ%FOU!GJ%TMP+.GJNHG HRROI T2,[ASCIZ/FRONT-END-TEMP-FILE.TMP/] GTJFN ;GET THE JFN OF THE TEMP FILE RETERR IE.IFU >; END IF TOPS-20 IF TOPS-10,< CALL CLRFNM ;CLEAR FILENAME BLOCK AOS T2,TMPFIL ;GET CURRENT TEMP FILE NUMBER CALL OCTSIX ;CONVERT TO SIXBIT HRRI T3,'FE ' ;MAKE 000FE.TMP NAME MOVEM T3,FIDLEB+.RBNAM(FID) ;STORE NAME MOVSI T1,'TMP' ;MAKE TEMP FILE MOVEM T1,FIDLEB+.RBEXT(FID) ;AND TYPE >; END IF TOPS-10 RETURN ;FROM GETTMP ; IF TOPS-10,< ; ; CLRFNM -- CLEAR LOOKUP/ENTER BLOCK AREA OF FID BLOCK ; CLRFNM: MOVSI T1,FIDLEB(FID) ;GET START OF BLOCK HRRI T1,FIDLEB+1(FID) ; AND NEXT WORD . . . SETZM FIDLEB(FID) BLT T1,FIDLEB+.RBALC(FID) MOVEI T1,.RBALC ;ALL PARAMETERS UP TO .RBALC MOVEM T1,FIDLEB+.RBCNT(FID) ;SAVE THAT RETURN ;FROM CLRFNM ; >; END IF TOPS-10 ; ; CHKTYP -- SEE IF FILE TYPE (FROM FILE-ID BLOCK) IS BINARY FILE ; RETURNS +1 IF NOT BINARY FILE TYPE ; +2 IF BINARY FILE TYPE, I.E. ONE OF: ; ABS, BIN, LDA, OBJ, OLB, SML, STB, SYS, TSK ; CHKTYP: HRRZ T1,FIDTYP(FID) ;GET FILE TYPE, IN RAD50 MOVSI T2,-BINLEN ;AOBJN POINTER TO BINTAB CHKTY1: CAMN T1,BINTAB(T2) ;THIS MATCH BINARY FILE TYPE? RETSKP ;YES-- RETURN +2 AOBJN T2,CHKTY1 ;NO-- LOOK FOR ALL BINARY FILE TYPES RETURN ;NOT BINARY-- RETURN +1 ; ; TABLE OF RAD50 BINARY FILE TYPES ; BINTAB: .RAD50 BINLEN==.-BINTAB ; ; MOVNAM -- MOVE FILENAME, TYPE AND VERSION ; T1 -- SOURCE POINTER ; T2 -- DESTINATION POIINTER ; MOVNAM: MOVEI T3,5 ;FILENAME (3) TYPE (1) VER (1) CALLRX MOVSTR ;MOVE THE STRING ; ; MOVSTR -- MOVE A STRING ; T1 -- SOURCE POINTER ; T2 -- DESTINATION POINTER ; T3 -- BYTE COUNT ; MOVSTR: ILDB C,T1 ;GET A CHARACTER IDPB C,T2 ;STORE IT SOJG T3,MOVSTR ;LOOP FOR ALL OF THEM RETURN ;FROM MOVSTR SUBTTL CONVERSION SUBROUTINES ; ; BYTDTM -- CONVERT A DATE/TIME WORD TO 8-BIT ASCII BYTE STRING (13 BYTES) ; T1 -- DATE/TIME TO BE CONVERTED ; T2 -- 8-BIT BYTE POINTER TO WHERE TO STORE THE DATA ; RETURNS T2 UPDATED ; BYTDTM: PUSH P,T2 ;SAVE THE POINTER TO STORE MOVE T2,T1 ;COPY THE DATE/TIME MOVE T1,[POINT 7,DATBUF] ;POINT TO SCRATCH AREA IF TOPS-20,< MOVX T3,0 ;COLUMNATTED FLAVOR ODTIM ;CONVERT TO STRING MOVE T1,[POINT 7,DATBUF] ;BACK TO BEGINNING MOVE T2,T1 ;ALSO FOR OUTPUT, REMOVING THE TRASH MOVE T3,[POINT 3,[BYTE (3) 2,3,2,2,2,2,0]] ;POINTER TO FIELD SIZES ; BYTDT1: ILDB T4,T3 ;GET SIZE OF NEXT FIELD JUMPE T4,BYTDT3 ;DONE-- CONVERT TO 8-BIT BYTDT2: ILDB C,T1 ;GET A CHARACTER FROM ORIGINAL STRING IDPB C,T2 ;STORE IN OUTPUT STRING SOJG T4,BYTDT2 ;LOOP FOR ENTIRE FIELD SIZE IBP T1 ;END OF FIELD-- SKIP SEPERATOR JRST BYTDT1 ;GET NEXT FIELD, IF ANY >; END IF TOPS-20 IF TOPS-10,< CALL ASCDAT ;CONVERT DAT TO ASCII >; END IF TOPS-10 ; BYTDT3: MOVE T1,[POINT 7,DATBUF] ;BACK TO THE START OF THE STRING POP P,T2 ;RESTORE THE POINTER TO THE 8-BIT STRING MOVEI T3,^D13 ;13 BYTES OF DATE/TIME CALLRX ASCBYT ;CONVERT THE 7-BIT STRING TO 8-BIT ; ; ASCBYT -- CONVERT 7-BIT ASCII STRING TO 8-BIT BYTE -11 STYLE STRING ; BYTASC -- CONVERT STRING FROM -11 STYLE 8-BIT BYTES TO 7-BIT ASCII ; T1 -- BYTE POINTER TO 7-BIT ASCII STRING ; T2 -- BYTE POINTER TO 8-BIT DATA (POINTS TO FIRST DATA BYTE) ; T3 -- BYTE COUNT ; UPDATES EVERYTHING, USES T1-T4, P1, C ; ASCBYT: TDZA P1,P1 ;POINT TO ASCII-BYTE CONVERSIONS BYTASC: MOVEI P1,2 ;POINT TO BYTE-ASCII CONVERSIONS MOVE T4,T2 ;COPY 8-BIT POINTER LSH T4,^D<3-36> ;DOWN TO HIGH THREE BITS TXC T4,1 ;MAKE BYTES 3,2,1,0 IN WORD ; ASCBY1: SOJL T3,ASCBYX ;DONE IF BYTE COUNT DOWN XCT BYTINS+0(P1) ;EXECUTE THE LDB/ILDB XCT BYTINS+1(P1) ;EXECUTE THE IDPB/DPB SOJGE T4,ASCBY1 ;BUMP POINTER INTO POINTERS MOVEI T4,3 ;DOWN TO NEXT WORD-- RESET THE COUNT AOJA T2,ASCBY1 ; AND INCREMENT THE ADDRESS ; ASCBYX: HLL T2,BYTPTR(T4) ;SET NEW BYTE POINTER BITS IN UPDATED POINTER TXZ T2,17B17 ;ZERO THE INDEX FIELD RETURN ;THAT'S IT FOR BYTASC/ASCBYT ; BYTINS: ILDB C,T1 ;(ASCBYT) GET 7-BIT BYTE DPB C,BYTPTR(T4) ;(ASCBYT) STORE 8-BIT BYTE LDB C,BYTPTR(T4) ;(BYTASC) GET 8-BIT BYTE IDPB C,T1 ;(BYTASC) STORE 7-BIT BYTE ; BYTPTR: PNTR BYTE3,0(T2) PNTR BYTE2,0(T2) PNTR BYTE1,0(T2) PNTR BYTE0,0(T2) ; ; R50ASC -- CONVERT THREE CHARACTERS FROM RAD50 TO ASCII ; T1 -- POINTER TO ASCIZ OUTPUT STRING ; T2 -- RAD50 WORD (16 BITS) TO CONVERT ; RETURNS +1, T1 UPDATED ; R50ASC: JUMPE T2,CRET ;IF NULL-- GIVE UP NOW! IDIVI T2,50 ;TRIM OFF LOW CHARACTER HRLM T3,(P) ;SAVE IT ON STACK SKIPE T2 ;END OF TEXT? CALL R50ASC ;NO-- TRY AGAIN FOR ANOTHER CHAR ; HLRZ T2,(P) ;GET A CHARACTER BACK SETZ T3, ;START OUT TABLE PONTER ; R50AS2: CAMGE T2,R50TB1(T3) ;DOWN TO MATCH YET? AOJA T3,R50AS2 ;NO-- LOOK SOME MORE ADD T2,R50TB2(T3) ;YES-- CONVERT IF TOPS-10,< SUBI T2," "-' ' ;CONVERT TO SIXBIT >; END IF TOPS-10 IDPB T2,T1 ;NO-- STORE THE CHARACTER RETURN ;FROM R50ASC ; R50TB1: EXP 36,35,34,33,1,0 R50TB2: EXP "0"-36,"%"-35,0-34,"-"-33,"A"-1," "-0 ; ; ASCR50 -- CONVERT THREE CHARACTERS FROM ASCII TO RAD50 ; T1 -- POINTER TO ASCIZ STRING ; RETURNS +1 IF UNRECOGNIZED CHARACTER (IN C) PARTIAL RESULT IN T2 ; +2 SUCCESS ; T1 -- UPDATED POINTER TO NEXT CHARACTER ; T2 -- RAD50 TEXT ; ASCR50: SETZ T2, ;CLEAR ANSWER MOVEI T3,3 ;SET THE COUNT TO THREE AT MOST ; ASCR51: ILDB C,T1 ;GET A CHARACTER FROM THE STRING IF TOPS-10,< JUMPE C,ASCR56 ;SPACES ARE SPACES . . . ADDI C," "-' ' ;CONVERT SIXBIT TO ASCII >; END IF TOPS-10 CAIL C,"A" ;ALPHA CAILE C,"Z" ; BETIC? JRST ASCR52 ;NO-- TRY SOMETHING ELSE SUBI C,"A"-1 ;YES-- CONVERT THE CHARACTER JRST ASCR56 ;PUT IT AWAY ; ASCR52: CAIL C,"0" ;NUM CAILE C,"9" ; ERIC? JRST ASCR53 ;NO-- TRY HARDER SUBI C,"0"-36 ;YES-- CONVERT IT JRST ASCR56 ;PUT IT AWAY ; ASCR53: CAIE C,"-" ;HOW 'BOUT - (WILL BE A $)? JRST ASCR54 ;NO-- LOOK AGAIN MOVEI C,33 ;YES-- MAKE IT A $ JRST ASCR56 ;GOT IT ; ASCR54: IMULI T2,50 ;NO LUCK-- JUST FIX UP RESULT SOJG T3,ASCR54 ;TILL 3 CHARS RETURN ;FAILURE TO PICK THREE CHARACTERS ; ASCR56: IMULI T2,50 ;SHIFT THE RESULT A CHARACTER ADDI T2,(C) ;ADD IN CURRENT CHARATCER SOJG T3,ASCR51 ;PUT AWAY NEXT CHARACTER RETSKP ;SUCCESS-- THREE CHARS FOR ASCR50 ; IF TOPS-10,< ; ; OCTSIX -- CONVERT BINARY TO OCTAL SIXBIT ; T2 -- BINARY NUMBER 0-777 ; RETURNS +1: ; T1 -- SIXBIT VALUE BITS 0-17 ; OCTSIX: MOVX T3,0 ;START OUT EMPTY OCTSX1: LSHC T2,-3 ;SHIFT A DIGIT INTO T3 LSH T3,-3 ;ALLOCATE SIX BITS TXO T3,'0'B5 ;MAKE SIXBIT TLNN T3,77 ;A FULL 3 CHARS YET? JRST OCTSX1 ;NO-- WORK HARDER RETURN ;YES-- RETURN NOW ; ; ASCDAT -- CONVERT DATE TO ASCII ; T1 -- POINTER TO 7-BIT OUTPUT STRING ; T2 -- DATE/TIME TO BE CONVERTED (LH= MINUTES SINCE MIDNIGHT, RH= 15-BIT DATE) ; ASCDAT: PUSH P,T2 ;SAVE THE TIME HRRZ T2,T2 ;GET JUST THE DATE IDIVI T2,^D31 ;GET DAY OF MONTH TO T3 ADDI T3,1 ;START DAYS AT ONE CALL ASC2DC ;PUT IT IDIVI T2,^D12 ;MONTH TO T3, YEAR TO T2 ADD T3,[POINT 7,MONTAB] ;MAKE IT A POINTER TO MONTH TEXT ASCDT2: ILDB C,T3 ;GET A DATE CHARACTER JUMPE C,ASCDT3 ;ASCIZ... IDPB C,T1 ;STORE CHARACTER JRST ASCDT2 ;BACK FOR MORE ; ASCDT3: MOVEI T3,^D64(T2) ;GET YEAR CALL ASC2DC ;PUT IT AWAY ; POP P,T2 ;RESTORE TIME HLRZ T2,T2 ; TO RH IDIVI T2,^D60 ;HOURS TO T2, MINS TO T3 EXCH T3,T2 ;COPY HRS CALL ASC2DC ;PUT OUT HRS MOVE T3,T2 ;GET MINS CALL ASC2DC ;PUT THEM TOO MOVX T3,0 ;SEC= 0 ALWAYS CALLRX ASC2DC ;PUT THEM IN AND RETURN FROM ASCDAT ; ; ASC2DC -- PUT TWO DECIMAL DIGITS FROM T3 IN ASCII IN STRING (T1) ; ASC2DC: IDIVI T3,^D10 ;HIGH DIGIT TO T3, LOW TO T4 MOVEI C,"0"(T3) ;GET HIGH DIGIT IN ASCII IDPB C,T1 ;STORE . . . MOVEI C,"0"(T4) ;ALSO LOW DIGIT IDPB C,T1 ; . . . RETURN ;FROM ASC2DC ; ; MONTAB -- TABLE OF MONTHS ; DEFINE MONTH(X),> MONTAB: MONTH ; ; TYPOCT -- TYPE OCTAL # FROM T1 ON TTY ; TYPOCT: IDIVI T1,^D8 ;GET A LOW DIGIT HRLM T2,(P) ;SAVE ON STACK SKIPE T1 ;ALL DONE? CALL TYPOCT ;NO-- FETCH SOME MORE DIGITS HLRZ C,(P) ;YES-- GET DIGIT BACK ADDI C,"0" ;MAKE IT ASCII OUTCHR C ;TYPE THE CHARACTER RETURN ;FROM TYPOCT ; >; END IF TOPS-10 SUBTTL FILE I/O SUBROUTINES ; IF TOPS-20,< ; ; GETFDB -- GET THE FDB FOR THE FILE (FID) INTO FILFDB ; GETFDB: HRRZ T1,FIDJFN(FID) ;GET THE JFN MOVSI T2,.FBLEN ;READ ENTIRE FDB MOVEI T3,FILFDB ; INTO FILFDB GTFDB ;GET IT RETURN ;FROM GETFDB ; ; SINCLR -- DO A SIN AND CLEAR REST OF BUFFER IF NOT ALL BYTES TRANSFERED ; SINCLR: SIN ;DO THE SIN JUMPGE T3,CRET ;OK-- JUST RETURN SETZ C, ;NOT FINISHED-- CLEAR A CHARACTER SINCL1: IDPB C,T2 ;STORE A ZERO BYTE AOJL T3,SINCL1 ;LOOP FOR ALL MISSING BYTES RETURN ;RETURN ALL DONE ; >; END IF TOPS-20 ; IF TOPS-10,< ; ; LOOK -- DO (POSSIBLY) WILD LOOKUP ON FILE IN FIDLEB FOR FID ; T1 -- WILD FLAGS (FROM GETNAM) ; RETURNS +1: FAILED TO FIND FILE ; +2: SUCCESS, T1= CHANNEL # ; LOOK: MOVE P1,T1 ;COPY FLAGS CALL GETCHN ;GET A FREE CHANNEL RETERR IE.NOD HLL T1,P1 ;RESTORE FLAGS TXNN T1,FJ.ALL!FJ.DSK ;IS THIS A SEARCH-TYPE STRUCTURE? JRST WLOOK1 ;NO-- USE THE SUPPLIED NAME SETZM FIDSTR(FID) ;YES-- RESET TO START OF SEARCH LIST TXNN T1,FJ.ALL ;WAS THIS ALL? SETOM FIDSTR(FID) ;NO-- DSK-- SET START TO -1 ; ; WLOOK -- DO WILD CARD LOOKUP ; WLOOKN -- CONTINUE PREVIOUS WILD CARD LOOKUP ; WLOOK: MOVX T3,0 ;ASSUME RESET NON-SEARCH STR TXNN T1,FJ.ALL!FJ.DSK ;SEARCH LIST? JRST WLOOKA ;NO-- DONE WITH STR-- GIVE UP MOVE T3,FIDSTR(FID) ;GET CURRENT STRUCTURE NAME TXNN T1,FJ.ALL ;ALL? JRST WLOOKD ;NO-- USE DSK: SYSSTR T3, ;GET NEXT STRUCTURE NAME WARN ,[EXIT] JRST WLOOKA ;CONTINUE . . . ; WLOOKD: MOVX T2, ;POINT TO JOBSTR ARG BLOCK JOBSTR T2, ;GET NEXT STR IN JOB SEARCH LIST WARN ,[EXIT] WLOOKA: MOVEM T3,FIDSTR(FID) ;STORE THIS NEW STRUCTURE NAME WLOOK1: SETZM FIDDIX(FID) ;RESET DIRECTORY INDEX CALLRX WLOOKN ;NOW DO DIRECTORY SCAN ; WLOOKN: SKIPE T3,FIDSTR(FID) ;GET CURRENT STRUCTURE NAME CAMN T3,[EXP -1] ;LAST STR? CALLR RELCHN ;NO MORE STRS-- GIVE UP MOVX T2,.IODMP ;DUMP MODE MOVX T4,0 ;NO BUFFERS CALL XCTUUO OPEN T2 JRST WLOOK ;OOPS-- TRY NEXT STR MOVE T2,FIDLEB+.RBPPN(FID) ;GET PATH BLOCK POINTER MOVX T3, ;ASSUME A UFD IFN >, MOVX P1, ; IN THE MFD IFN FTPATH,< TLNE T2,-1 ;THIS A PATH BLOCK SPEC? JRST WLOOK2 ;NO-- JUST GO ON WITH UFD SKIPN 3(T2) ;JUST A P,PN? JRST WLKPT2 ;YES-- USE [1,1]P,PN.UFD MOVE T4,DMPLST ;POINT TO SCRATCH AREA PUSH T4,[EXP 0] ;SET JUNK WORD= 0 WLKPT1: PUSH T4,1(T2) ;SAVE LAST ENTRY IN PATH BLOCK TO SCRATCH AREA SKIPE 3(T2) ;END OF LIST COMING UP AFTER THIS ENTRY? AOJA T2,WLKPT1 ;NO-- LOOP FOR ALL BUT LAST ENTRY IN PATH BLOCK PUSH T4,[EXP 0] ;MARK END OF LIST MOVX T3, ;SET TYPE= SUB-FILE-DIRECTORY MOVEI P1,DMPBUF ;POINT PATH BLOCK ADDRESS TO SCRATCH AREA WLKPT2: MOVE T2,2(T2) ;GET LAST NAME FOUND IN LIST AS FILENAME OF DIRECTORY WLOOK2: >; END IFN FTPATH CALL XCTUUO LOOKUP T2 ;FIND THE DIRECTORY JRST WLOOK ;NO SUCH LUCK-- TRY FOR ANOTHER STR HLLZS FIDLEB+.RBEXT(FID) ;MAKE SURE EXT IS 3 CHARS MOVE T3,FIDDIX(FID) ;GET CURRENT DIRECTORY INDEX IDIVI T3,200 ;FIND CURRENT BLOCK # IN DIRECTORY FILE CALL XCTUUO USETI 1(T3) ;SET TO CURRENT BLOCK # WLOOK3: CALL XCTUUO IN DMPLST ;INPUT NEXT 200 WORDS JRST WLOOK4 ;OK-- LOOK AT THE BLOCK JRST WLOOK ;ERROR OR EOF-- TRY NEXT STRUCTURE NOW ; WLOOK4: TRZE T4,200 ;WHOLE BLOCK YET? JRST WLOOK3 ;YES-- READ NEXT ONE ADDI T4,2 ;BUMP DIRECTORY INDEX MOVEI T2,2 ;ALSO ADDM T2,FIDDIX(FID) ; DIRECTORY INDEX IN FILE-ID BLOCK MOVE T2,DMPBUF-2(T4) ;GET FILE-NAME FROM DIRECTORY BLOCK TXNN T1,FJ.WLN ;WILD NAME? CAMN T2,FIDLEB+.RBNAM(FID) ;NO-- NAME MATCH? JRST WLOOK5 ;YES-- TRY FILE TYPE JRST WLOOK4 ;NO-- TRY NEXT ENTRY ; WLOOK5: HLLZ T3,DMPBUF-1(T4) ;GET FILE TYPE TXNN T1,FJ.WLT ;WILD TYPE? CAMN T3,FIDLEB+.RBEXT(FID) ;NO-- TYPE MATCH? JRST WLOOK7 ;YES-- WE HAVE A MATCH JRST WLOOK4 ;NO-- TRY NEXT ENTRY ; WLOOK7: MOVEM T2,FIDLEB+.RBNAM(FID) ;STORE WILD NAME FOUND MOVEM T3,FIDLEB+.RBEXT(FID) ; ALSO WILD TYPE CALL XCTUUP LOOKUP FIDLEB(FID) ;LOOKUP SPECIFIED FILE JRST WLOOKN ;FAILED-- TRY ALL OVER AGAIN CALL XCTUUO IN DMPLST ;READ FIRST BLOCK SKIPA ;OK-- GO ON JRST WLOOK8 ;OOPS-- GIVE UP MOVEI T2,.IODMP ;ASSUME UNKOWN MODE MOVE T3,DMPBUF+0 ;GET FIRST WORD TXNN T3,-1B6 ;BINARY FILE? MOVEI T2,.IOIMG ;YES-- MAKE SURE OF IT DPB T2,[POINT 4,FIDLEB+.RBPRV(FID),12] ;SET FILE MODE WLOOK8: CALLRX CLOSEF ;CLOSE FILE AND RETURN +2 FROM WLOOK ; ; CLOSEF -- CLOSE FILE ; T1 -- CHANNEL # ; RETURNS +2 ALWAYS ; CLOSEF: CALL XCTUUO CLOSE RETSKP ;ALWAYS RETURN +2 FROM CLOSEF ; ; INEOF -- INPUT AND IGNORE EOF ; T1 -- I/O CHANNEL ; P3, P4 -- I/O LIST ; INEOF: CALL XCTUUO IN P3 ;ATTEMPT INPUT RETURN ;OK-- RETURN FROM INEOF CALL XCTUUO STATZ IO.EOF ;END-OF-FILE? RETURN ;YES-- RETURN FROM INEOF RETERR IE.RER,X ; ; GETCHN -- GET A FREE CHANNEL ; RETURNS +1: NO FREE CHANNELS ; +2: SUCCESS, T1= CHANNEL # ; GETCHN: MOVE T1,CHNMSK ;GET FREE CHANNEL MASK JFFO T1,GETCH1 ;FIND A FREE CHANNEL RETURN ;NONE FREE ; GETCH1: MOVE T1,T2 ;GET FIRST FREE BIT MOVN T2,T2 ;GET -VE CHANNEL # MOVX T3,1B0 ;START WITH BIT 0 LSH T3,(T2) ;GET BIT FOR CHANNEL ANDCAM T3,CHNMSK ;MARK (CLEAR) CHANNEL IN USE RETSKP ;ALL DONE, CHANNEL # IN T1 ; ; RELCHN -- RELEASE CHANNEL ; T1 -- CHANNEL # ; RELCHN: CALL XCTUUO ;FOR GOOD LUCK . . . RELEASE MOVN T2,T1 ;GET -VE CHANNEL # MOVX T3,1B0 ;START WITH CHANNEL 0 LSH T3,(T2) ;GET BIT FOR CHANNEL IORM T3,CHNMSK ;MARK (SET) CHANNEL FREE RETURN ; ; XCTUUO -- XCT I/O UUO ON CHANNEL (T1) ; T1 -- CHANNEL # ; CALL XCTUUO ; ; ; ; XCTUUO: PUSH P,@(P) ;STACK THE UUO AOS -1(P) ;SKIP THE UUO DPB T1,[POINT 4,(P),12] ;PUT CHANNEL # INTO AC FIELD XCT (P) ;EXECUTE THE UUO SKIPA ;RETURN +1 FROM UUO AOS -1(P) ;RETURN +2 FROM UUO POP P,(P) ;REMOVE UUO FROM STACK RETURN ;RETURN AFTER UUO FROM XCTUUO ; ; XCTUUP -- SAME AS XCTUUO, EXCEPT PRESERVE FIDLEB+.RBPPN(FID) ; THIS WORD IS DESTROYED ON LOOKUP/ENTER/RENAME ; XCTUUP: PUSH P,FIDLEB+.RBPPN(FID) ;SAVE PPN/PATH BLOCK POINTER PUSH P,@-1(P) ;STACK THE UUO AOS -2(P) ;SKIP THE UUO DPB T1,[POINT 4,(P),12] ;PUT CHANNEL # INTO AC FIELD XCT (P) ;EXECUTE THE UUO SKIPA ;RETURN +1 FROM UUO AOS -2(P) ;RETURN +2 FROM UUO POP P,(P) ;REMOVE UUO FROM STACK POP P,FIDLEB+.RBPPN(FID) ;RESTORE PPN/PATH BLOCK POINTER RETURN ;RETURN AFTER UUO FROM XCTUUP ; >; END IF TOPS-10 SUBTTL END STATEMENT ; ; END XWD 3,ENTVEC