Trailing-Edge
-
PDP-10 Archives
-
BB-M836C-BM
-
tools/alu/alu.mac
There are 6 other files named alu.mac in the archive. Click here to see a list.
;EDIT 240
;Reformat to TOPS20 coding conventions.
;Add FREEZE, UNFREEZE commands.
;Add STATUS USER command.
;EDIT 237
;Change default "till when" from "soon" to "one hour".
;EDIT 236
;Remove old SEARCH ALUPRM statement.
;EDIT 235
;Changed version number to 11
;-------
;This version shipped on tools tape with TOPS20 Release 5, although
;edit number had not been updated and was shipped as 233.
;EDIT 234
;Assemble ALUPRM as part of ALU rather than as universal.
;Put back default extension for CANCEL.
;Use ALU: instead of SYS: for second try for help file
;Give extension .RED for REDIT changes file.
;Type REDIT info in neater format
TITLE ALU - AUTOMATED LIBRARY UPDATING
SUBTTL DAVID WRIGHT JUL., 1979
;BASED ON ALU BY JACK KRUPANSKY
;USER-DEPENDENT THINGS ARE IN ALUPRM.MAC
SEARCH MONSYM,MACSYM
SALL
.REQUIRE SYS:MACREL
;SET DEFAULT F.T. SWITCHES
DEFINE ND (NAME,VALUE),<
IFNDEF NAME,<NAME==VALUE>>
ND FTFUID,0 ;DEFAULT IS NO UID IN SOURCE FILE
ND FTFCOM,0 ;DEFAULT IS NOT AUTOMATIC FILCOM AFTER REPLACE
ND FTCOPO,0 ;DEFAULT IS NO AUTOMATIC COPYING OF OUTPUT FILES
ND FTRUID,1 ;DEFAULT IS REPLACE UID (IF UID BEING USED)
ND FTBAKF,1 ;DEFAULT IS MAKE BACKUP FILE WITH RENAME
ND FTANYU,0 ;DEFAULT IS REGISTERED USERS ONLY
ND FTGCPY,1 ;DEFAULT IS ASK USER IF HE WANTS A COPY OF FILE
; EVEN THOUGH IT IS RESERVED BY SOMEONE ELSE.
ND FTREDT,1 ;DEFAULT IS RUN REDIT BEFORE REPLACE
ND FTCGET,1 ;DEFAULT IS TO COPY FILE WHEN IT'S RESERVED
;VERSION INFORMATION:
ALUMJR==11 ;MAJOR VERSION
ALUMNR==0 ;MINOR VERSION
ALUEDT==241 ;EDIT LEVEL
ALUWHO==0 ;WHO LAST EDITED
;EDIT HISTORY
;==================================
;EDIT# DATE WHO WHY !
;==================================
;
;233 6-Jul-81 /DAW If file is RENAME'd to the library, set the
; generation-retention-count to the default of the
; library.
;232 6-Jul-81 /DAW Implement /COPY and /NOCOPY switches on "GET" and
; "QGET" commands.
; FTCGET feature test switch: = 1 means the default
; is /COPY on GET and QGET, = 0 means default is /NOCOPY.
;231 6-Jul-81 /DAW Add "INFORMATION (ABOUT) VERSION" command,
; put out whole version number (including "minor"
; and "who" field) to FILUPD.HST.
; Don't depend on user defining LIB: the same way
; as is in ALU's table for REPLACE to work correctly.
; STATUS to print out "lib: = " before each library
; directory.
; Allow user to be on a different structure and
; REPLACE (until now this hasn't worked with all
; flavors of ALU).
; When replacing generated output files, do the same
; typeout as the EXEC when it does a COPY.
;
;*** VERSION 10 July 3,1981 ***
;
;230 2-Jul-81 /DAW Add another argument to LIB macro; to allow
; different libraries to have different FILUPD.HST's
; and places to put .DIF and .SCM files.
; Changed COMMENT command to ask which library's
; FILUPD.HST you want to put a comment in.
; Also ALUPRM files are now incompatible, so ALU is
; now version 10.
;227 2-Jul-81 /DAW Delete switch FTRCD (use connected directory
; on replaces); this is reasonable for all ALU's
; to do.
; Add DFLIB feature: If you define DFLIB in
; ALUPRM.MAC, it is used as the default library.
;226 1-Jul-81 /DLM RSCAN line handled.
; Get why text from new file if possible.
; CANCEL not fail if copy of file gone.
; Better handling of GTJFN failure on STATUS, etc.
; Allow any user if FTANYU.
; See if file already in connected directory before
; COPY'ing with GET.
; Handle busy on update of FILUPD.HST.
; Replace from connected directory.
; No default directory, code cleanup.
;225 8-Jun-81 /DAW Never set CM%RAI flag - it doesn't work well in
; COMND% JSYS unless you do it all the time. Convert
; the library field by hand to uppercase.
;224 4-JAN-80 /DAW Fix running of FILCOM to look nicer when it happens.
;223 3-DEC-79 /DAW Make DELETE work under TOPS20 V3A.
;222 30-NOV-79 /DAW Put user name in log entry.
;221 21-NOV-79 /DAW Fix problem in edit 220, where ALU no longer knew
; if you were connected to a library. Note: This change
; makes .MAZ files be incompatible (since the structure
; name is now included in them).
;220 20-NOV-79 /DLM Features for the TOPS20 project:
; function switches SWRUID and SWBAKF,
; allow .MAZ files to be in a subdirectory of the library,
; and fix ALU to be able to work across structures.
;217 30-OCT-79 /DAW In log file, say "Replaced LIB:file.ext" instead of
; just file.ext.
;216 21-OCT-79 /DAW ADD and DELETE commands implemented
;215 19-OCT-79 /DAW Created ALUPRM.MAC. Got rid of feature-tested code,
; and made them all run-time switches. Changed name
; of command "INFORMATION (about) FEATURE-TEST-SWITCHES"
; to "INFORMATION (about) FUNCTION-CONTROL-SWITCHES"
;214 18-OCT-79 /DAW Add option to STATUS command to just get the status
; of a particular file.
;213 17-OCT-79 /DAW Add another set of parsing routines for secondary
; command parsing. This improves the usefulness of "?"
; and control-U in certain places.
;212 16-OCT-79 /DAW Do RENAMEs instead of COPYs when built with FTFUID=0.
; Make ALU set date/times of files copied around
; just like EXEC copy. ALU only changes file date/times
; now when built with FTFUID=1.
;211 16-OCT-79 /DAW Improve error recovery when writing the MAZ file.
; Created a subroutine WRTMAZ to modularize the problem.
;
;*** VERSION 7 OCT 16,1979 ***
;
;210 16-OCT-79 /DAW Make several changes to make ALU incompatible
; with old versions. Therefore it is now version 7.
;207 15-OCT-79 /DAW Implement "INFORMATION (ABOUT) EXTENSIONS"
;206 15-OCT-79 /DAW Implement automatic copying of generated output
; files to the library along with the reserved
; file when it is replaced. This feature is controlled
; by switch "SWCOPO".
; Make "INFORMATION (ABOUT) FEA" tell about this.
;205 15-OCT-79 /DAW Implement "INFORMATION" command
; (about: USERS, LIBRARIES, FEATURE-TEST-SWITCHES)
;204 14-OCT-79 /DAW Implement feature test FTFUID - if 0, supresses
; changing the UID line in the updated file
;203 24-AUG-79 /DAW Fix STATUS command to 1) Print Library name
; when 1st reserved file on it found, and "no files
; reserved" otherwise; 2) Print actual file name
; that's reserved instead of "MAZ" name.
;202 23-AUG-79 /DAW Get rid of logical names, move EXTS definition
; up to top of file for easy editing.
;201 23-AUG-79 /DAW CHECK FOR "No such generation number" when
; doing a GTJFN for MAZ file.
;
;** VERSION 6 ** JUL 1, 1979
;
;200 1-JUL-79 /DAW INITIAL VERSION TAKEN FROM KRUPANSKY'S
;
;ABSTRACT:
; ALU is a program to aid developers of TOPS20 software products.
;It provides the following:
;
;1) An interlock mechanism on library files. Only one
; person can be editing a particular file at one time.
;
;2) A record of all changes to the library.
;
; The original version of this program was written in
;SNOBOL in 1978 by Jack Krupansky for the COBOL-79 project.
; It became version 6 in July, 1979 when David Wright rewrote
;it in MACRO for performance and maintainability.
; As more in-house developers started using it, feature-test
;switches were added and the formats of things changed, so in
;October, 1979 it became version 7.
; Dan Murphy (who represented the TOPS-20 monitor group)
;made several enhancements after that, and his source was
;merged in July, 1981 with David Wright's latest source to
;become ALU version 10. ALU was also made to work with REDIT
;in July, 1981 to make its capabilities rival those of STEP.
;AC DEFINITIONS
STDAC. ;STANDARD DEFINIIONS FROM MACSYM
;FLAGS
F.HUD==1B0 ;RESERVED FILE HAS A UID LINE
F.NUD==1B1 ;NEW FILE HAS A UID LINE
F.72C==1B2 ;NEW FILE'S UID LINE IS 72 CHARS LONG
F.TLN==1B3 ;TYPED A LIBRARY NAME IN "STATUS" COMMAND
F.FFL==1B4 ;FOUND A FILE IN "STATUS (OF) filespec"
F.QCMD==1B5 ;IN Q COMMAND (QGET)
F.EXIT==1B6 ;EXIT AFTER CURRENT COMMAND
F.SPCR==1B7 ;SPECIAL REPLACE FILESPEC
F.RCPY==1B8 ;Did a COPY vs RENAME when source file was
; REPLACE'd.
F.GCPY==1B9 ;/COPY option on "GET" or "QGET".
F.SUSR==1B10 ;DOING "STATUS USER" COMMAND
;DEFAULT PARAMETERS
PDLSIZ==100 ;SIZE OF PUSHDOWN STACK
TXTLEN==^D100 ;SIZE OF TEXT BUFFER
LOGLEN==^D2000 ;SIZE OF LOG BUFFER
LINLEN==^D80 ;SIZE OF A LINE OF .MAZ FILE
MAXLIN==^D140 ;SIZE OF (FIRST) TEXT LINE IN FILE
WHYLEN==^D100 ;LENGTH OF "WHY" TEXT
FILWDS==^D72 ;Max # words needed to hold a TOPS-20 filespec
CD.LEN==.CDRET+1 ;Number of words needed in a directory block
DEFINE AA(NAME,DATA,FLAGS),< ;MACRO FOR COMMAND TABLES
XWD [IFNB <FLAGS>,<EXP CM%FW!<FLAGS>>
ASCIZ/NAME/],DATA
>
;DECREMENT BYTE POINTER IN GIVEN LOCATION
DEFINE DBP. (LOC)<
MOVNI CX,1
IBP CX,LOC
MOVEM CX,LOC>
DEFINE TEXT (STRING),<
ASCIZ @STRING@
>
DEFINE TYPE (ADDRESS),<
HRROI T1,ADDRESS
PSOUT%>
CRLF==[ASCIZ/
/] ;ADDRESS OF A CRLF
TOINDI==[ASCIZ/ => /] ;Like EXEC "COPY"
SUBTTL START-UP
AENTRY: JRST ST ;FIRST TIME ENTRY
JRST ST1 ;REENTER
ALUVER: BYTE (3)ALUWHO(9)ALUMJR(6)ALUMNR(18)ALUEDT
BENTRY: JRST ST1 ;NORMAL ENTRY
JRST ST1 ;REENTER
BYTE (3)ALUWHO(9)ALUMJR(6)ALUMNR(18)ALUEDT
;HERE IS FIRST TIME ENTRY
ST: RESET%
TDZ F,F ;CLEAR ALL FLAGS
MOVEM F,SAVEF ;SAVE THEM
MOVE P,[IOWD PDLSIZ,PDL]
CALL SETPMP ;SETUP PAGE MAP
CALL WDFLIB ;Figure out which library is the
; default (if any). If none of them
; is, give error and abort.
CALL SETAVR ;Get ASCIZ ALU version number string
MOVEI T1,.FHSLF ;SET ALTERNATE ENTRY VECTOR
MOVE T2,[3,,BENTRY] ;ENTRY VECTOR WORD
SEVEC% ;SET IT
;Set up first-time defaults from assembly switches
MOVEI T1,FTFCOM ;GET FILCOM SWITCH SETTING
MOVEM T1,SWFCOM ;SET IT
MOVEI T1,FTCOPO ;GET COPY REL FILES SWITCH SETTING
MOVEM T1,SWCOPO ;SET IT
MOVEI T1,FTFUID ;UID IN SOURCE FILE SWITCH SETTING
MOVEM T1,SWFUID ;SAVE IT
MOVEI T1,FTRUID ;1= REPLACE UID IN SOURCE ON REPLACE
MOVEM T1,SWRUID
MOVEI T1,FTBAKF
MOVEM T1,SWBAKF
MOVEI T1,FTANYU
MOVEM T1,SWANYU
MOVEI T1,FTGCPY ;1= ASK USER IF HE WANTS A COPY OF FILE
; IF IT WAS RESERVED AND HE DID A "GET"
MOVEM T1,SWGCPY
MOVEI T1,FTREDT ;1= RUN REDIT before REPLACE
MOVEM T1,SWREDT
MOVEI T1,FTCGET ;1= /COPY is the default for GET
MOVEM T1,SWCGET
TYPE <[ASCIZ/[ALU: First-time Initialization complete]
[Type "EXIT" then save ALU to bypass the initialization from now on]
/]>
JRST ST2
;SECONDARY ENTRY POINT AND REENTER ADDRESS
;( ASSUME PAGE MAP AND SWITCHES ARE ALL SET UP)
ST1: MOVE P,[IOWD PDLSIZ,PDL]
MOVE F,SAVEF ;GET SAVED FLAGS
MOVEI T1,.RSINI
RSCAN% ;Get rescan line if any
IFJER.
SETZ T1,
ENDIF.
MOVEM T1,RSCANF ;Note RESCAN waiting
ST2: MOVE T1,[ZROST,,ZROST+1]
SETZM ZROST
BLT T1,ZROEND ;CLEAR ZEROED AREA
SETO T1, ;GET MY TERMINAL NUMBER
MOVE T2,[-1,,T4]
MOVEI T3,.JITNO ;JUST TERMINAL NUMBER
GETJI%
ERJMP SYSERR ;BAD ERROR
TRO T4,.TTDES ;MAKE A TTY DESIGNATOR
MOVEM T4,MYTTY ;SAVE IT
;SEE IF WE HAVE "PRIVS" TO DO ^E COMMANDS
CALL RGUCHK ;CHECK FOR REGISTERED USER
JRST DOSCAN ;NOT, THEN NO PRIVS
MOVE T2,USRBIT ;Get user flags
TXNE T2,E.BIT ;Is E.BIT on?
SETOM MEPRIV ;YES, HE HAS PRIVS TO DO ^E COMMANDS
JRST DOSCAN ;OK TO GO
SUBTTL SYSTEM ERRORS
SYSERR: TMSG <?JSYS ERROR: >
HRRZI T1,.PRIOU ;PRIMARY OUTPUT
HRLOI T2,400000
SETZ T3,
ERSTR%
JRST ERSTRE
JRST ERSTRE
HALTF%
JRST ST ;RESTART PROGRAM IF HE TYPES CONTINUE
ERSTRE: TMSG < ?Can't get JSYS error code!!>
HALTF%
JRST ST
IMPERR: TMSG <? "Impossible" JSYS error: >
CALL LSTFER
TMSG <
(Address of the ERCAL is in AC1)
>
POP P,T1
SUBI T1,1
HALTF%
JRST 1(T1) ;RETURN
SUBTTL COMMAND SCANNER
DOSCAN:
;HERE TO READ NEXT COMMAND
NEWCMD: MOVEI T1,.PRIOU ;Get usual place for command output
SKIPE RSCANF ;RESCAN waiting?
MOVEI T1,.NULIO ;Yes, no output from COMND
HRRM T1,CMDBLK+.CMIOJ
MOVEI T1,CMDBLK ;POINT TO COMMAND BLOCK
MOVEI T2,[FLDDB. (.CMINI)] ;INITIALIZATION FUNCTION
CALL COMMND ;GO DO IT
MOVEM P,SAVEP ;SAVE STACK FOR REPARSING
NEWPAR: MOVE P,SAVEP ;RESTORE THE STACK
SKIPN T1,PRSJFN ;ANY JFN?
JRST NEWPR1 ;NO
RLJFN% ;RELEASE IT
JFCL
SETZM PRSJFN ;CLEAR PARSED JFN
NEWPR1: TXZ F,F.QCMD!F.EXIT!F.SUSR ;Not a Q cmd.
MOVEI T1,CMDBLK ;POINT TO THE COMMAND BLOCK
SKIPN RSCANF ;RESCAN line here?
JRST NEWPR3 ;No
SETZM RSCANF ;Yes, once only
MOVEI T2,[FLDDB. (.CMKEY,,RSCNTB)] ;Yes, special table
COMND%
ERJMP LOSE
TXNE T1,CM%NOP ;Got our name?
JRST NEWCMD ;No, ignore the line quietly
HRRZ P1,0(T2) ;Save dispatch address
MOVEI T2,[FLDDB. (.CMCFM)]
COMND% ;See if line ends here
ERJMP LOSE
TXNN T1,CM%NOP
JRST NEWCMD ;It did, nothing to do
TXO F,F.EXIT ;Remember exit after command
JRST 0(P1) ;Dispatch to command
NEWPR3: SKIPE MEPRIV ;AM I PRIVILEDGED TO DO ^E COMMANDS?
JRST NEWP1A ;YES
MOVEI T2,[FLDDB. (.CMKEY,,CMDTAB)] ;POINT TO COMMAND TABLE
CALL COMMND ;READ THE COMMAND
NEWP1B: MOVE T2,(T2) ;GET ADDRESS OF ROUTINE
CALL (T2) ;CALL IT
TXNE F,F.EXIT ;EXIT after command?
HALTF% ;Yes, done
JRST NEWCMD ;GO GET A NEW COMMAND
NEWP1A: MOVEI T2,FLPR1 ;COMMANDS, AND ^E
CALL COMMND
HRRZ T3,T3 ;GET PARSE BLOCK USED
CAIN T3,FLPR1 ;NORMAL COMMAND?
JRST NEWP1B ;YES
;^E PARSED.. GO GET A ^E COMMAND
MOVEI T2,[FLDDB. (.CMKEY,,CMETAB)]
CALL COMMND
HRRZ T2,(T2)
CALL (T2) ;CALL A CONTROL-E COMMAND
JRST NEWCMD ;AND GET A NEW COMMAND
;PARSING TABLES FOR MAJOR COMMANDS
FLPR1: FLDDB. (.CMKEY,,CMDTAB,,,FLPR2)
FLPR2: FLDDB. (.CMTOK,,<POINT 7,ASCCTE>)
ASCCTE: BYTE (7)5,0 ;CONTROL-E
;TABLE OF COMMANDS
CMDTAB: CMDLEN,,CMDLEN ;HEADER
AA ADD,CMDADD ;ADD A FILE
AA CANCEL,CMDCAN ;CANCEL A GET
AA COMMENT,CMDCOM ;PUT COMMENT INTO FILE
AA DELETE,CMDDEL ;DELETE A FILE FROM A LIBRARY
AA EXIT,CMDEXT ;EXIT
AA FREEZE,CMDFRZ ;FREEZE
AA GET,CMDGET ;GET A FILE
AA HELP,CMDHLP ;HELP
AA INFORMATION,CMDINF ;INFORMATION
AA QGET,CMQGET ;Quick GET (no questions asked)
AA REPLACE,CMDREP ;REPLACE A FILE
AA STATUS,CMDSTT ;STATUS
AA UNFREEZE,CMDUNF ;UNFREEZE
CMDLEN==.-CMDTAB-1 ;NUMBER OF COMMANDS
;CONTROL-E COMMANDS
CMETAB: CMELEN,,CMELEN ;HEADER
AA DDT,CMEDDT
AA SET,CMESET
CMELEN==.-CMETAB-1 ;NUMBER OF ^E COMMANDS
;TABLE OF COMMANDS FOR RESCAN LINE
RSCNTB: RSTLEN,,RSTLEN
AA ALU,NEWPR3
RSTLEN==.-RSCNTB-1
SUBTTL ADD COMMAND
;ADD A NEW SOURCE FILE TO THE LIBRARY
CMDADD: MOVEI T2,[ASCIZ/file/]
CALL NOISE
SETZM JFNBLK ;NO DEFAULTS
MOVE T2,[JFNBLK,,JFNBLK+1]
BLT T2,JFNBLK+20
MOVX T2,GJ%OLD ;GET AN EXISTING FILE
MOVEM T2,JFNBLK+.GJGEN ;STORE FLAGS
MOVEI T2,[FLDDB. (.CMFIL,CM%SDH,,<existing file to put on library>)]
CALL COMMND
HRRZM T2,PRSJFN ;SAVE PARSED JFN
MOVEI T2,[ASCIZ/to/]
CALL NOISE
MOVE T3,[POINT 7,[ASCIZ/(Library to add file to)
/]] ;Get help text
CALL PRSLIB ;Parse library name
CALL BLDINM ;BUILD NAME IN IFINAM
CALL PRSWHY ;GET "WHY" TEXT
MOVX T1,GJ%SHT+GJ%OLD ;SEE IF FILE THERE ALREADY
HRROI T2,IFINAM ;PTR TO NAME
GTJFN%
ERJMP CMDAD1
RLJFN% ;ALREADY THERE, COMPLAIN
JFCL
TMSG <? File already exists on the library
>
RET ;DONE, RETURN
CMDAD1: ;ONE MIGHT CHECK TO MAKE SURE WE ARE GETTING ONE OF THE
;VALID ERROR CODES FROM GTJFN
MOVX T1,GJ%SHT+GJ%NEW ;WRITE FILE TO LIBRARY NOW
HRROI T2,IFINAM
GTJFN%
ERJMP ADDER1 ;ERROR-CAN'T WRITE
MOVEM T1,OJFN ;SAVE THIS JFN
MOVE T1,PRSJFN
MOVEM T1,IJFN ;SET "IJFN", "OJFN"
MOVE T1,IJFN ;READ DATE/TIME OF INPUT FILE
MOVEI T2,RFTAD1
MOVEI T3,2
RFTAD%
CALL OPENO ;GET READY TO WRITE NEW FILE
RET ;ERRORS, FORGET IT
CALL IOPEN ;OPEN FILE FOR READING
JRST [CALL RLOJFN ;ERROR, RELEASE OJFN
RET] ; AND RETURN
SKIPN SWFUID ;PUT UID IN FILE?
JRST ADDCM2 ;NO
;DO A "SLOW" COPY
CALL BLDNUI ;BUILD NEW UID LINE
RET ;ERRORS, RETURN
CALL OUT1ST ;OUTPUT 1ST LINE TO OUTPUT FILE
CALL BYTWRT ;USE BYTE I/O TO COPY THE FILE NOW
JRST ADDCM4 ; DON'T RESET DATE/TIMES
;DO A "FAST" COPY
ADDCM2: CALL PRELD0 ;GET SOME PAGES IN CORE
CALL PPCPY ;PAGE/PAGE COPY
CALL ALUUID ;GET A UID
;MAKE LOG ENTRY
ADDCM4: CALL ADDLOG ;DO A "ADD" LOG ENTRY
;RELEASE FILES
HRRZ T1,OJFN
RLJFN%
JFCL
HRRZ T1,IJFN
RLJFN%
JFCL
RET ;DONE, RETURN
ADDER1: TMSG <?GTJFN FAILED: >
CALL LSTFER
TYPE CRLF
HALTF%
RET
;Routine to parse a library name
; He can either type LIB: on this line or type CRLF here and
;is then prompted for a library name. It is required that he
;actually type the library name, and this routine returns when
;he has typed something.
;Input:
; T3/ help text
;Output:
; LIBNUM/ library number
PRSLIB: MOVEM T3,HPTXTP ;Save help text ptr
MOVEI T2,[FLDDB. (.CMTXT,CM%SDH,,<library:>)]
CALL COMMND ;PARSE THE TEXT
LDB T1,[POINT 7,ATMBUF,6] ;ANYTHING TYPED?
JUMPE T1,GTLNM ;NO, MAKE HIM TYPE SOMETHING
MOVEI T1,ATMBUF ;Convert ATMBUF to uppercase
CALL CNVUPP
MOVE T1,[ATMBUF,,LIBHLD]
BLT T1,LIBHLD+17 ;COPY STRING TO HERE
MOVEI T1,CMDBLK ;String must be followed by CRLF
CALL CONFRM
JRST GOTLNM ;GO CHECK IT
;HERE TO ASK FOR HIM TO TYPE LIBNAM
GTLNM: MOVE T1,HPTXTP ;Get ptr to help text
CALL PR2SET
MOVEI T1,CM2BLK
MOVEI T2,[FLDDB. (.CMTXT,CM%SDH,,<library:>)]
CALL COMMND
LDB T2,[POINT 7,ATM2BF,6] ;ANYTHING TYPED?
JUMPE T2,GTLNM ;NO, TRY AGAIN
MOVEI T1,ATM2BF ;Convert ATM2BF to uppercase
CALL CNVUPP
MOVE T1,[ATM2BF,,LIBHLD] ;COPY IT
BLT T1,LIBHLD+17
MOVEI T1,CM2BLK
CALL CONFRM ;String must end here
;HERE WHEN THERE WAS SOMETHING INPUT FOR LIBRARY NAME. SEE IF OK.
GOTLNM: CALL FNDLIB ;FIND THE LIBARY HE TYPED
JRST GTLNM ;NOT A LIBRARY, GO ASK AGAIN
RET ;Got it, return ok
;CALL: LIBNUM/ # of library
; PRSJFN/ TO GET FILE.EXT
; CALL BLDINM
; <RETURN HERE, WHOLE ASCIZ STRING IN IFINAM>
BLDINM: MOVE T1,[POINT 7,IFINAM] ;OUTPUT TO HERE
MOVE T2,LIBNUM
HRRZ T2,LIBLST(T2)
HRLI T2,(POINT 7,) ;<DIR>
CALL CPYNUL ;COPY TO NUL
HRRZ T2,PRSJFN ;GET JFN
MOVX T3,1B8+1B11+JS%PAF ;FILE.EXT
JFNS%
RET ;RETURN, DONE
;ROUTINE TO CHECK INPUT LIBRARY NAME IN LIBHLD
; IF IT IS A LIBARY, RETURNS .+2, library index in LIBNUM
; IF NOT, TYPES ERROR MESSAGE
FNDLIB: PUSH P,P4 ;Save an ac
MOVSI P4,-NMLIBS ;FIND THE LIBRARY HE TYPED
FNDLB1: HRRZ T1,LB1LST(P4) ;POINT TO A LIBRARY
HRLI T1,(POINT 7,) ;STRING
MOVE T2,[POINT 7,LIBHLD] ;POINT TO INPUT STRING
FNDLB2: ILDB T3,T1
ILDB T4,T2
JUMPE T3,[CALL FNBT4 ;GET FIRST NON-BLANK
JUMPE T4,FNDLB4 ;OK IF BOTH ENDED
JRST FNDLB3] ;TO AOBJN
CAIN T3,(T4) ;STILL THE SAME?
JRST FNDLB2 ;YES, LOOP
FNDLB3: AOBJN P4,FNDLB1 ;LOOP FOR ALL
TMSG <? >
TYPE LIBHLD ;TYPE HIS TEXT
TMSG < is not a library
>
POP P,P4 ;Restore ac
RET ;ERROR MESSAGE, POPJ
;HERE IF LIBRARY MATCHES
FNDLB4: HRRZM P4,LIBNUM ;SET INTERNAL LIBRARY NUMBER
POP P,P4 ;Restore ac
JRST RSKP ;SKIP RETURN
;LITTLE ROUTINE TO IGNORE TRAILING BLANKS
FNBT4: CAIE T4,.CHTAB
CAIN T4," "
CAIA
RET ;NON-BLANK, RETURN
ILDB T4,T2
JRST FNBT4
SUBTTL CANCEL COMMAND
CMDCAN: MOVEI T2,[ASCIZ/file/]
CALL NOISE
MOVE T2,DFLIBW ;GET DEFAULT LIBRARY (OR 0)
MOVEM T2,JFNBLK+.GJDEV
HRRO T2,EXTLST ;DEFAULT EXT - FIRST ONE IN THE LIST.
MOVEM T2,JFNBLK+.GJEXT
MOVX T2,GJ%OLD
MOVEM T2,JFNBLK ;STORE FLAGS
MOVEI T2,[FLDDB. (.CMFIL,CM%SDH,,<file on library you don't want reserved any more>)]
CALL COMMND
HRRZM T2,PRSJFN ;SAVE PARSED JFN
CALL CONFRM ;CONFIRM THE LINE
MOVE T1,PRSJFN
MOVEM T1,GTFJFN ;SAVE "GET" FILE JFN
CALL RGUSR ;GET USER NUMBER FOR ME
RET ;? NOT A REGISTERED USER!
CALL GTFINL ;GET LIBRARY
RET ;? NOT IN A LIBRARY
CALL FNDEXT ;FIND EXTENSION
RET ;CAN'T.. OOPS
;LOOK FOR .MAZ FILE
CALL GMAZNM ;GET MAZ FILENAME
RET ;ERRORS, RETURN
;TRY TO GTJFN IT
MOVX T1,GJ%SHT+GJ%OLD
HRROI T2,MAZNAM
GTJFN%
ERJMP CCANE2 ;NOT THERE -- GO COMPLAIN
MOVEM T1,MAZJFN ;YUP--SAVE JFN OF IT
CALL CHKRME ;MAKE SURE RESERVED BY ME!
RET ;NOT.. RETURN AFTER TYPING ERROR MSG
; FALL...
;DELETE THE RESERVED FILE FROM THE RESERVATION DIRECTORY IF IT IS THERE
MOVE T2,[POINT 7,RDIR]
MOVE T1,[POINT 7,RETJNM] ;MAKE JFN STRING FOR FILE IN AREA IT WAS
;RESERVED IN
CALL CPYNUL ;COPY TO NUL
;USE JFNS TO GET REST OF NAME
MOVE T2,GTFJFN
MOVX T3,1B8+1B11+JS%PAF ;FILENAME.EXT
JFNS%
SETZ T2,
IDPB T2,T1 ;;STORE NULL AT END OF STRING
MOVX T1,GJ%SHT!GJ%OLD
HRROI T2,RETJNM
GTJFN%
ERJMP CCAN1 ;Couldn't find it
PUSH P,T1
TMSG <(Delete >
TYPE RETJNM
TMSG < ?) >
CALL YESNO
JRST [ POP P,T1 ;Recover JFN
RLJFN%
NOP
JRST CCAN1]
POP P,T1 ;Recover JFN
MOVEI T2,0 ;Keep 0 generations
DELNF% ;Delete all generations
ERJMP CCAN1 ;OOPS.. CAN't
RLJFN% ;Release JFN
ERJMP .+1 ; Ah, well, tried
;THEN DELETE .MAZ FILE
CCAN1: HRRZ T1,MAZJFN
DELF%
ERJMP CCANE3 ;OOPS.. CAN'T
RET ;DONE, RETURN
; ERRORS DURING "CANCEL" COMMAND
;GTJFN FAILED FOR MAZ FILE -- PROBABLY NOT RESERVED
CCANE2: CAIE T1,GJFX19 ;NO SUCH FILE TYPE
CAIN T1,GJFX24 ;FILE NOT FOUND
JRST NOTRSV ;YEAH.. NOT RESERVED, YOU FOOL
CAIN T1,GJFX20 ;NO SUCH GENERATION NUMBER (TOPS20 FUNNY)
JRST NOTRSV
TMSG <?GTJFN failed for MAZ file: >
CALLRET LSTFRC ;Type JSYS error, CRLF, then return
NOTRSV: TMSG <% File >
MOVEI T1,.PRIOU ;PREPARE TO TYPE FILENAME
HRRZ T2,GTFJFN
MOVX T3,1B5+1B8+1B11+JS%PAF
JFNS%
TMSG < was not reserved
>
; JRST RLMAZP ;Release MAZJFN and POPJ
;Routine to release MAZJFN
; It must not be opened.
RLMAZP: MOVE T1,MAZJFN
RLJFN% ;RELEASE MAZ FILE
ERJMPS .+1 ;WHO CARES?
RET ;RETURN FROM "CANCEL" COMMAND
CCANE3: TMSG <?DELF failed for MAZ file: >
CALLRET LSTFRC
SUBTTL COMMENT COMMAND
CMDCOM: MOVEI T2,[ASCIZ/for library/]
CALL NOISE
MOVE T3,[POINT 7,[ASCIZ/(Library to comment about)
/]] ;Get help text
CALL PRSLIB ;Parse library name and confirm
CALL RGUSR ;GET USER NUMBER
RET ;HE'S NOT A REGISTERED USER
GETCMT: TMSG <(Type a one-line comment)
>
SETZ T1, ;NO CONTROL-R BUFFER
CALL PR2SET ;SETUP FOR 2ND PARSE
MOVEI T1,CM2BLK ;2ND PARSE BLOCK
MOVEI T2,[FLDDB. (.CMTXT,CM%SDH,,<One-line comment to put in FILUPD.HST>)]
CALL COMMND ;READ THE COMMENT
MOVE T3,[POINT 7,ATM2BF]
ILDB T1,T3
JUMPE T1,GETCMT ;MAKE HIM TYPE SOMETHING
CALL ALUUID ;GET A UID
;DO LOG ENTRY
CALL STLOG ;START THE LOG
MOVE T2,[POINT 7,[ASCIZ/
[Comment by /]]
CALL LOGSTR
MOVE T2,[POINT 7,USRNAM]
CALL LOGSTR
MOVEI T2,"]"
IDPB T2,P1
MOVE T2,[POINT 7,CRLF]
CALL LOGSTR
MOVE T2,[POINT 7,CRLF]
CALL LOGSTR
MOVE T2,[POINT 7,ATM2BF]
CALL LOGSTR ;OUTPUT COMMENT
MOVE T2,[POINT 7,CRLF]
CALL LOGSTR ;AND CRLF
MOVE T2,[POINT 7,CRLF]
CALL LOGSTR ;AND EXTRA CRLF
MOVEI T1,0
IDPB T1,P1 ;NULL TO END IT
CALL ALULOG ;OUTPUT TO LOG FILE
RET ;DONE, RETURN
SUBTTL DELETE COMMAND
CMDDEL: MOVEI T2,[ASCIZ/file/]
CALL NOISE
MOVE T2,DFLIBW ;GET DEFAULT LIBRARY (OR 0)
MOVEM T2,JFNBLK+.GJDEV
HRRO T2,EXTLST ;DEFAULT EXT - FIRST ONE IN THE LIST.
MOVEM T2,JFNBLK+.GJEXT
MOVX T2,GJ%OLD
MOVEM T2,JFNBLK+.GJGEN ;STORE FLAGS
MOVEI T2,[FLDDB. (.CMFIL,CM%SDH,,<existing file in a library>)]
CALL COMMND
HRRZM T2,PRSJFN ;SAVE PARSED JFN
CALL CONFRM ;CONFIRM THE LINE
MOVE T1,PRSJFN
MOVEM T1,GTFJFN ;SAVE "GET" FILE JFN
CALL GTFINL ;GET WHICH LIBRARY IT'S IN
RET ;ISN'T IN ANY, RETURN
CALL RGUSR ;GET MY USER NUMBER
RET ;? NOT A REGISTERED USER
CALL FNDEXT ;FIND EXTENSION
RET ;CAN'T.. RETURN
;MAKE SURE FILE ISN'T RESERVED BY SOMEONE
CALL SKPFRF ;SKIP IF LIBRARY FROZEN
IFSKP.
HRRZ P1,T1 ;SAVE JFN
TMSG <?Library is frozen.
>
JRST CDELE8
ENDIF.
CALL GMAZNM ;GET .MAZ FILENAME
RET ;ERRORS.. RETURN
MOVX T1,GJ%SHT+GJ%OLD
HRROI T2,MAZNAM
GTJFN%
ERJMP CDELE2 ;FAILED.. MIGHT BE OK
;FILE WAS THERE.. COMPLAIN TO HIM
CDELE7: HRRZ P1,T1 ;JFN IN P1
CDELE8: TMSG <?>
CALL TYPFIL ;TYPE THE .MAZ FILE OUT
HRRZ T1,P1 ;RELEASE .MAZ FILE
RLJFN%
JFCL ;ERRORS ARE BAD.
RET ;RETURN TO RELEASE PRSJFN (SOURCE FILE)
;GTJFN FAILED FOR .MAZ FILE.. HOPEFULLY FILE-NOT-FOUND
CDELE2: CAIE T1,GJFX24 ;FILE NOT FOUND
CAIN T1,GJFX19 ;NO SUCH FILE TYPE
JRST CDELT3 ;OK TO DELETE THE FILE
CAIN T1,GJFX20 ;NO SUCH GENERATION NUMBER
JRST CDELT3 ;IS OK TOO
JRST EGTMAZ ;GO COMPLAIN THAT GTJFN FAILED
;HERE IF NO .MAZ FILE EXISTS.. OK TO DELETE IT
CDELT3: CALL PRSWHY ;ASK HIM FOR ONE-LINE COMMENT
SKIPN SWBAKF ;USING BACKUP FILES?
JRST CDELT4 ;NO
;DELETE BACKUP TOO IF THERE
HRROI T1,RETJNM
HRRZ T2,GTFJFN
MOVX T3,1B2+1B5+1B8+JS%PAF ;<DIRECTORY>FILE
JFNS%
HRRZ T2,EXTNUM ;WHICH EXTENSION?
HRRZ T2,EXBLST(T2) ;GET A BACKUP EXTENSION
HRLI T2,(POINT 7,) ;POINT TO IT
MOVEI T3,"." ;APPEND A DOT FIRST
IDPB T3,T1
CALL CPYNUL ;COPY STRING
MOVX T1,GJ%SHT+GJ%OLD ;SEE IF WE CAN FIND BACKUP TOO
HRROI T2,RETJNM
GTJFN%
ERJMP CDELT4 ;NO, FORGET IT
;DELETE FILE, THEN BACKUP
MOVE P3,T1 ;SAVE JFN OF BACKUP TO DELETE
HRRZ T1,GTFJFN ;DELETE SOURCE
MOVEI T2,0 ;KEEP 0 GENERATIONS
DELNF% ;Delete it, keep JFN
ERJMP CDELE4 ;CAN'T
HRRZ T1,P3 ;DELETE BACKUP
MOVEI T2,0 ;KEEP 0 GENERATIONS
DELNF%
ERJMP CDELE5
RLJFN% ;Release backup JFN
ERJMP .+1 ; Tried..
TYPE <[ASCIZ/[Deleted /]>
TYPE RETJNM
TYPE <[ASCIZ/ also]
/]>
CDELT5: CALL ALUUID ;GO ALLOCATE A UID
CALL LOGDEL ;A DELETE LOG ENTRY
RET ;RETURN--DONE
;NO BACKUP.. JUST DELETE SOURCE FILE
CDELT4: HRRZ T1,GTFJFN
MOVEI T2,0 ;KEEP 0 GENERATIONS
DELNF% ;DELETE ALL GENERATIONS
ERJMP CDELE3 ;ERROR
JRST CDELT5 ;OK, FINISH
;DELETE ERRORS
CDELE3: TMSG <?Can't delete file: >
CALLRET LSTFRC ;Type why, CRLF and return to release PRSJFN
CDELE4: TMSG <?Can't delete file: >
CDELE6: CALL LSTFRC ;Type why
HRRZ T1,P3 ;RELEASE BACKUP JFN
RLJFN%
JFCL ;CAN'T
RET ;RETURN TO RELEASE PRSJFN
CDELE5: TMSG <?Can't delete >
TYPE RETJNM ;<DIR>FILE.EXT
TMSG <: >
JRST CDELE6 ;GO FINISH ERROR RECOVERY
SUBTTL EXIT COMMAND
CMDEXT: CALL CONFRM
;SEE IF ANY FUNCTION-SWITCHES HAVE BEEN CHANGED.. IF SO, TELL HIM TO
; SAVE A COPY TO RETAIN THESE CHANGES.
SKIPN CNFCOM
SKIPE CNCOPO
JRST CMDEX1 ;SAY "SAVE"
SKIPN CNFUID
SKIPE CNRUID
JRST CMDEX1
SKIPN CNBAKF
SKIPE CNANYU
JRST CMDEX1 ;SAY "SAVE"
SKIPN CNGCPY
SKIPE CNREDT
JRST CMDEX1 ;SAY "SAVE"
SKIPE CNCGET
JRST CMDEX1 ;SAY "SAVE"
CMDEX2: HALTF%
SETZM CNFCOM ;ASSUME HE DID SAVE
SETZM CNCOPO
SETZM CNFUID
SETZM CNRUID
SETZM CNBAKF
SETZM CNANYU
SETZM CNGCPY
SETZM CNREDT
SETZM CNCGET
RET ;CONTINUE
CMDEX1: TYPE <[ASCIZ/
[Type "SAVE ALU:ALU" to retain the function changes you made]
/]>
JRST CMDEX2
SUBTTL FREEZE COMMAND
CMDFRZ: MOVEI T2,[ASCIZ /library/]
CALL NOISE
MOVEI T2,[FLDDB. (.CMTXT,CM%SDH,,<library name:>)]
CALL COMMND
LDB T1,[POINT 7,ATMBUF,6]
JUMPE T1,[TMSG <?"library:" expected.
>
RET]
MOVEI T1,ATMBUF
CALL CNVUPP
MOVE T1,[ATMBUF,,LIBHLD]
BLT T1,LIBHLD+17
CALL FNDLIB ;LOOKUP LIBRARY NAME
RET
CALL SKPFRL ;SEE IF ALREADY FROZEN
IFSKP.
HRRZ P1,T1 ;SAVE JFN
TMSG <?Library is already frozen.
>
CALL TYPFIL ;TYPE MESSAGE
HRRZ T1,P1
RLJFN%
ERJMPS .+1
RET
ENDIF.
MOVX T1,GJ%SHT ;NOT ALREADY FROZEN, CREATE FREEZE FILE
HRROI T2,MAZNAM
GTJFN%
IFJER.
TMSG <?Can't create freeze file because:
>
CALL LSTFRC ;TYPE ERR MSG
RET
ENDIF.
HRRZM T1,MAZJFN
MOVX T2,7B5+OF%WR
OPENF%
IFJER.
TMSG <?Can't open freeze file because:
>
CALL LSTFRC
HRRZ T1,MAZJFN
RLJFN%
ERJMPS .+1
RET
ENDIF.
MOVEI T3,[ASCIZ /! Frozen by /]
CALL MAZSTR
JRST FATAL
MOVEI T3,USRNAM
CALL MAZSTR
JRST FATAL
MOVEI T3,[ASCIZ / on /]
CALL MAZSTR
JRST FATAL
CALL MAZTIM ;WRITE TIME TO FILE
JRST FATAL
MOVEI T3,[ASCIZ /
/]
CALL MAZSTR
JRST FATAL
HRRZ T1,MAZJFN
CLOSF%
ERJMPS .+1
RET
SUBTTL GET COMMAND
CMQGET: TXO F,F.QCMD ;Quick version
CMDGET: SKIPN SWCGET ;COPY-ON-GET?
TXZA F,F.GCPY ;No, default is /NOCOPY
TXO F,F.GCPY ;Yes, default is /COPY
MOVEI T2,[ASCIZ/file/]
CALL NOISE
MOVE T2,DFLIBW ;GET DEFAULT LIBRARY (OR 0)
MOVEM T2,JFNBLK+.GJDEV
HRRO T2,EXTLST ;DEFAULT EXT - FIRST ONE IN THE LIST.
MOVEM T2,JFNBLK+.GJEXT
MOVX T2,GJ%OLD
MOVEM T2,JFNBLK+.GJGEN ;STORE FLAGS
MOVEI T2,[FLDDB. (.CMFIL,CM%SDH,,<existing file in a library>)]
CALL COMMND
HRRZM T2,PRSJFN ;SAVE PARSED JFN
MOVEI T2,FLCPCF ;Switch or CRLF
CALL COMMND
HRRZ T3,T3 ;Which parse block?
CAIN T3,FLGCF ;CRLF?
JRST GTDPRS ;yes, done parse
HRRZ T2,(T2) ;Get address of routine to call
CALL (T2) ;Call it
CALL CONFRM ;Confirm the command
JRST GTDPRS ;OK, done parsing
FLCPCF:
FLGCF: FLDDB. (.CMCFM,,,,,FLGTSW)
FLGTSW: FLDDB. (.CMSWI,,GTSWTT)
GTSWTT: NMGTSW,,NMGTSW ;Header
AA COPY,GTSWCP
AA NOCOPY,GTSWNC
NMGTSW==.-GTSWTT-1 ;Number of "GET" switches
;/COPY
GTSWCP: TXOA F,F.GCPY
;/NOCOPY
GTSWNC: TXZ F,F.GCPY
RET
;Here when done parse of "GET" command
GTDPRS: MOVE T1,PRSJFN
MOVEM T1,GTFJFN ;SAVE "GET" FILE JFN
CALL GTFINL ;GET WHICH LIBRARY THE FILE IS IN
RET ;ISN'T IN ANY, RETURN
CALL RGUSR ;GET MY USER NUMBER
RET ;? NOT A REGISTERED USER, RETURN
CALL FNDEXT ;FIND EXTENSION
RET ;CAN'T.. RETURN
CALL GETCD ;GET MY CONNECTED DIRECTORY
;AND MAKE SURE IT'S NOT A LIBRARY
;SEE IF FILE IS RESERVABLE
; (LOOKUP ".MAZ" FILE.. IF IT'S THERE, WE CAN'T DO IT)
CALL SKPFRF ;SEE IF LIBRARY FROZEN
IFSKP.
HRRZM T1,P1 ;SAVE JFN
TMSG <
%Library is frozen.
>
CALL TYPFIL ;TYPE OUT INFO
MOVE T1,P1
RLJFN%
ERJMPS .+1
ENDIF.
CALL GMAZNM ;GET .MAZ FILENAME
RET ;ERRORS.. RETURN
;NOW LOOK IT UP
MOVX T1,GJ%SHT+GJ%OLD
HRROI T2,MAZNAM
GTJFN%
ERJMP CMGET8 ;ASSUME MERELY NOT THERE
;ERJMP CGETE2 ;FAILED.. MIGHT BE OK
;FILE WAS THERE.. COMPLAIN TO HIM
;OPEN IT
HRRZM T1,MAZJFN
MOVX T2,7B5+OF%RD
OPENF%
ERJMP CGETE6 ;CAN'T OPEN IT
HRRZ T1,MAZJFN
BIN%
ERJMP CMGT7B
CAIN T2,"!" ;CHANGE FIRST BYTE
MOVEI T2,"?"
HRRZ T1,T2
PBOUT%
;TYPE IT OUT
CMGT7A: HRRZ T1,MAZJFN
BIN%
ERJMP CMGT7B
HRRZ T1,T2
PBOUT%
JRST CMGT7A
;HERE WHEN WE GOT TO EOF AFTER TYPING OUT THE .MAZ FILE FOR HIM
; CLOSE IT, AND GIVE HIM THE OPTION OF COPYING IT ANYWAY.
CMGT7B: HRRZ T1,MAZJFN
CLOSF%
ERJMP .+1 ;IGNORE ERRORS CLOSING FILE
SKIPN SWGCPY ;Skip if giving user the option
RET ;Assume no copy wanted
TMSG < Do you want a copy anyway? (Answer YES or NO): >
CALL YESNO
RET ;"NO"
JRST GTCOPY ;GO GET A COPY
;HERE IF OK TO GET THE FILE - GET "TILL" TEXT
CMGET8: TXNE F,F.QCMD ;QGET?
JRST [ MOVE T1,[POINT 7,TILTXT] ;Yes, default TILTXT
MOVE T2,[POINT 7,[ASCIZ/One hour/]]
CALL CPYNUL
MOVE T2,T1 ;Dest byte ptr
JRST DONTT1]
MOVE T1,[POINT 7,[ASCIZ/(Till when?) /]]
CALL PR2SET ;SET UP FOR 2ND PARSE
MOVEI T1,CM2BLK ;USE 2ND COMND BLOCK
MOVEI T2,[FLDDB. (.CMTXT,CM%SDH,,<One-line comment for STATUS information>)]
CALL COMMND
; COPY ANSWER TO TILTXT - MAKE SURE THERE IS SOMETHING THERE, AND APPEND ".."
MOVE T3,[POINT 7,ATM2BF] ;FROM HERE
MOVE T2,[POINT 7,TILTXT] ;TO HERE
DO.
ILDB T1,T3 ;GET A CHAR
CAIE T1,.CHTAB
CAIN T1," "
LOOP. ;IGNORE LEADING SPACES AND TABS
ENDDO.
;GOT FIRST NON-BLANK
JUMPE T1,DEFTIL ;IF NOTHING THERE, GIVE DEFAULT ANSWER
;STORE CHARS UNTIL NULL
NXTIL: IDPB T1,T2
ILDB T1,T3
JUMPN T1,NXTIL
MOVEI T1,"."
IDPB T1,T2
IDPB T1,T2 ;".."
JRST DONTT1 ;DONE TILL
;IF NULL ANSWER TO "TILL WHEN", STORE DEFAULT ANSWER
DEFTIL: MOVEI T3,"?"
IDPB T3,T2
DONTT1: MOVEI T1,.CHCRT
IDPB T1,T2
MOVEI T1,.CHLFD
IDPB T1,T2
SETZ T1, ;NULL TO END IT
IDPB T1,T2
; JRST DONTTX
;WRITE RESERVED MARKER
DONTTX: CALL WRTMAZ ;WRITE THE MAZ FILE
RET ;ERRORS, RETURN
; ** READY TO COPY FILE **
;NOW ACTUALLY COPY THE FILE TO MY AREA
GTCOPY: TXNN F,F.GCPY ;Get a copy?
RET ;No, all done
MOVE T1,GTFJFN
MOVEM T1,IJFN ;FROM HERE
MOVE T2,[POINT 7,CD] ;TO CONNECTED DIRECTORY
MOVE T1,[POINT 7,RETJNM] ;STORE FILENAME TO ENTER HERE
CALL CPYNUL ;COPY STRING
HRRZ T2,GTFJFN
MOVX T3,1B8+1B11+JS%PAF ;NAME.EXT
JFNS%
SETZ T2,
IDPB T2,T1 ;STORE NULL AT END
;SEE IF FILE ALREADY THERE
MOVX T1,GJ%SHT+GJ%OLD
HRROI T2,RETJNM
GTJFN%
ERJMP GTCPY2 ;Isn't, good
RLJFN% ;Didn't really want this JFN
NOP
TMSG <% File >
TYPE RETJNM ;Advise user
TMSG < already exists.
(Supersede?) >
CALL YESNO
RET ;"NO" -- quit.
GTCPY2:
;GET A JFN FOR THIS FILE
MOVX T1,GJ%SHT+GJ%FOU
MOVE T2,[POINT 7,RETJNM]
GTJFN%
ERJMP CGETE8 ;?CAN'T GET A JFN FOR IT
MOVEM T1,OJFN ;OUTPUT FILE JFN
MOVE T1,IJFN ;GET DATE/TIME STUFF FROM FILE NOW
MOVEI T2,RFTAD1
MOVEI T3,2
RFTAD%
CALL PRELOD ;PRELOAD PAGES TO START (OPENS FILE)
CALL OPENO ;OPEN OUTPUT FILE
RET ;ERRORS, GIVE UP
CALL PPCPY ;PAGE/PAGE COPY
MOVE T1,IJFN
RLJFN%
IFJER.
TMSG <% Couldn't release JFN for IFILE
>
ENDIF.
MOVE T1,OJFN
RLJFN%
IFJER.
TMSG <% Couldn't release JFN for OFILE
>
ENDIF.
RET ;RETURN
;ROUTINE TO WRITE THE MAZ FILE
;ASCIZ NAME IS IN "MAZNAM"
;RETURNS .+1 IF ERRORS, .+2 IF OK
WRTMAZ: MOVX T1,GJ%SHT
HRROI T2,MAZNAM
GTJFN%
ERJMP WRTME1
;OPEN FOR OUTPUT, AND WRITE THE MESSAGE INTO IT
HRRZM T1,MAZJFN
MOVX T2,7B5+OF%WR
OPENF%
ERJMP WRTME2 ;OPENF FAILED
MOVEI T3,[ASCIZ/! Reserved by /]
CALL MAZSTR ;WRITE STRING TO .MAZ FILE
JRST WRTMZA ;QUOTA EXCEEDED, GO TRY AGAIN
MOVEI T3,USRNAM ;Get user name
CALL MAZSTR ;WRITE IT
JRST WRTMZA ;GOT QUOTA EXCEEDED
MOVEI T3,[ASCIZ/ at /]
CALL MAZSTR
JRST WRTMZA ;QUOTA EXCEEDED
MOVEI T3,CD ;PRINT THIS
CALL MAZSTR
JRST WRTMZA ;QUOTA EXCEEDED
MOVEI T3,[ASCIZ/ on /]
CALL MAZSTR
JRST WRTMZA
CALL MAZTIM ;WRITE TIME TO .MAZ FILE
JRST WRTMZA
MOVEI T3,[ASCIZ/
! till /]
CALL MAZSTR
JRST WRTMZA
MOVEI T3,TILTXT ;INPUT LINE
CALL MAZSTR ;APPEND THAT TOO
JRST WRTMZA ;QUOTA EXCEEDED
;CLOSE AND RELEASE IT
HRRZ T1,MAZJFN
CLOSF%
ERJMP WRTMZC ;CAN'T CLOSE AND RELEASE FILE
AOS (P) ;RETURN OK
RET
;HERE TO TRY AGAIN IF QUOTA EXCEEDED HAS BEEN FIXED
WRTMZA: HRRZ T1,MAZJFN ;RELEASE JFN AND TRY AGAIN
CLOSF%
ERJMP WRTMZC ;GEEZ, WHAT'S THIS THEN?
JRST WRTMAZ ;GO TRY AGAIN
WRTMZC: CALL CHKQTE ;MAYBE QUOTA EXCEEDED AGAIN?
JRST WRTMZA ;YES
TMSG <?Can't close MAZ file: >
CALL LSTFER
HALTF% ;SOMETHING BAD
JRST .-1 ;DON'T RECOVER
;HERE IF OUTPUT GTJFN FAILED
WRTME1: TMSG <? GTJFN failed for >
TYPE MAZNAM
TMSG <: >
CALL LSTFER ;SAY WHY
HALTF% ;LET HIM DO STUFF
JRST WRTMAZ ;TRY AGAIN IF "CONTINUE"
;HERE IF OPENF FAILED FOR WRITING MAZ FILE
WRTME2: TMSG <?OPENF failed for >
TYPE MAZNAM
TMSG <: >
CALL LSTFER ;SAY WHY
HALTF%
HRRZ T1,MAZJFN ;HE TYPED "CONTINUE", RELEASE IT'S JFN
RLJFN%
JFCL ;ALL ERRORS ARE VERY BAD!
JRST WRTMAZ ;AND GO TRY AGAIN
;ERRORS IN "GET" CODE
CGETE2: CAIE T1,GJFX24 ;FILE NOT FOUND
CAIN T1,GJFX19 ;NO SUCH FILE TYPE
JRST CMGET8 ;OK TO GET THE FILE
;23-AUG-79 /DAW EVEN THOUGH WE DIDN'T SUPPLY A GENERATION NUMBER,
; GTJFN RETURNS "NO SUCH GENERATION NUMBER" IF AN OLD COPY WAS
; DELETED ON THE LIBARY.
CAIN T1,GJFX20 ;NO SUCH GENERATION NUMBER
JRST CMGET8 ; (MEANS OLD .MAZ IS DELETED)
EGTMAZ: TMSG <? GTJFN failed for >
TYPE MAZNAM
TMSG <: >
CALL LSTFER ;SAY WHY
HALTF%
RET
CGETE6: TMSG <?OPENF failed for MAZ file: >
CALL LSTFER
HALTF%
RET
CGETE8: TMSG <?GTJFN failed for output file: >
CALLRET LSTFRC ;Type why, CRLF and return
SUBTTL REPLACE COMMAND
CMDREP: MOVEI T2,[ASCIZ/file/]
CALL NOISE
MOVE T2,DFLIBW ;GET DEFAULT LIBRARY (OR 0)
MOVEM T2,JFNBLK+.GJDEV
HRRO T2,EXTLST ;DEFAULT EXT (THE FIRST ONE)
MOVEM T2,JFNBLK+.GJEXT
MOVX T2,GJ%OLD
MOVEM T2,JFNBLK+.GJGEN ;STORE FLAGS
MOVEI T2,[FLDDB. (.CMFIL,CM%SDH,,<existing file in a library>)]
CALL COMMND
HRRZM T2,PRSJFN
CALL CONFRM
TXZ F,F.SPCR ;No special filespec
TXZ F,F.RCPY ;Clear "DID A COPY" flag
MOVE T1,PRSJFN
MOVEM T1,GTFJFN ;SAVE JFN OF THE FILE WE "GOT"
CALL GTFINL ;GET LIBRARY NUMBER WHERE FILE IS
RET ;?NOT IN A LIBRARY
CALL RGUSR ;Check user access
RET ; ?Not allowed to use ALU replace.
CALL FNDEXT ;FIND EXTENSION
RET ;CAN'T.. RETURN
CALL GETCD ;GET CONNECTED DIRECTORY
; DON'T LET IT BE A LIBRARY
;MAKE SURE FILE IS RESERVED.. LOOKUP ".MAZ" FILE
CALL SKPFRF ;SKIP IF FREEZE IN EFFECT
IFSKP.
HRRZM T1,MAZJFN ;SAVE JFN
CALL CHKFME ;YES, SEE IF BY ME
RET ;NO, LOSE
TMSG <%You have this library frozen.
>
ENDIF.
CALL GMAZNM ;BUILD .MAZ FILE NAME
RET ;ERROR
;LOOK IT UP
MOVX T1,GJ%SHT+GJ%OLD
HRROI T2,MAZNAM
GTJFN%
ERJMP REPLE1 ;FAILED.. COMPLAIN
HRRZM T1,MAZJFN ;SAVE JFN OF IT
CALL CHKRME ;CHECK TO SEE IF FILE IS RESERVED BY ME..
RET ;NO, RETURN
;CHECK TO SEE IF HE IS CONNECTED TO
;THE SAME AREA WHERE THE RESERVED FILE WAS PUT WITH "GET"
;If not, give warning and find out what he wants to do.
CALL CHKCNN ;This may set F.SPCR
SKIPE SWRUID ;Replacing UID?
SKIPN SWFUID ; and putting UID in file?
JRST CMDRE5 ; NO, DON'T OPEN AND READ RESERVED FILE
;LOOKUP RESERVED FILE AND SEE IF IT WAS MODIFIED
;THE FOLLOWING CODE IS EXECUTED IN VERSIONS OF ALU THAT WANT
; TO MODIFY THE FIRST LINE OF THE FILE TO PUT IN INFORMATION
; ABOUT THE LAST MODIFICATION OF THE FILE. IT MAKES A CHECK
; TO SEE IF THE RESERVED FILE HAS BEEN MODIFIED ON THE LIBRARY.
CMDRE2: TXZ F,F.HUD!F.NUD!F.72C ;CLEAR "OLD FILE HAS A UID"
SETZM UID1 ;DON'T KNOW UID OF FILE ON MY AREA YET
MOVE T1,GTFJFN
MOVX T2,OF%RD+7B5 ;READ OLD FILE
OPENF% ;OPEN IT
ERJMP REPLE2 ;?CAN'T
;READ 1ST LINE
CMDRE3: SETZM RFBUF ;CLEAR BUFFER
MOVE T1,[RFBUF,,RFBUF+1]
BLT T1,RFBUF+.RFLN-1
HRRZ T1,GTFJFN ;FROM HERE
MOVE T2,[POINT 7,RFBUF] ;TO HERE
MOVEI T3,LINLEN ;80 CHARS MAX
MOVEI T4,.CHLFD ;TERMINATE WITH A LINE FEED
SIN%
IFJE. (R)
CAIE T1,IOX4 ;END OF FILE REACHED?
JRST REPLE3 ;NO, UNEXPECTED ERROR
ENDIF.
;CLOSE BUT DON'T RELEASE JFN
CMDRE4: HRRZ T1,GTFJFN
TXO T1,CO%NRJ ;DON'T RELEASE JFN
CLOSF%
ERJMP REPLE4 ;OOPS.. CAN'T
;Here for all flavours of REPLACE.
; We have GTFJFN/ file on library to replace.
;We have confirmed that the user is not connected to a library,
; and the file was indeed reserved by him.
; Now we must get IJFN/ file to replace it with.
;See if file is on the connected directory.
CMDRE5: MOVE T1,[POINT 7,RETJNM]
MOVE T2,[POINT 7,CD] ;Start with connected directory
CALL CPYNUL
HRRZ T2,GTFJFN ;NOW APPEND FILENAME
MOVX T3,1B8+1B11+JS%PAF ;JUST NAME.EXT
JFNS%
JXN F,F.SPCR,REPL81 ;Jump if special filename
MOVX T1,GJ%SHT+GJ%OLD
MOVE T2,[POINT 7,RETJNM]
GTJFN%
ERJMP REPLE6 ;Can't find new source file!
JRST REPL82
REPLE6: TMSG <% File >
TYPE RETJNM
TMSG < not found
>
REPL81: MOVE T1,[POINT 7,[ASCIZ/(Type alternate filespec) /]]
CALL PR2SET ;SETUP 2ND PARSE
SETZM JFNBLK ;NO DEFAULTS
MOVE T2,[JFNBLK,,JFNBLK+1]
BLT T2,JFNBLK+20
MOVX T2,GJ%OLD ;GET AN EXISTING FILE
MOVEM T2,JFNBLK+.GJGEN ;STORE FLAGS
MOVEI T1,CM2BLK ;USING THIS PARSE BLOCK NOW
MOVEI T2,FLCRFS ;CR to forget it, or filespec.
CALL COMMND ;PARSE IT
HRRZ T3,T3 ;Which parse block used?
CAIN T3,FLCFM ;CRLF = "forget this REPLACE"?
CALLRET RLMAZP ;Release MAZJFN, return from REPLACE command.
MOVE T1,T2 ;Good filespec, Get JFN
JRST REPL82
;Parse blocks
FLCRFS:
FLCFM: FLDDB. (.CMCFM,CM%SDH,,<CRLF to quit the UPDATE>,,FLFS1)
FLFS1: FLDDB. (.CMFIL,CM%SDH,,<New source file>)
;Here when we got T1/ JFN of new source file
REPL82: MOVEM T1,IJFN ;SAVE AS INPUT JFN
;Get date/time info for IJFN and store in RFTAD1
MOVE T1,IJFN ;READ DATE/TIME OF INPUT FILE
MOVEI T2,RFTAD1
MOVEI T3,2
RFTAD%
;GET NAME IN "IFINAM"
MOVE T1,[POINT 7,IFINAM]
HRRZ T2,IJFN
MOVX T3,1B2+1B5+1B8+1B11+JS%PAF ;DEVICE:<DIRECTORY>FILENAME.EXT
JFNS%
;GET COMPLETE NAME IN "FROMFL"
MOVE T1,[POINT 7,FROMFL]
MOVE T2,IJFN ; "FROM" THIS FILE
MOVX T3,1B2+1B5+1B8+1B11+1B14+JS%PAF
JFNS%
CALL SETMAB ;GET MABJFN, OJFN
RET ;ERRORS
SKIPN SWFUID ;Using UID in file?
JRST NOUSUD ;No
; ** Here when ALU wants to put a new UID in the file **
TXO F,F.RCPY ;Set "Did a COPY" (vs. RENAME) flag.
CALL OPENO ;GET READY TO WRITE NEW FILE
RET ;ERRORS, FORGET IT
CALL IOPEN ;OPEN FILE FOR READING
JRST [CALL RLOJFN ;ERRORS, RELEASE OJFN
RET] ; AND RETURN
SKIPE SWRUID ;REPLACING UID?
JRST ASKWHY ;Yes, don't read new file yet
;See if file has comment as first line which can be used as
;WHY text. It must not look like a UID line or an edit line.
;REDIT has not yet been called.
CALL RDLIN1 ;Read first line of new file
MOVE P1,[POINT 7,RFBUF] ;PTR to first line
ILDB T1,P1 ;LOOK AT FIRST CHAR
CAIE T1,";" ;A COMMENT CHAR?
CAIN T1,"!"
SKIPA ;YES
JRST ASKWHY ;NO, MUST ASK
ILDB T1,P1 ;CHECK NEXT CHAR
CAIN T1,"<" ;PROBABLY EDIT LINE?
JRST ASKWHY ;YES, LOSE
CAIE T1," " ;POSSIBLE START OF UID LINE?
JRST NASKW ;NO, OK
MOVE T2,[POINT 7,[ASCIZ/UPD ID= /]]
CALL CMPSTR ;PROBABLY UID LINE?
SKIPA ;NO
JRST ASKWHY ;YES, LOSE
NASKW: MOVE T1,[POINT 7,WHYTXT]
MOVE T2,[POINT 7,RFBUF]
IBP T2 ;SKIP COMMENT CHAR
CALL CPYNUL ;COPY LINE TO WHY TEXT
JRST NORUI0 ;GO COPY FILE
;GET "WHY" TEXT
;REDIT HAS NOT YET BEEN CALLED.
ASKWHY: CALL PRSWHY ;PARSE WHY TEXT
SKIPN SWRUID ;REPLACING UID?
JRST NORUI0 ;NO
;SEE IF RESERVED FILE HAS A UID LINE
MOVE P1,[POINT 7,RFBUF] ;LOOK FOR ; OR !
ILDB T1,P1
CAIE T1,";"
CAIN T1,"!" ;EITHER IS OK
CAIA
JRST NORUID ;NOPE, NO UID LINE THEN
MOVE T2,[POINT 7,[ASCIZ/ UPD ID= /]] ;THIS MUST BE NEXT
CALL CMPSTR ;COMPARE STRINGS
JRST NORUID ;NO UID LINE
TXO F,F.HUD ; ELSE WE DID FIND ONE
CALL PRELD0 ;READ SOME PAGES IN
HRRZ T1,STIPG2 ;WHERE DOES IT START IN CORE?
MOVE T1,(T1) ; SEE IF FIRST PAGE EXISTS
ERJMP NOPG0 ;? NO, DON'T ALLOW COPY
CALL CHKNUD ;CHECK FOR NEW FILE'S UID
; (SETS OR CLEARS FLAGS; ONLY 1 RETURN)
;COMPARE UID STRING TO SEE IF RESERVED FILE WAS MODIFIED
HRRZ P1,STIPG2
HRLI P1,(POINT 7,) ;POINTER TO "FILE" STRING
MOVE T2,[POINT 7,RFBUF] ;POINTER TO OLD UID STRING
CALL CMPSTR ;SKIP IF EQUAL
JRST RSVFMD ; ? RESERVED FILE WAS MODIFIED
;If he wants to replace it anyway,
; RSVFMD returns to either GOUPDC or GOCOP
;** Come here to copy the file with UID replacement **
;COPY THE FILE. FLAGS F.HUD, F.NUD, AND F.72C ARE CORRECT
;REDIT HAS NOT YET BEEN CALLED
GOUPDC: TXNN F,F.72C ;IF UID LINE NOT 72 CHARS,
JRST GOSLOW ;GO DO SLOW COPY
;EXACTLY 72 CHARS IN THIS UID LINE.. JUST REPLACE IT AND CALL
; FAST COPY ROUTINE
CALL BLDNUI ;BUILD NEW UID
RET ;ERRORS.. RETURN
;REPLACE 72 CHARS IN FILE WITH 72 CHARS IN UIDTXT..
MOVEI T1,UIDTXT ;POINTER TO UID TEXT
MOVEM T1,FSTLIN ;TELL PPCPY WHERE IT IS
;Here when ready to copy, NEWUID set up.
GOCOP: SKIPE SWREDT ;Call REDIT before replace?
CALL CALRDT ;Yes, do it
CALL DORNAM ;RENAME OLD MAC TO MAB
RET ;?CAN'T
;Here when we are ready to copy new source file to place where
; the old source file was.
;REDIT has been called if necessary.
; Both new source (OJFN) and old source (IJFN) are OPEN.
GOCUID: CALL PPCPY ;DO PAGE COPY
SCPPDN: HRRZ T1,IJFN ;NOW DELETE FILE ON MY AREA
MOVEI T2,0 ;KEEP 0 GENERATIONS
DELNF% ;Delete file(s)
IFJER.
TMSG <%Can't delete >
TYPE IFINAM ;TYPE THE NAME
TMSG <: >
CALL LSTFER ;TYPE WHY
TMSG <, continuing...
>
ENDIF.
MOVE T1,IJFN ;Throw away new source's JFN
RLJFN%
ERJMP .+1 ;Can't, no big deal.
JRST DONRPL ;Go finish up "REPLACE" actions
;RESERVED FILE WAS MODIFIED
RSVFMD: TMSG <% Reserved file was modified
Do you want to replace it anyway? (Y,N): >
CALL YESNO
RET ;NO
SKIPE SWFUID ;YES, SKIP IF WE SHOULDN'T PUT UID IN FILE
JRST GOUPDC ; GO DO COPY WITH UID REPLACEMENT
JRST GOCOP ; GO DO COPY WITHOUT UID REPLACEMENT
;FILE TO REPLACE WITH HAS NO PAGE 0
NOPG0: TMSG <? File to copy has no page 0
>
TMSG <[REPLACE aborted]
>
CALL RLMAB ;RELEASE MAB JFN
CALL RLIJFN ;RELEASE IJFN
CALL RLOJFN ;RELEASE OJFN
RET ;RETURN FROM REPLACE
;HERE IF THE OLD UID LINE IN THE FILE IS NOT EXACTLY 72 CHARACTERS
; WE HAVE TO COPY WITHOUT USING PMAP'S. SIGH.
;REDIT HAS NOT YET BEEN CALLED.
GOSLOW: MOVE T3,NPAGES ;GET SIZE OF BUFFER
IORX T3,PM%CNT ;REPEAT COUNT
HRROI T1,-1 ;SAY REMOVING PAGES
HRLI T2,.FHSLF
HRR T2,STIPGS
PMAP% ;UNMAP PAGES
MOVE T1,IJFN
TXO T1,CO%NRJ ;DON'T RELEASE JFN
CLOSF%
ERJMP .+1
CALL IOPEN ;NOW OPEN FILE FOR READING AGAIN
RET ;?CAN'T
;HERE IF NO UID LINE FOUND IN RESERVED FILE.
; WE WILL HAVE TO DO THE SLOW COPY
;REDIT HAS NOT YET BEEN CALLED.
NORUID: CALL RDLIN1 ;Read first line of new file
NORUI0: CALL BLDNUI ;BUILD NEW UID LINE
RET ;ERRORS.. RETURN
SKIPE SWREDT ;Call REDIT before replace?
CALL CALRDT ;Yes, do it
CALL DORNAM ;RENAME OLD MAC TO MAB
RET ;?CAN'T
CALL OUT1ST ;WRITE 1ST LINE TO OUTPUT FILE
MOVE P1,[POINT 7,RFBUF]
ILDB T1,P1 ;GET 1ST CHAR
CAIE T1,";"
CAIN T1,"!" ;UID LINE?
SKIPN SWRUID ;AND REPLACING UID LINES?
JRST OUT1L ;NOPE, OUTPUT STARTING HERE
MOVE T2,[POINT 7,[ASCIZ/ UPD ID= /]]
CALL CMPSTR ;COMPARE
JRST OUT1L ;NO MATCH, OUTPUT STARTING HERE
MOVEI T3,^D10 ;READ UID
MOVE T1,P1
NIN%
IFJER.
SETZ T2, ;ERROR, CLEAR UID
ENDIF.
MOVEM T2,UID1
;HAVE A UID LINE, SKIP IT
;NOW JUST USE BYTE I/O TO COPY THE FILE
LNDONE: CALL BYTWRT ;COPY BYTES
JRST SCPPDN ;DONE SLOW COPY
;READ FIRST LINE OF NEW FILE TO CHECK FOR UID LINE, ETC.
RDLIN1: HRRZ T1,IJFN
MOVE T2,[POINT 7,RFBUF]
MOVEI T3,MAXLIN-1 ;MAX UID LINE LENGTH
MOVEI T4,.CHLFD ;TERMINATE WITH LF
SIN%
ERJMP FSTLER
SETZ T4, ;TIE OFF WITH NUL
IDPB T4,T2
RET
;HERE IF ERROR READING TO END OF FIRST LINE IN NEW FILE
FSTLER: TMSG <? Couldn't read 1st line in new file: >
CALL LSTFER
HALTF%
JRST RDLIN1 ;TRY AGAIN
;HERE IF FIRST LINE WAS NOT UID LINE, OUTPUT IT ALL
OUT1L: MOVE T1,OJFN
MOVE T2,[POINT 7,RFBUF]
SETZ T3,
SOUT%
ERJMP LNDON4 ;ERROR
JRST LNDONE ;DONE FIRST LINE, JUST USE SIN/SOUT LOOP NOW
LNDON4: CALL CHKQTE ;CHECK FOR QUOTA EXCEEDED
JRST OUT1L ;IT WAS, TRY AGAIN
TMSG <? Output error: >
CALL LSTFER
HALTF%
JRST OUT1L ;TRY AGAIN IF CONT
; ** Here if UID lines are not to be put in the file **
; Files are not OPEN.
NOUSUD: CALL PRSWHY ;Find out why replace.
CALL ALUUID ;Get a UID
SKIPE SWREDT ;Call REDIT before REPLACE?
CALL CALRDT ;Yes, do it
CALL DORNAM ;Rename old MAC to MAB
RET ;?Can't
;Try to do a "RENAME"
GORNM: MOVE T1,OJFN ;Get JFN of output file
CALL SETGRC ;Set generation-retention-count from directory
JRST GORNM2 ;?Failed, pretend RENAME failed because
; files were not on same device, and do copy.
MOVE T1,IJFN
MOVE T2,OJFN
RNAMF% ;TRY TO DO THE RENAME
ERJMPR GORNME
JRST RNAMDN ;DONE
;RENAME FAILED.
GORNME: CAIN T1,RNAMX4
JRST GORNM1 ;?QUOTA EXCEEDED IN DEST OF RENAME
CAIN T1,RNAMX1
JRST GORNM2 ;?Files are not on same device
TMSG <? Can't rename >
TYPE IFINAM
TMSG <: >
CALL LSTFER ;TYPE THE ERROR
HALTF%
JRST GORNM ;TRY AGAIN IF HE TYPES "CONTINUE"
GORNM1: TYPE <[ASCIZ/?Quota exceeded on library
[Please fix the problem and type "CONTINUE"]/]>
HALTF%
JRST GORNM ;GO TRY AGAIN
;Here if RENAME failed because files are not on same device.
; Try to copy instead.
GORNM2: CALL OPENO ;Open output file
RET ;?Errors, forget it
CALL IOPEN ;Open new source file for reading
JRST [CALL RLOJFN ;Errors, release OJFN
RET] ;And return
CALL PRELD0 ;Read some pages in
TXO F,F.RCPY ;Set "Did a COPY" (vs. RENAME) flag
JRST GOCUID ;Go do fast copy.
;RENAME WAS SUCCESSFUL
; ** here, should delete all other generations of the source file
; from my area before going to DONRPL **
RNAMDN: JRST DONRPL ;Go finish REPLACE actions
;*** FILE HAS BEEN COPIED/RENAMED TO LIBRARY ***
; The new source file has been deleted from my area.
;IJFN has been released.
DONRPL: SKIPE SWFCOM ;DOING A FILCOM?
CALL FCSTR ;YES, GET STRING FOR FILCOM
CALL DOLOG ;;OUTPUT TO "LOG" (FILUPD.HST)
SKIPN SWBAKF ;MAKING BACKUP FILES?
JRST REPDON ;NO
MOVE T1,MABJFN ;RELEASE BACKUP
RLJFN%
IFJER.
TMSG <% Couldn't Release MABJFN
>
ENDIF.
;HERE WHEN DONE REPLACE TO RELEASE JFNS AND DELETE MAZ FILE
REPDON:
DELOF: MOVE T1,OJFN ;RELEASE NEW FILE
RLJFN%
ERJMP [TMSG <? Couldn't release OJFN: >
CALL LSTFER
HALTF% ;DIE
JRST DELOF] ;TRY AGAIN IF "CONTINUE"
;DELETE MAZ FILE
MOVE T1,MAZJFN
DELF%
IFJER.
TMSG <? Couldn't delete >
TYPE MAZNAM
TYPE CRLF
ENDIF.
;ALL DONE REPLACE.
SKIPE SWCOPO ;COPY OUTPUT FILES TOO?
CALL CHKOF ;CHECK FOR GENERATED OUTPUT FILES
; AND COPY THEM
; RETURN OR RUN FILCOM
SKIPN SWFCOM ;RUN FILCOM?
RET ;NO, JUST RETURN
TMSG <[ALU: Running FILCOM]
>
MOVE T4,[POINT 7,[ASCIZ/R FILCOM/]]
CALL STILF ;OUTPUT STRING AND LINEFEED TO STI BUF
MOVE T4,[POINT 7,FCTXT]
CALL STILF ;STRING FOR FILCOM
MOVEI T2,3 ;CONTROL-C
CALL STICH ;OUTPUT CHAR
HALTF% ;GO DO IT
RET
STILF: ILDB T2,T4 ;GET CHAR
JUMPE T2,STILL ;END, OUTPUT LF
CALL STICH ;PUT CHAR IN BUFFER
JRST STILF ;LOOP
STILL: MOVEI T2,.CHCRT ;GET <CR>, <LF> IS PUT ON BY SYSTEM
STICH: MOVE T1,MYTTY ;TTY DESIGNATOR
STI%
RET ;RETURN
; ERRORS IN "REPLACE"
REPLE1: TMSG <? File wasn't reserved
>
RET ;DONE
REPLE2: TMSG <?OPENF failed for reserved file on the library: >
CALL LSTFER
HALTF%
JRST CMDRE2 ;TRY AGAIN IF "CONTINUE"
REPLE3: TMSG <? Can't read first line of reserved file: >
CALL LSTFER
HALTF%
JRST CMDRE3 ;TRY AGAIN IF CONTINUE
REPLE4: TMSG <?CLOSF failed for reserved file: >
CALL LSTFER
HALTF%
JRST CMDRE4 ;TRY AGAIN IF CONTINUE
SUBTTL STATUS COMMAND
CMDSTT: MOVEI T2,[ASCIZ/of/]
CALL NOISE
SETZM JFNBLK ;NO DEFAULTS IN FILE-SPECS NOW
MOVE T2,[JFNBLK,,JFNBLK+1]
BLT T2,JFNBLK+20 ;CLEAR JFN BLOCK
HRRO T2,EXTLST ;DEFAULT EXTENSION IS FIRST
MOVEM T2,JFNBLK+.GJEXT
MOVEI T2,FLSTTK ;THINGS THAT COULD BE PARSED NOW
CALL COMMND ;GO GET 'EM
HRRZ T3,T3 ;OK, WHICH PARSE BLOCK USED?
CAIN T3,FLSTTK ;KEYWORD?
JRST STCMDK ;YES, DISPATCH
;MUST BE A FILE-SPEC
MOVEM T2,PRSJFN ;SAVE PARSED JFN
MOVEM T2,GTFJFN ;SAVE HERE FOR "FNDEXT"
CALL CONFRM ;CONFIRM
JRST STFILE ;STATUS (OF) FILE
FLSTTK: FLDDB. (.CMKEY,,STTTAB,,<SIGN-OUTS>,FLSTT2)
FLSTT2: FLDDB. (.CMFIL,CM%SDH,,<Filespec of specific file to check>)
STTTAB: STCLEN,,STCLEN ;# OF STATUS COMMAND OPTIONS
AA LIBRARY,STLIB
AA MY-RESERVATIONS,STUSR
AA SIGN-OUTS,STSIGN
STCLEN==.-STTTAB-1
;KEYWORD
STCMDK: MOVE T2,(T2)
JRST (T2) ;DISPATCH
;STATUS (OF) filespec
;JFN IS IN T2 AND PRSJFN
;USE JFNS TO GET FILE.EXT IN RETJNM
STFILE: CALL FNDEXT ;ANY KNOWN EXTENSION?
RET ;NO, FORGET IT
HRROI T1,RETJNM ;PLACE TO RETURN FILESPEC
MOVE T2,GTFJFN
MOVX T3,1B8+1B11+JS%PAF ;FILE.EXT
JFNS%
;LOOK ON ALL THE LIBRARIES FOR A .MAZ FILE
TXZ F,F.TLN!F.FFL ;DIDN'T SEE ANY FILES, OR TYPE LIB NAMES YET
MOVSI P4,-NMLIBS ;AOBJN PTR TO LIBRARIES
STFIL1: HRRZ T1,LIBLST(P4) ;POINT TO LIBRARY DIRECTORY
HRLI T1,(POINT 7,) ;REAL POINTER
MOVE T3,[POINT 7,LIBHLD] ;STORE WHOLE FILESPEC HERE
MOVE T4,[POINT 7,MAZNAM] ;AT SAME TIME, BUILD .MAZ FILENAME
STFIL2: ILDB T2,T1 ;FIRST COPY DIRECTORY NAME
JUMPE T2,STFIL3
IDPB T2,T3
IDPB T2,T4
JRST STFIL2
STFIL3: PUSH P,T3
MOVE T1,T4 ;PASS PTR TO MAZ NAME
CALL FXMAZN ;FIX UP MAZ NAME TO INCLUDE SUBDIR
MOVEM T1,T4 ;UPDATE PTR
POP P,T3
MOVE T1,[POINT 7,RETJNM] ;NOW FILE.EXT
DO.
ILDB T2,T1
IDPB T2,T3
JUMPN T2,TOP.
ENDDO.
MOVE T1,[POINT 7,RETJNM] ;GET NAME FOR .MAZ FILESPEC
STFIL4: ILDB T2,T1
CAIN T2,"."
JRST STFIL5 ;GOT TO EXTENSION
IDPB T2,T4
JRST STFIL4
STFIL5: IDPB T2,T4 ;STORE DOT
MOVE T2,EXTNUM ;GET NUMBER OF EXTENSION
HRRZ T1,STEXTS(T2) ;.MAZ OR SOMETHING
HRLI T1,(POINT 7,)
DO.
ILDB T2,T1
IDPB T2,T4
JUMPN T2,TOP. ;LOOP TILL EVERYTHING STORED
ENDDO.
;WHOLE FILESPEC IS NOW IN LIBHLD - LOOK FOR THE FILE
;MAZ FILESPEC IS NOW IN MAZNAM
MOVX T1,GJ%SHT+GJ%OLD
HRROI T2,LIBHLD
GTJFN% ;CAN WE FIND FILE ON THE LIBRARY?
ERJMP STFIL6 ;NO
TXO F,F.FFL ;YES, SET FLAG
RLJFN% ;IMMEDIATELY RELEASE IT
JFCL ;BETTER WORK!
;SEE IF IT IS RESERVED
MOVX T1,GJ%SHT+GJ%OLD
HRROI T2,MAZNAM
GTJFN%
ERJMP STFIL6 ;NO
HRRZ P1,T1 ;SAVE JFN
TXO F,F.TLN ;TYPE A LIBRARY NAME
CALL TYPLNM ;TYPE LIBRARY NAME
TYPE RETJNM ;TYPE NAME.EXT
TYPE CRLF ;AND CRLF
CALL TYPFIL ;TYPE OUT THE FILE
HRRZ T1,P1 ;GET BACK JFN
RLJFN% ;AND RELEASE IT
JFCL ;BETTER WORK!
STFIL6: AOBJN P4,STFIL1 ;LOOP FOR ALL LIBRARIES
TXNE F,F.FFL ;DID WE SEE THE FILE AT ALL?
JRST STFIL7 ;YES
TMSG < %File not found on any library
>
RET ;SAY THAT
STFIL7: TXNE F,F.TLN ;WAS IT EVER RESERVED?
RET ;YES, WE TYPED INFO
TMSG < [File is not reserved]
>
RET ;RETURN
;STATUS OF MY-RESERVATIONS
STUSR: TXO F,F.SUSR ;MAGIC FLAG DOES ALL...
; ..
;STATUS (OF) SIGN-OUTS
STSIGN: CALL CONFRM ;CONFIRM REQUEST
;SEARCH ALL LIBRARYS FOR SIGNED OUT FILES
MOVSI P4,-NMLIBS ;-# LIBS
JRST STAT1
;STATUS (OF) LIBRARY library:
STLIB: MOVEI T2,[FLDDB. (.CMTXT,CM%SDH,,<library:>)]
CALL COMMND ;PARSE THE TEXT
LDB T1,[POINT 7,ATMBUF,6] ;ANYTHING TYPED?
JUMPE T1,[TMSG <?"library:" expected
>
RET] ;FORGET IT
MOVEI T1,ATMBUF ;Convert to uppercase
CALL CNVUPP
MOVE T1,[ATMBUF,,LIBHLD]
BLT T1,LIBHLD+17
CALL FNDLIB ;FIND WHICH LIBRARY
RET ;?NOT A LIBRARY
HRRZ P4,LIBNUM ;Get library number
HRLI P4,-1 ;JUST THIS ONE LIBRARY
;HERE WITH P4 = AOBJN PTR TO LIBRARIES
STAT1: TXZ F,F.TLN ;DIDN'T TYPE THIS LIBRARY NAME YET
HRRZM P4,LIBNUM ;GIVE LIB NUM TO SKPFRL
CALL SKPFRL ;SEE IF FROZEN
IFSKP.
DO. ;BLOCK
HRRZ P1,T1 ;JFN IN P1
TXNN F,F.SUSR ;LOOKING FOR SPECIFIC USER?
IFSKP.
HRRZM P1,MAZJFN ;YES, CHECK
CALL CHKFME ;FROZEN BY ME?
EXIT. ;FROZEN, BUT NOT BY ME - SAY NOTHING.
ENDIF.
TXON F,F.TLN ;TYPE LIB NAME IF NEEDED
CALL TYPLNM
MOVE T1,P1
CALL TYPFIL ;TYPE THE .MAZ FILE OUT
HRRZ T1,P1 ;RELEASE .MAZ FILE
RLJFN%
ERJMPS .+1
ENDDO. ;END BLOCK
ENDIF.
HRRZ T2,LIBLST(P4) ;GET A PTR TO A LIBRARY
HRLI T2,(POINT 7,)
MOVE T3,[POINT 7,LIBHLD]
CALL CPT2T3 ;COPY STRING FROM T2 TO T3
MOVE T1,T3 ;PASS PTR
CALL FXMAZN ;FIX MAX NAME TO INCLUDE SUBDIR
MOVEM T1,T3 ;UPDATE PTR
MOVE T2,[POINT 7,[ASCIZ/*.*/]]
CALL CPT2T3 ;COPY STRING FROM T2 TO T3
IDPB T1,T3
MOVX T1,GJ%SHT+GJ%IFG ;WILDCARD CHARS HERE!
HRROI T2,LIBHLD
GTJFN%
ERJMP STATE1 ;?GTJFN FAILED
MOVE P1,T1 ;SAVE GTJFN FLAGS
JRST STAT3A ;FIRST TIME, SKIP GNJFN
;NOW, FOR THIS LIBRARY, WE HAVE THE GTJFN WORD RETURNED IN P1.
; THE JFN NUMBER NOW REFERS TO THE FIRST FILE IN THE LIBRARY.
;LOOK AT EACH FILE UNTIL NO MORE FILES
STAT3: MOVE T1,P1 ;GET GTJFN FLAGS BACK
GNJFN% ;LOOK FOR NEXT FILE
ERJMP STATE2 ;ERROR.. GO SEE WHY
STAT3A: HRRZ T2,T1 ;GET JFN RETURNED
HRROI T1,RETJNM ;PLACE TO RETURN JFN STRING
MOVX T3,1B11 ;JUST RETURN FILE TYPE
JFNS%
;CHECK THIS EXT TO SEE IF IT IS ONE OF THE ONES IN OUR TABLE
; IF SO, TYPE IT OUT
MOVSI P2,-NMEXTS ;-NO EXTS IN TABLE
STAT4: MOVE T1,[POINT 7,RETJNM]
HRRZ T2,STEXTS(P2)
HRLI T2,(POINT 7,)
STAT4A: ILDB T3,T1
ILDB P3,T2
JUMPE T3,STAT5 ;END OF THIS EXT STRING
JUMPE P3,STAT6 ;NO MATCH
CAMN T3,P3 ;THIS CHAR MATCH?
JRST STAT4A ;YES, KEEP LOOKING
;NO MATCH
STAT6: AOBJN P2,STAT4 ;LOOK AT NEXT EXT.
JRST STAT3 ;LOOK AT NEXT FILE
STAT5: JUMPN P3,STAT6 ;IF NOT NULL ON OTHER STRING TOO, NO MATCH
;WE HAVE AN EXACT MATCH (THIS EXT IS IN OUR TABLE)
TXNN F,F.SUSR ;SPECIFIC USER?
IFSKP.
HRRZM P1,MAZJFN ;YES, CHECK
CALL CHKRME
JRST STAT6 ;NOT ME, SKIP THIS FILE
ENDIF.
; ..
;EXT MATCHES.. TYPE OUT THIS FILE
;FIRST TYPE THE FILENAME
;NOTE: FALL HERE FROM ABOVE UNLESS THE OPEN FAILS AND HE CONTINUES
; FROM "STATE5".
TXON F,F.TLN ;TYPED LIBRARY NAME?
CALL TYPLNM ;NOT YET, TYPE IT NOW
STAT5A: HRRZ T2,P1 ;GET JFN
HRROI T1,RETJNM
MOVX T3,1B8 ;NAME
JFNS%
TYPE RETJNM ;NOW TYPE STRING
MOVEI T1,"."
PBOUT%
HRRO T1,EXTLST(P2) ;GET EXTENSION TO TYPE
PSOUT%
TYPE CRLF
CALL TYPFIL ;TYPE OUT THE FILE
JRST STAT3 ;GO ON TO NEXT FILE
;ROUTINE TO TYPE A FILE
;CALL: P1/ JFN (NOT OPENED)
; CALL TYPFIL
; <RETURN HERE, JFN CLOSED BUT NOT RELEASED>
TYPFIL: HRRZ T1,P1 ;GET JFN
MOVX T2,7B5+OF%RD
OPENF%
ERJMP TYPFE1 ;FAILED
;TYPE IT OUT
TYPFL1: HRRZ T1,P1
BIN%
ERJMP TYPFL2 ;FAILED--PROBABLY EOF
HRRZ T1,T2
PBOUT%
JRST TYPFL1
TYPFL2: JUMPE T2,TYPFL3 ;ASSUME EOF IF BYTE IS 0
TMSG <? Error reading file: >
CALL LSTFER
HALTF%
RET
TYPFL3: MOVX T1,CO%NRJ ;DON'T RELEASE JFN
HRR T1,P1
CLOSF% ;CLOSE THE FILE
ERJMP TYPFE2 ;FAILED
RET ;OK, RETURN
;OPENF FAILED
TYPFE1: TMSG <?OPENF failed: >
CALL LSTFER
HALTF%
JRST TYPFIL ;GO TRY AGAIN
;CLOSF FAILED
TYPFE2: TMSG <?CLOSF failed: >
CALL LSTFER
HALTF%
RET ;JUST RETURN IF HE CONTINUES
;ROUTINE TO TYPE "[LIBARY <DIR>]" AND CRLF
TYPLNM: CALL TYPLN1 ;TYPE "[LIBARY <DIR>"
TYPE <[ASCIZ/]
/]>
RET ;RETURN
TYPLN1: TYPE <[ASCIZ/ [Library /]>
HRRO T1,LB1LST(P4)
PSOUT%
TMSG < = >
HRRO T1,LIBLST(P4)
PSOUT%
RET
; ERRORS IN "STATUS" COMMAND
;GTJFN FAILED FOR <LIBRARY>*.*
STATE1: TXNN F,F.SUSR ;MESSAGE WANTED?
CAIN T1,GJFX32 ;"NO FILES MATCH THIS SPEC"
JRST NXTLIB ;NO, YES - GO ON TO NEXT LIBRARY
TMSG <% Library >
HRRO T1,LIBLST(P4)
PSOUT%
TMSG < not properly setup for ALU.
>
JRST NXTLIB ;Go on to next library
;GNJFN FAILED
STATE2:
NXTLIB: TXNN F,F.TLN ;DID WE TYPE THE NAME YET?
TXNE F,F.SUSR
IFSKP.
CALL TYPLN1 ;TYPE "LIBRARY <DIR"
TYPE <[ASCIZ/: No files reserved]
/]>
ENDIF.
AOBJN P4,STAT1 ;GO ON TO NEXT LIBRARY
RET ;NO MORE, ALL DONE
STATE5: TMSG <?OPENF failed: >
CALL LSTFER
HALTF%
JRST STAT5A ;GO TRY AGAIN
STATE7: TMSG <?CLOSF failed: >
CALL LSTFER
HALTF%
RET ;JUST RETURN IF HE CONTINUES
SUBTTL UNFREEZE COMMAND
CMDUNF: MOVEI T2,[ASCIZ /library/]
CALL NOISE
MOVEI T2,[FLDDB. (.CMTXT,CM%SDH,,<library name:>)]
CALL COMMND
LDB T1,[POINT 7,ATMBUF,6]
JUMPE T1,[TMSG <?"library:" expected.
>
RET]
MOVEI T1,ATMBUF
CALL CNVUPP
MOVE T1,[ATMBUF,,LIBHLD]
BLT T1,LIBHLD+17
CALL FNDLIB ;LOOKUP LIBRARY NAME
RET
CALL SKPFRL ;SEE IF ALREADY FROZEN
IFNSK.
TMSG <?Library is not frozen.
>
RET
ENDIF.
DELF% ;DELETE THE FREEZE FILE
IFJER.
TMSG <%Couldn't delete freeze file.
>
ENDIF.
RET
SUBTTL HELP COMMAND
CMDHLP: MOVEI T2,[ASCIZ/with ALU/]
CALL NOISE
CALL CONFRM
MOVX T1,GJ%OLD+GJ%SHT
HRROI T2,[ASCIZ/HLP:ALU.HLP/]
GTJFN% ;Find HLP:ALU.HLP
IFJER.
MOVX T1,GJ%OLD+GJ%SHT
HRROI T2,[ASCIZ/ALU:ALU.HLP/]
GTJFN%
ERJMP NOHLP ;Not on either HLP: or SYS:
ENDIF.
HRRZ T4,T1 ;Save JFN
MOVE T1,T4 ;Get JFN
MOVE T2,[7B5+OF%RD] ;OPEN for read access
OPENF%
ERJMP COHLPF ;?Can't open help file
;Type the file out on the terminal
CMDHL2: MOVE T1,T4 ;Get JFN
BIN%
ERJMP CMDHL3 ;Error on BIN, assume EOF
MOVEI T1,.PRIOU ;Output to TTY:
BOUT%
ERJMP .+1
JRST CMDHL2 ;Loop till EOF
CMDHL3: MOVE T1,T4 ;Get JFN
CLOSF% ;Close help file
ERJMP .+1 ;Ignore failure
RET ;Return
;No help available
NOHLP: TMSG <? Can't find the ALU help file on HLP: or SYS:
>
RET ;Return giving no help
;Can't OPEN the help file
COHLPF: TMSG <?Can't OPEN ALU.HLP: >
PUSH P,T4 ;Get JFN
CALL LSTFRC ;Type why and CRLF
POP P,T1 ;Try to get rid of JFN
RLJFN%
ERJMP .+1
RET
SUBTTL INFORMATION COMMAND
CMDINF: MOVEI T2,[ASCIZ/about/]
CALL NOISE
MOVEI T2,[FLDDB. (.CMKEY,,INFTAB)]
CALL COMMND ;GET KEYWORD
MOVE T2,(T2) ;PARSED OK, GET ADDRESS
JRST (T2) ;GO DO IT
INFTAB: INFLEN,,INFLEN ;HEADER
AA EXTENSIONS,INFEXT
AA FUNCTION-CONTROL-SWITCHES,INFFT
AA LIBRARIES,INFLIB
AA USERS,INFUSR
AA VERSION,INFVER
INFLEN==.-INFTAB-1 ;NUMBER OF INFORMATION COMMANDS
SUBTTL INFORMATION (ABOUT) FUNCTION-CONTROL-SWITCHES
INFFT: CALL CONFRM ;CONFIRM COMMAND
TMSG <
This version of ALU is setup with the following function-control switches:
>
INFFT1: TMSG <
SWFUID = >
SKIPE SWFUID
JRST FILUDY
TMSG <0 (No "UID" line will be placed into the
file being replaced. ALU log entries will not point you
to the previous edit of the file)
>
JRST INFFT2
FILUDY: TMSG <1 (A "UID" line will be placed into the
file being replaced. This enables you to see who last
edited the file, and allows ALU log entries to point you
to the previous edit of the file)
>
TYPE [ASCIZ /
SWRUID = /]
SKIPN SWRUID
JRST [ TYPE [ASCIZ /0 (New UID lines will be added to the file
and will not replace such lines already in the file.)
/]
JRST INFFT2]
TYPE [ASCIZ /1 (The new UID lines will replace the one already
in the file if there is one.)
/]
INFFT2: TMSG <
SWCOPO = >
SKIPN SWCOPO
JRST COPOFN
TMSG <1 (Files generated from the source file
being REPLACE'd are also copied to the library)
>
JRST INFFT3
COPOFN: TMSG <0 (Only the source file is REPLACE'd, files
generated from it are left alone)
>
INFFT3: TMSG <
SWFCOM = >
SKIPN SWFCOM
JRST FTFCMN
TMSG <1 (FILCOM is run automatically after REPLACE's)
>
JRST INFFT4
FTFCMN: TMSG <0 (FILCOM is not run automatically after REPLACE's)
>
INFFT4: TYPE [ASCIZ /
SWBAKF = /]
SKIPN SWBAKF
JRST [ TYPE [ASCIZ /0 (Backup files, e.g. ".MAB" will not be
generated. Multiple generations of the source (depending
on the generation retention count) will be left on the library.)
/]
JRST INFFT5]
TYPE [ASCIZ /1 (Backup files will be made by renaming the source
being replaced to be a file with the same name and a
related extension, e.g. ".MAB".)
/]
INFFT5: TMSG <
SWANYU = >
SKIPN SWANYU
JRST [ TYPE [ASCIZ /0 (Only registered users may use ALU).
/]
JRST INFFT6]
TYPE [ASCIZ /1 (Any user with access to the libraries can use ALU).
/]
INFFT6: TMSG <
SWGCPY = >
SKIPN SWGCPY
JRST [ TYPE [ASCIZ /0 (If you do a GET and the file is already reserved,
ALU just aborts the GET and does not ask you if you'd like a copy anyway).
/]
JRST INFFT7]
TYPE [ASCIZ /1 (If you do a GET and the file is already reserved,
ALU will give you the option of copying it anyway).
/]
INFFT7: TMSG <
SWREDT = >
SKIPN SWREDT
JRST [ TYPE [ASCIZ /0 (REDIT is not run automatically before REPLACE)
/]
JRST INFFT8]
TYPE [ASCIZ /1 (REDIT is run automatically before REPLACE)
/]
INFFT8: TMSG <
SWCGET = >
SKIPN SWCGET
JRST [ TYPE [ASCIZ \0 (Default on GET and QGET is /NOCOPY)
\]
JRST INFFT9]
TYPE [ASCIZ \1 (Default on GET and QGET is /COPY)
\]
INFFT9: TYPE CRLF ;FINAL CRLF FOR AESTETICS
RET ;RETURN
SUBTTL INFORMATION (ABOUT) LIBRARIES
;TYPES OUT THE LIBRARIES ALU IS BUILT TO LOOK AT
INFLIB: CALL CONFRM ;CONFIRM COMMAND
TMSG <
This version of ALU knows about the following libraries:
LOGICAL NAME DIRECTORY LOG AREA
------------ --------- --------
>
MOVEI T1,^D16 ;"DIRECTORY" starts here
MOVEM T1,ILBCD
MOVEI T1,^D38 ;"LOG AREA" starts here
MOVEM T1,ILBCL
MOVEI P1,0 ;Index to library
INFLB1: MOVE T1,[POINT 7,TLINE] ;BUILD OUTPUT LINE HERE
MOVEM T1,TEMPBP ;Save as temporary BP
MOVEI T1,1 ;Set to column 1
MOVEM T1,TLCOLM ; . .
MOVEI T1," " ;Assume not default lib
SKIPN DFLIBW ;Is there a default lib?
JRST INFLB2 ;No, skip type space here
CAMN P1,DLBIDX ;Is this it?
MOVEI T1,"*" ;Yes, put out a "*" to mark it
INFLB2: CALL TLCHR ;Put char in TLINE
MOVEI T1," " ;GET A SPACE
CALL TLCHR
CALL TLCHR
INFLB3: HRRZ T3,LB1LST(P1)
HRLI T3,(POINT 7,) ;NOW OUTPUT NAME
DO.
ILDB T1,T3
JUMPE T1,ENDLP.
CALL TLCHR
LOOP.
ENDDO.
MOVE T2,ILBCD ;Pad out to where directory will start
CALL TLPAD
HRRZ T3,LIBLST(P1) ;NOW OUTPUT DIRECTORY NAME
HRLI T3,(POINT 7,)
DO.
ILDB T1,T3
JUMPE T1,ENDLP. ;JUMP WHEN DONE
CALL TLCHR
LOOP.
ENDDO.
; ..
;INFLIB ROUTINE (CONT'D).
; ..
MOVE T2,ILBCL ;Pad out to where log-area will start
CALL TLPAD
HRRZ T3,LB2LST(P1) ;Now output LOG-area name
HRLI T3,(POINT 7,)
DO.
ILDB T1,T3
JUMPE T1,ENDLP.
CALL TLCHR
LOOP.
ENDDO.
MOVEI T4,.CHCRT ;CR
IDPB T4,TEMPBP
MOVEI T4,.CHLFD ;LF
IDPB T4,TEMPBP ;APPEND CRLF TO STRING
SETZ T4,
IDPB T4,TEMPBP ;NULL TO END STRING
TYPE TLINE ;NOW OUTPUT THE LINE
AOJ P1, ;Next library
CAIE P1,NMLIBS ;Done?
JRST INFLB1 ;No, loop
SKIPN DFLIBW ;Was default library marked?
JRST INFLB7 ;No
TMSG <
"*" means this library is the default if not specified for GET, REPLACE, etc.
>
INFLB7: TYPE CRLF ;FINAL CRLF FOR NEATNESS
RET ;THEN RETURN
; Routines to get column output right.
;Routine to store character in TLINE.
;Call:
; TEMPBP/ BP to TLINE
; T1/ character value
; CALL TLCHR
; <return here, TLCOLM incremented>
;Uses T1 only
TLCHR: IDPB T1,TEMPBP ;Store char
AOS TLCOLM ;Increment column number
RET ; and return
;Routine to pad out to column #.
;Call:
; T2/ desired column number
; TLCOLM/ actual column number
; CALL TLPAD
; <return here>
;Uses T1-T3
TLPAD: MOVEI T1," " ;Get a space
TLPAD1: CALL TLCHR ;Put at least one out
MOVE T3,TLCOLM ;Get actual column number
CAMG T2,T3 ;Far enough, or too far?
RET ;Yes, return
JRST TLPAD1 ;No, loop
SUBTTL INFORMATION (ABOUT) EXTENSIONS
;TYPES OUT THE LIST OF KNOWN EXTENSIONS AND THEIR CHARACTERISTICS
INFEXT: CALL CONFRM ;CONFIRM THE COMMAND
TMSG <
The following is a list of file types that are known to
this version of ALU. (Note: RSVFILE is the extension of the
file on the library which will contain the "WHY" text.
BACKUP is the extension of the backup file on the library).
>
TMSG <
SOURCE RSVFILE BACKUP
------ ------- ------
>
MOVSI P1,-NMEXTS ;# OF KNOWN EXTENSIONS
INFEX1: MOVE T1,[POINT 7,TLINE] ;WRITE OUTPUT LINE TO HERE
HRRZ T2,EXTLST(P1) ;GET AN EXTENSION
HRLI T2,(POINT 7,) ;MAKE PTR TO IT
CALL CPYNUL
MOVEI T3,.CHTAB
IDPB T3,T1
HRRZ T2,STEXTS(P1) ;.MAZ FILE EXT
HRLI T2,(POINT 7,)
CALL CPYNUL
MOVEI T3,.CHTAB
IDPB T3,T1
HRRZ T2,EXBLST(P1) ;BACKUP FILE EXT
HRLI T2,(POINT 7,)
CALL CPYNUL
MOVEI T3,.CHCRT
IDPB T3,T1
MOVEI T3,.CHLFD
IDPB T3,T1
SETZ T3,
IDPB T3,T1 ;END STRING
TYPE TLINE ;OUTPUT THE LINE
SKIPN SWCOPO ;GENERATED OUTPUT FILES?
JRST INFEXO ;NO
TMSG < Generated output file(s): >
SKIPN P2,EXOLST(P1) ;ANY FOR THIS FILE?
JRST INFEXN ;NO, SAY "NONE"
JRST INFEX6 ;JUMP OVER COMMA PRINTING
INFEX5: TMSG <,>
INFEX6: HRRZ T2,(P2) ;POINT TO ONE
HRLI T2,(POINT 7,)
MOVE T1,[POINT 7,TLINE] ;WRITE TO HERE
CALL CPYNUL
TYPE TLINE
AOBJN P2,INFEX5 ;LOOP IF MORE TO DO
TYPE CRLF
JRST INFEXO
INFEXN: TMSG <-None-
>
INFEXO: TYPE CRLF
AOBJN P1,INFEX1 ;LOOP FOR ALL EXTS
RET ;DONE, RETURN
SUBTTL INFORMATION (ABOUT) USERS
;TYPES OUT THE LIST OF USERS (DIRECTORY NAMES FROM WHICH ALU CAN BE RUN)
INFUSR: CALL CONFRM ;CONFIRM COMMAND
TMSG <
To reserve a file with ALU, you must be
logged in as one of the following users:
>
MOVSI P1,-NMUSRS ;AOBJN POINTER TO USERS
INFUS1: MOVE T1,[POINT 7,TLINE] ;BUILD STRING HERE
HRRZ T2,USRLST(P1) ;POINT TO USER NAME
HRLI T2,(POINT 7,)
CALL CPYNUL
MOVEI T3,.CHCRT ;APPEND CRLF TO STRING
IDPB T3,T1
MOVEI T3,.CHLFD
IDPB T3,T1
SETZ T3,
IDPB T3,T1 ;NULL TO END
TYPE TLINE ;NOW TYPE THE LINE
AOBJN P1,INFUS1 ;GO TO NEXT USER
SKIPN SWANYU ;ANY USER ALLOWED?
JRST INFUS3 ;NO
TMSG <
or any other user with file access to the libraries.
>
INFUS3: TYPE CRLF
RET ;DONE, RETURN
SUBTTL INFORMATION (ABOUT) VERSION (OF ALU)
INFVER: MOVEI T2,[ASCIZ/of ALU/]
CALL NOISE
CALL CONFRM
TMSG < This is >
TYPE AVERST ;Type version string
TYPE CRLF
RET ;Done, return
SUBTTL ^EDDT COMMAND
CMEDDT: CALL CONFRM ;CONFIRM
GODDT: TDZA P3,P3 ;HAVEN'T BEEN HERE BEFORE
GODDT0: SETO P3, ;BEEN HERE BEFORE
MOVE 1,[400000,,770] ;[26] IS PAGE ACCESSIBLE?
RPACS%
AND 2,[EXP PA%RD!PA%EX!PA%PEX]
CAME 2,[EXP PA%RD!PA%EX!PA%PEX]
JRST GETDD ;NO, BUT TRY TO READ DDT IN
MOVE 1,770000 ;DOES IT CONTAIN DDT?
CAME 1,[JRST 770002] ;PROBABLY, IF EQUAL.
JRST NODDT ;GIVE ERROR
TYPE <[ASCIZ/[Return from DDT by typing "POPJ 17,$X"]
/]>
CALL 770000 ;CALL DDT
RET ;RETURN TO COMMAND SCANNER
NODDT: TMSG <?DDT not accessible
>
RET ;RETURN TO COMMAND SCANNER
;HERE IF PAGE IS NOT EVEN ACCESSIBLE. TRY TO READ DDT IN (BUT
; BE CAREFUL TO NOT ALLOW IT TO WIPE OUT EXISTING DATA!)
GETDD: JUMPN P3,NODDT ;IF BEEN HERE BEFORE, GIVE UP
MOVX T1,GJ%OLD!GJ%SHT ;GET DDT
HRROI T2,[ASCIZ/SYS:UDDT.EXE/]
GTJFN%
ERJMP NODDT ;NOT THERE--SAY "NOT ACCESSIBLE"
PUSH P,T1 ;SAVE THE JFN
MOVEI T1,.FHSLF ;SAVE ENTRY VECTOR INFO
GEVEC% ; (GET% SMASHES IT)
PUSH P,T2 ;SAVE THE INFO
MOVE T1,-1(P) ;GET JFN BACK
HRLI T1,.FHSLF ;READ INTO SAME FORK
TXO T1,GT%NOV ;DON'T OVERLAY EXISTING PAGES!!
GET% ;READ IN DDT
ERJMP GETFAI ;FAILED
POP P,T2 ;ENTRY VECTOR INFO
MOVEI T1,.FHSLF
SEVEC% ;RESTORE ENTRY VECTOR
POP P,(P) ;FORGET JFN, DON'T CARE ANYMORE
DMOVE T1,116 ;GET SYMBOL TABLE INFO
MOVEM T1,@770001 ;STORE IN DDT
MOVEM T2,@770002 ;. .
JRST GODDT0 ;GO TRY AGAIN
GETFAI: POP P,(P) ;FORGET ENTRY VECTOR INFO
TMSG <?GET failed-- can't read in DDT: >
CALL LSTFER ;TYPE LAST ERROR IN THIS FORK
TYPE CRLF
POP P,T1 ;RECOVER JFN
RLJFN%
IFJER.
TMSG <?Can't release JFN for SYS:UDDT.EXE: >
CALL LSTFER
TYPE CRLF
ENDIF.
RET ;DONE, RETURN
SUBTTL ^ESET COMMAND
CMESET: MOVEI P3,1 ;"NO" NOT TYPED
CMEST1: MOVEI T2,[FLDDB. (.CMKEY,,ESETTB,<keyword or "NO keyword">)]
CALL COMMND ;PARSE THE KEYWORD
HRRZ T2,(T2)
JRST (T2) ;GO DO IT
ESETTB: ESETLN,,ESETLN ;HEADER
AA ANY-USER-ALLOWED,ESANYU
AA BACKUP,ESBAKF
AA COPY-ON-GET,ESCGET
AA COPY-OUTPUT-FILES,ESCOPO
AA FILCOM-AFTER-REPLACE,ESFCOM
AA GET-RESERVED-FILE-OPTION,ESGCPY
AA NO,ESNO,CM%INV ;INVISIBLE "NO" COMMAND
AA REDIT-BEFORE-REPLACE,ESREDT
AA REPLACE,ESRUID
AA UID-IN-SOURCE,ESFUID
ESETLN==.-ESETTB-1 ;NUMBER OF ^E SET COMMANDS
ESNO: TRC P3,1 ;COMPLEMENT "NO" FLAG
JRST CMEST1 ;GET ANOTHER ARG
ESCOPO: CALL CONFRM
CAME P3,SWCOPO ;ALREADY SET?
SETCMM CNCOPO ;YES, REMEMBER WE CHANGED IT
MOVEM P3,SWCOPO
RET ;DONE, RETURN
ESCGET: CALL CONFRM
CAME P3,SWCGET
SETCMM CNCGET
MOVEM P3,SWCGET
RET
ESFCOM: CALL CONFRM
CAME P3,SWFCOM
SETCMM CNFCOM
MOVEM P3,SWFCOM
RET
ESFUID: CALL CONFRM
CAME P3,SWFUID
SETCMM CNFUID
MOVEM P3,SWFUID
RET
ESBAKF: CALL CONFRM
CAME P3,SWBAKF
SETCMM CNBAKF
MOVEM P3,SWBAKF
RET
ESRUID: CALL CONFRM
CAME P3,SWRUID
SETCMM CNBAKF
MOVEM P3,SWRUID
RET
ESANYU: CALL CONFRM
CAME P3,SWANYU
SETCMM CNANYU
MOVEM P3,SWANYU
RET
ESGCPY: CALL CONFRM
CAME P3,SWGCPY
SETCMM CNGCPY
MOVEM P3,SWGCPY
RET
ESREDT: CALL CONFRM
CAME P3,SWREDT
SETCMM CNREDT
MOVEM P3,SWREDT
RET
SUBTTL MAZSTR - OUTPUT STRING TO MAZ FILE
;OUTPUT STRING TO MAZ FILE
;CALL: T3 / ADDRESS OF ASCIZ STRING
; CALL MAZSTR
; <RETURN HERE IF GOT "QUOTA EXCEEDED" ERROR> (ALL OTHER ERRORS BOMB OUT)
; <RETURN HERE IF OK>
MAZSTR: HRLI T3,(POINT 7,) ;MAKE A STRING POINTER
HRRZ T1,MAZJFN ;T1:= JFN FOR BOUT
MAZST1: ILDB T2,T3 ;GET NEXT BYTE
JUMPE T2,RSKP ;DONE IF NULL
MAZST2: BOUT% ;WRITE IT
IFJER.
CALL MAZSTE ;HANDLE ERROR
JRST MAZST2 ;TRY AGAIN
ENDIF.
JRST MAZST1 ;LOOP
MAZSTE: SAVEAC <T1,T2,T3,T4>
TMSG <?Can't write string to MAZ file: >
CALL LSTFER
HALTF%
RET
;OUTPUT DATE/TIME TO FILE
MAZTIM: HRRZ T1,MAZJFN ;OUTPUT TO THE FILE
SETO T2, ;CURRENT DATE/TIME
;SET FLAGS FOR DATE WITH SLASHES, NO TIME
MOVX T3,OT%SLA+OT%NMN+OT%SCL+OT%DAM+OT%NTM
MAZTI1: ODTIM%
IFJER.
CALL MAZSTE
JRST MAZTI1 ;TRY AGAIN
ENDIF.
MOVEI T3,[ASCIZ/ at /]
CALL MAZSTR
RET ;QUOTA EXCEEDED ERROR
CALL GTTIM ;GET TIME IN HLDTM1
RET ;ERROR, TRY WRITING WHOLE FILE AGAIN
MOVEI T3,HLDTM1
CALL MAZSTR
RET ;QUOTA EXCEEDED ERROR
JRST RSKP ;RETURN OK
SUBTTL GTTIM - GET CURRENT TIME STRING IN HLDTM1
;RETURNS .+1 IF FAILURE, .+2 IF OK
GTTIM: HRROI T1,HLDTIM ;HOLD ASCIZ TIME
SETO T2, ;CURRENT TIME
MOVX T3,OT%NDA+OT%12H+OT%NSC+OT%SCL
ODTIM% ;WRITE TIME TO BUFFER
ERJMP MAZTME
SETZ T2,
IDPB T2,T1
MOVE T3,[POINT 7,HLDTIM] ;FROM HERE
MOVE T4,[POINT 7,HLDTM1] ;TO HERE
GTTIM1: ILDB T2,T3 ;GET A CHAR FROM TIME
CAIE T2,"A"
CAIN T2,"P"
IFNSK.
MOVEI T1," "
IDPB T1,T4
ENDIF.
IDPB T2,T4
JUMPN T2,GTTIM1
JRST RSKP ;RETURN OK
MAZTME: TMSG <?ODTIM failed: >
CALL LSTFER
HALTF%
RET ;TRY WRITING WHOLE MAZ FILE AGAIN IF CONTINUE
SUBTTL BRCHR, YESNO ROUTINES
BRCHR: CAIE T1,15
CAIN T1,12
RET
CAIN T1,0
RET
CAIN T1,32
RET
CAIE T1,13
CAIN T1,14
RET
AOS (P)
RET
;GET A "YES" OR "NO" FROM TTY
; <CR> MEANS NO.
;RETURNS .+1 IF "NO", .+2 IF "YES"
YESNO: CALL ITTLIN
JRST ERESET ;ERRORS.. BACK TO COMMAND SCANNER
;CHECK FOR "YES"
MOVE T3,[POINT 7,TLINE] ;POINT TO ANSWER
ILDB T1,T3
CAIE T1,"y"
CAIN T1,"Y"
JRST RETYES
CAIE T1,"n"
CAIN T1,"N"
JRST RETNO
CALL BRCHR ;<CR> IMPLIES NO
JRST RETNO
TMSG <? Please type "YES" or "NO"
>
JRST YESNO ;TRY AGAIN
RETYES: AOS (P)
RETNO: RET
SUBTTL GTFINL - SEE IF FILE IN GTFJFN IS IN A LIBRARY
; IF SO, SETS LIBNUM TO THE INTERNAL LIBRARY NUMBER AND SKIPS
;ELSE TYPES ERROR MESSAGE AND POPJ'S
;THIS ROUTINE USES THE "RETJNM" FILENAME BUFFER, AND P1
GTFINL: HRROI T1,RETJNM
HRRZ T2,GTFJFN
MOVX T3,1B2+1B5+JS%PAF ;DEVICE AND DIRECTORY FIELD WITH PUNCTUATION
JFNS%
MOVSI P1,-NMLIBS
GTFIN1: HRR T1,LIBLST(P1) ;GET PTR TO A LIB NAME
HRLI T1,(POINT 7,)
MOVE T2,[POINT 7,RETJNM] ;GET PTR TO RETURNED NAME
GTFIN2: ILDB T3,T1
ILDB T4,T2 ;GET CHAR FROM EACH
JUMPE T3,GTFIN3 ; END OF FIRST
JUMPE T4,GTFIN4 ;NO MATCH
CAMN T3,T4
JRST GTFIN2 ;MATCH ON THIS CHAR
;NO MATCH
GTFIN4: AOBJN P1,GTFIN1 ;LOOP FOR ALL NAMES
TMSG <? File is not in a library
>
RET ;RETURN
GTFIN3: JUMPN T4,GTFIN4 ;JUMP IF NO MATCH
HRRM P1,LIBNUM ;SAVE NUMBER OF THE LIBRARY
AOS (P) ;GIVE GOOD RETURN
RET
SUBTTL FNDEXT - SEE IF FILE IN GTFJFN HAS A KNOWN EXTENSION
; IF SO, SET "EXTNUM" AND SKIP RETURN
; ELSE GIVE ERROR AND POPJ
FNDEXT: HRROI T1,RETJNM
HRRZ T2,GTFJFN
MOVX T3,1B11 ;JUST EXT.
JFNS%
MOVSI P1,-NMEXTS ;NUMBER OF KNOWN EXTENSIONS
FNDEX1: HRR T1,EXTLST(P1)
HRLI T1,(POINT 7,)
MOVE T2,[POINT 7,RETJNM]
FNDEX2: ILDB T3,T1
ILDB T4,T2
JUMPE T3,FNDEX4 ;END OF 1ST STRING
JUMPE T4,FNDEX3 ;NO MATCH
CAMN T3,T4
JRST FNDEX2 ;ALL MATCH SO FAR
;NO MATCH
FNDEX3: AOBJN P1,FNDEX1 ;LOOP FOR ALL EXTS
TMSG <? File extension is unknown to ALU
>
RET ;RETURN
FNDEX4: JUMPN T4,FNDEX3 ;NO MATCH
;FOUND OUR EXTENSION
HRRM P1,EXTNUM ;SAVE EXTENSION NUMBER
AOS (P) ;SKIP RETURN FOR SUCCESS
RET ;RETURN
SUBTTL GMAZNM - BUILD .MAZ FILE NAME IN MAZNAM
;MAKES AN ASCII FILENAME FOR THE .MAZ FILE, GIVEN EXTNUM
; SET UP ALREADY BY FNDEXT, AND .MAC FILE JFN IN "GTFJFN".
;SKIP RETURNS IF SUCCESSFUL, WITH ASCII NAME IN "MAZNAM".
GMAZNM: MOVE T1,[POINT 7,MAZNAM]
HRRZ T2,GTFJFN
MOVX T3,1B2+1B5+JS%PAF ;DEV:<DIRECTORY>
JFNS%
CALL FXMAZN ;FIX UP STRING TO INCLUDE SUBDIR
HRRZ T2,GTFJFN
MOVX T3,1B8+JS%PAF
JFNS% ;APPEND FILE NAME
;TACK ON EXT
MOVEI T4,"."
IDPB T4,T1
MOVE T2,EXTNUM ;GET NUMBER OF THE EXTENSION
HRRZ T2,STEXTS(T2) ; .MAZ OR SOMETHING
HRLI T2,(POINT 7,)
CALL CPYNUL
RETSKP
;FIX UP DIRECTORY NAME STRING TO INCLUDE SUBDIRECTORY
; T1/ BYTE PTR TO STRING, LAST CHAR OF WHICH SHOULD BE DIR CLOSING PUNCT
FXMAZN: BKJFN% ;BACK UP OVER CLOSING DIRECTORY PUNCT
ERJMPS .+1
HRROI T2,SUBDIR ;APPEND SUBDIRECTORY STRING IF ANY
SETZ T3,
SOUT
MOVEI T2,">"
IDPB T2,T1 ;FINAL PUNCTUATION
RET
SUBTTL GET FREEZE FILE
SKPFRL: MOVE T1,[POINT 7,MAZNAM]
MOVE T2,LIBNUM
HRRZ T2,LIBLST(T2) ;MAKE PTR TO LIB STRING
HRLI T2,(POINT 7,0)
CALL CPYNUL ;COPY LIB NAME
JRST SKPFR1 ;JOIN COMMON CODE
SKPFRF: MOVE T1,[POINT 7,MAZNAM]
HRRZ T2,GTFJFN ;JFN ON REQUESTED FILE
MOVX T3,1B2+1B5+JS%PAF ;DEVICE AND DIRECTORY
JFNS%
ERCALS FATAL
SKPFR1: CALL FXMAZN ;INCLUDE SUBDIRECTORY
MOVE T2,[POINT 7,[ASCIZ /FREEZE.TXT/]]
CALL CPYNUL ;BUILD REST OF FILE NAME
MOVX T1,GJ%OLD!GJ%SHT
HRROI T2,MAZNAM
GTJFN% ;TRY TO FIND I
ERJMPS RTN
RETSKP
SUBTTL ROUTINE TO OPEN OUTPUT FILE TO WRITE BYTES
;CALL: OJFN/ JFN
; CALL OPENO
; <HERE IF ERROR, MESSAGE TYPED OUT, JFN RELEASED>
; <HERE IF OK>
OPENO: HRRZ T1,OJFN
MOVX T2,7B5+OF%WR
OPENF%
ERJMP OPENE1 ;OPENF FAILED
AOS (P) ;OK--RETURN
RET
OPENE1: TMSG <? Can't OPENF >
MOVEI T1,.PRIOU
HRRZ T2,OJFN
SETZ T3,
JFNS%
TMSG < for writing: >
CALL LSTFER
TYPE CRLF
HRRZ T1,OJFN ;NOW RELEASE JFN
RLJFN%
ERJMP .+1 ;IGNORE ERRORS
RET
SUBTTL IOPEN - OPEN INPUT FILE FOR PMAP'S.
;RETURNS .+2 IF OK
IOPEN: MOVE T1,IJFN
MOVX T2,OF%RD+7B5 ;OPEN FOR READ
OPENF%
ERJMP IOPEE1 ;FAILED.. GO SEE WHY
HRRZ T1,IJFN ;GET BYTE SIZE , & BYTES
MOVE T2,[2,,.FBBYV]
MOVEI T3,P1
GTFDB%
ERJMP IOPEE2 ;?CAN'T GET FDB INFO
LDB T1,[POINTR P1,FB%BSZ] ;GET BYTE SIZE
MOVEM T1,BSINP ;SAVE
MOVEM P2,BCINP ;SAVE BYTE COUNT, TOO
AOS (P) ;OK, RETURN
RET ;DONE, RETURN
IOPEE1: TMSG <?IOPEN: OPENF failed: >
CALL LSTFER
HALTF%
RET
IOPEE2: TMSG <?IOPEN: GTFDB failed: >
CALL LSTFER
HALTF%
RET
SUBTTL PRELOD - PAGE PRELOAD ROUTINE
;THIS ROUTINE PRE-LOADS SOME PAGES FROM IJFN FILE
NPAGES: ^D25 ;MOUTH SIZE
PRELOD: CALL IOPEN ;OPEN INPUT FILE, PAGE MODE
RET ;CAN'T, JUST RETURN
;ENTRY POINT IF FILE IS ALREADY OPEN
PRELD0: MOVE P1,NPAGES ;GET SOME
CALL FINFRE ; FREE PAGES
MOVEM T1,STIPGS ;START OF INPUT PAGES
LSH T1,9
MOVEM T1,STIPG2 ; ADDRESS OF THE BLOCK
SETZM NXTBEG ;START AT PAGE 0
;ENTRY POINT TO READ NEXT FEW PAGES IN WITH PMAP
PRELD1: HRL T1,IJFN ;MAP FROM INPUT JFN
HRR T1,NXTBEG ;START WITH THESE PAGES
HRLI T2,.FHSLF ;OUR PROCESS
HRR T2,STIPGS ; STARTING HERE
MOVX T3,PM%RD!PM%PLD!PM%CNT ;READ, PRELOAD, REPEAT COUNT GIVEN
HRR T3,NPAGES ;READ THIS MANY
PMAP%
IFJE. (R)
CAIE T1,LNGFX1 ;OFF INTO NONX PAGE TABLE?
JRST PRELE1 ;NO, UNEXPECTED
ENDIF.
RET ;DONE, RETURN
PRELE1: TMSG <? PMAP failed to PRE-load pages: >
CALL LSTFER
TYPE CRLF
HALTF%
RET
SUBTTL PPCPY - FAST COPY ROUTINE FOR COPYING FILES
;THIS PAGE/PAGE COPY IS THE FASTEST COPYING ROUTINE
; YOU CAN WRITE FOR TOPS20.
;Inputs:
; IJFN/ OPEN'ed JFN for input file.
; OJFN/ OPEN'ed JFN for output file.
;Some pages have been pre-loaded (PRELD0)
;Date/time info for IJFN is in RFTAD1.
;IF LOC "FSTLIN" IS NON-ZERO, IT POINTS TO AN ASCII LINE
; TO PUT INTO THE OUTPUT FILE (FOR "REPLACE" OPTION).
;WHEN COPY IS FINISHED, FILES ARE CLOSED.
;** Warning: Uses P1 **
PPCPY: MOVE P1,NPAGES ;GET "N" PAGES FOR OUTPUT FILE
CALL FINFRE
MOVEM T1,STOPGS ;START OF OUTPUT PAGES
LSH T1,9 ;;MAKE REAL ADDRESS
MOVEM T1,STOPG2 ;STORE IT
MOVE T2,NPAGES
LSH T2,9
ADDI T1,-1(T2) ;GET LAST WORD OF DEST BUFFER
MOVEM T1,ENDPTR
;MAP FROM DESTINATION
DSKLUP: HRL T1,OJFN
HRR T1,NXTBEG ;CORRESPONDING PAGES OF SOURCE
MOVE T2,STOPGS ; MAP INTO DESTINATION BUFFER
HRLI T2,.FHSLF ;OUR FORK
MOVX T3,PM%WR!PM%CNT ;WRITE, REPEAT COUNT
HRR T3,NPAGES
PMAP%
;SEE IF HE WANTS TO REPLACE THE FIRST 72 CHARS
SKIPN FSTLIN
JRST DSKBL1 ;NO, JUST COPY
;COPY A FEW WORDS, THEN CHANGE IT IN MEMORY
HRL T1,STIPG2 ;FROM HERE
HRR T1,STOPG2 ; TO HERE
MOVEI T2,777(T1) ;FIRST PAGE
BLT T1,(T2) ;COPY FIRST PAGE -- SHOULD HAVE NO ERRORS!
;CHANGE 1ST 72 CHARS
MOVEI T4,^D72
HRRZ T3,FSTLIN ;ADDRESS OF TEXT
HRRZ T2,STOPG2 ;CHANGE THIS
HRLI T2,(POINT 7,)
HRLI T3,(POINT 7,)
C72LUP: ILDB T1,T3
IDPB T1,T2
SOJG T4,C72LUP
HRRZ T1,STIPG2 ;NOW SKIP FIRST PAGE..
HRLI T1,1000(T1)
HRR T1,STOPG2
ADDI T1,1000
MOVEM T1,BLTPTR
SETZM FSTLIN ;COPIED FIRST LINE, CLEAR IT
JRST DSKBLT ;START AT PAGE 1
;HERE TO TRY DSK BLT
DSKBL1: HRL T1,STIPG2 ;FROM HERE
HRR T1,STOPG2 ; TO HERE
MOVEM T1,BLTPTR ;REMEMBER BLT POINTER
TRNA ;SKIP LOAD OF BLT PTR FIRST TIME
DSKBL0: MOVE T1,BLTPTR ;GET BLT PTR
DSKBLT: MOVE T2,ENDPTR ;GET ADDRESS OF LAST WORD OF DEST BUFFER
BLT T1,(T2) ;COPY THE DATA
ERJMP DSKDIS ;PROBABLY END OF FILE, HOLE, OR QUOTA EXCEEDED
MOVE T1,NPAGES ;# OF PAGES / BUFFER
ADDM T1,NXTBEG ;UPDATE PAGE TO START WITH
DSKLU1: CALL PRELD1 ; PRELOAD SOME MORE PAGES
JRST DSKLUP ;LOOP FOR NEXT PAGE GROUP
; HERE WHEN FINALLY A BLT FAILS.. (EOF, HOLE, OR QUOTA EXCEEDED)
DSKDIS: MOVEM T1,SAVBLT ;SAVE HOW FAR WE GOT BEFORE ERROR
CALL GLERR ;GET LAST ERROR CODE
CAIN T1,IOX11 ;NO ROOM?
JRST NORQTA ;NO ROOM OR QUOTA EXCEEDED
CAIE T1,ILLX01 ;NOT ROOM PROBLEM, HIT HOLE OR END?
JRST DSKDE1 ;NO, UNEXPECTED PROBLEM
LDB T1,[331100,,SAVBLT] ;GET MEM PAGE NUMBER ASSOC. WITH NONX SRC PAGE
SUB T1,STIPGS ;GET REL. POSITION IN BUFFER
ADD T1,NXTBEG ;GET ACTUAL FILE PAGE NUMBER
HRL T1,IJFN ;SET UP FOR FFUFP
FFUFP% ;FIND NEXT USED PAGE
ERJMP DSKMEF ;FAILED, PROBABLY END OF FILE
HRRZ T3,T1 ;COPY PAGE NUMBER
SUB T3,NXTBEG ;SEE WHERE IN BUFFER PAGE IS
CAML T3,NPAGES ;IN SUBSEQUENT BUFFER?
JRST DSKNXT ;YES
LSH T3,9 ;NO, IN THIS BUFFER. MAKE MEM OFFSET
MOVE T1,BLTPTR ;GET ORIGINAL BLT POINTER
ADJSP T1,(T3) ;ADJUST FOR CONTINUATION
JRST DSKBLT ;CONTINUE THIS BUFFER
DSKNXT: HRRZM T1,NXTBEG ;REMEMBER NEXT PAGE TO START WITH
JRST DSKLU1 ;GO START NEW BUFFER
DSKMEF: CALL GLERR ;GET LAST ERROR CODE
CAIE T1,FFUFX3 ;NO MORE USED PAGES?
JRST DSKER2 ;NO, UNEXPECTED ERROR
JRST DONCPP ;DONE !
; BAD ERRORS IN COPY
DSKDE1: TMSG <? Unexepected error: >
CALL LSTFER
HALTF%
RET
NORQTA: TMSG <?No room or quota exceeded
(Type "CONTINUE" when problem has been fixed)>
HALTF%
JRST DSKBL0
DSKER2: TMSG <? FFUFP failed: >
CALL LSTFER
HALTF%
RET ;RETURN FROM COPY IF "CONT"
;HERE WHEN COPY IS DONE
DONCPP: MOVE T3,NPAGES ;GET SIZE OF BUFFER
IORX T3,PM%CNT ;REPEAT COUNT
HRROI T1,-1 ;SAY REMOVING PAGES
HRLI T2,.FHSLF
HRR T2,STIPGS
PMAP% ;UNMAP PAGES
MOVE P1,NPAGES ;# PAGES TO CLEAR
MOVE T1,STIPGS ;STARTING PAGE
CALL CLRPMP ;TELL CORE ALLOCATOR THEY ARE FREE
MOVE T3,NPAGES ;NOW UNMAP OUTPUT PAGES
IORX T3,PM%CNT
HRROI T1,-1
HRLI T2,.FHSLF
HRR T2,STOPGS
PMAP%
MOVE P1,NPAGES ;CLEAR SOME PAGES
MOVE T1,STOPGS
CALL CLRPMP ;TELL CORE ALLOCATOR THEY ARE FREE
;SET END PTR ON DESTINATION FILE
MOVE T2,BCINP ;BYTE COUNT OF INPUT FILE
HRRZ T1,OJFN
SFPTR% ;SET FILE PTR
ERJMP SFPER1 ;SFPTR FAILED
HRLI T1,.FBSIZ ;SET EOF PTR IN FILE (CLOSF DOES NOT WHEN
MOVE T3,T2 ;NO SEQUENTIAL OUTPUT HAS BEEN DONE)
SETO T2,
CHFDB%
ERJMP [JSERR
HALTF%
RET]
;SET BYTE SIZE OF DEST FILE
; (CLOSF DOES NOT SET IT WHEN NO SEQ OUTPUT HAS BEEN DONE)
HRLI T1,.FBBYV
SETZ T3,
MOVE T2,BSINP ;BYTE SIZE OF INPUT FILE
DPB T2,[POINTR T3,FB%BSZ] ;BYTE SIZE
MOVX T2,FB%BSZ
CHFDB%
ERJMP [JSERR
HALTF%
RET]
;Set date/time of output file
MOVE T1,OJFN
MOVEI T2,RFTAD1 ;From input file info
MOVEI T3,2
SFTAD%
;CLOSE FILES
HRRZ T1,OJFN
TXO T1,CO%NRJ ;DON'T RELEASE JFN
CLOSF%
ERJMP CLSFE1
HRRZ T1,IJFN
TXO T1,CO%NRJ ;DON'T RELEASE JFN
CLOSF%
ERJMP CLSFE2
RET ;DONE, RETURN
;HERE IF SFPTR FAILS - CAN'T SET SIZE OF OUTPUT FILE
SFPER1: TMSG <? SFPTR failed: >
CALL LSTFER
HALTF%
RET
;CLOSF FAILURES
CLSFE1: TMSG <?Can't close output file: >
CALL LSTFER
HALTF%
RET
CLSFE2: TMSG <?Can't close input file: >
CALL LSTFER
HALTF%
RET
SUBTTL CHKNUD - CHECK UID LINE IN NEW FILE AND SET FLAGS
;MAY SET FLAGS F.NUD AND/OR F.72C
CHKNUD: HRRZ P1,STIPG2 ;START OF FILE
HRLI P1,(POINT 7,) ;POINTER TO "FILE" STRING
ILDB T1,P1 ;FIRST CHAR
CAIE T1,";"
CAIN T1,"!"
CAIA
RET ;NO UID, RETURN
MOVE T2,[POINT 7,[ASCIZ/ UPD ID= /]] ;THIS MUST BE NEXT
CALL CMPSTR ;COMPARE STRINGS
RET ;NO MATCH, NO UID
TXO F,F.NUD ;FOUND UID LINE
MOVE T1,P1 ;READY TO READ THE UID NUMBER
MOVEI T3,^D10 ;READ DECIMAL UID
NIN%
IFJER.
SETZ T2,
ENDIF.
MOVEM T2,UID1 ;SAVE
;SEE HOW LONG IT IS, SET FLAG F.72C IF 72 CHARS EXACTLY (BEFORE CRLF)
HRRZ P1,STIPG2 ;RESET POINTER
HRLI P1,(POINT 7,)
SETZ T4, ;CHAR COUNT
CHKNU1: ILDB T1,P1 ;GET A CHAR
CAIN T1,.CHCRT ;CARRIAGE RETURN?
JRST CHKNU2 ;YES, SEE IF 72 CHARS BEFORE IT
AOJ T4, ;ANOTHER ONE
CAIG T4,^D72
JRST CHKNU1 ;KEEP LOOKING
RET ; MORE THAN 72 CHARS
CHKNU2: CAIN T4,^D72 ;EXACTLY 72?
TXO F,F.72C ;YES, SET FLAG
RET ;AND RETURN
SUBTTL BLDNUI - ROUTINE TO BUILD A NEW UID LINE
;THIS ROUTINE GETS THE NEXT UID NUMBER AND PUTS IT IN THE
; UID TEXT. THE TEXT IS STORED IN "UIDTXT". IT PADS SPACES
; ON THE END TO GET TO 72 CHARS.
BLDNUI: MOVE T1,[ASCIZ/ /] ;5 SPACES
SKIPN SWRUID ;REPLACING UID LINES?
SETZ T1, ;NO, USE NULL INSTEAD
MOVEM T1,UIDTXT ;FILL UIDTXT UP WITH SPACES
MOVE T1,[UIDTXT,,UIDTXT+1]
BLT T1,UIDTXT+LUIDTX-1
MOVE P1,[POINT 7,UIDTXT] ;P1:= PTR TO OUTPUT TEXT
;GET WHICH COMMENT CHARACTER TO USE
MOVE T2,EXTNUM ;WHICH EXTENSION
HLRZ T1,EXTLST(T2) ;GET THE CHAR
IDPB T1,P1 ;STORE FIRST CHAR
;INITIAL STRING IS "UPD ID= "
MOVE T3,[POINT 7,[ASCIZ/ UPD ID= /]]
CALL CPT3P1 ;COPY FROM T3 TO P1 TILL NULL
;GO GET A UID
PUSH P,P1
CALL ALUUID
POP P,T1 ;GET STRING POINTER IN T1
MOVE T2,NEWUID ; GET UID NUMBER TO PUT IN STRING
MOVEI T3,^D10 ;RADIX 10
NOUT%
ERCAL IMPERR ;ALU OR MONITOR BUG
MOVE P1,T1 ;COPY UPDATED STRING PTR
SKIPE SWRUID ;REPLACING UID LINES?
JRST BLDNU1 ;YES, DIFFERENT FORMAT
MOVE T3,[POINT 7,[ASCIZ/, /]]
CALL CPT3P1 ;COPY FROM T3 TO P1 TILL NULL
MOVE T1,P1 ;OUTPUT TO END OF STRING
HRRZ T2,OJFN
MOVX T3,1B2+1B5+1B8+1B11+1B14+JS%PAF
JFNS% ;OUTPUT FULL FILE NAME
HRROI T2,[ASCIZ /, /]
SETZ T3,
SOUT
SETO T2, ;CURRENT DATE/TIME
SETZ T3, ;STANDARD FORMAT
ODTIM%
ERJMP MAZTME
MOVEM T1,P1 ;UPDATE STRING PTR
JRST BLDNU2 ;CONTINUE WITH LINE
BLDNU1: MOVE T3,[POINT 7,[ASCIZ/ on /]]
CALL CPT3P1 ;COPY FROM T3 TO P1 TILL NULL
MOVE T1,P1 ;OUTPUT TO END OF STRING
SETO T2, ;CURRENT DATE/TIME
MOVX T3,OT%SLA+OT%NMN+OT%SCL+OT%DAM+OT%NTM ;DATE WITH SLASHES, NO TIME
ODTIM%
ERJMP MAZTME
MOVEM T1,P1
MOVE T3,[POINT 7,[ASCIZ/ at /]]
CALL CPT3P1 ;COPY FROM T3 TO P1 TILL NULL
CALL GTTIM ;READ THE TIME INTO HLDTM1
RET ;ERROR, RETURN
MOVE T3,[POINT 7,HLDTM1]
CALL CPT3P1 ;COPY FROM T3 TO P1 TILL NULL
BLDNU2: MOVE T3,[POINT 7,[ASCIZ/ by /]]
CALL CPT3P1 ;COPY FROM T3 TO P1 TILL NULL
MOVE T3,[POINT 7,USRNAM] ;COPY USER NAME
CALL CPT3P1 ;COPY FROM T3 TO P1 TILL NULL
AOS (P) ;ALL OK, SKIP RETURN
RET ;RETURN
SUBTTL OUT1ST - WRITE 1ST LINE (UID) TO OUTPUT FILE
;THIS IS DONE IN BYTE MODE I/O
;ALWAYS RETURNS .+1
OUT1ST: MOVE T1,OJFN ;WRITE TO HERE
MOVE T2,[POINT 7,UIDTXT] ;NEW UID TEXT
MOVNI T3,^D72 ;WRITE 72 BYTES
SKIPN SWRUID ;IF NOT REPLACING UID LINES
SETZ T3, ;THEN JUST WRITE TO NULL
SOUT%
ERJMP OUT1ER ;FAILED-- GO SEE WHY
HRROI T2,CRLF
SETZ T3,
SOUT%
ERJMP OUT1ER
RET ;RETURN
OUT1ER: CALL GLERR ;GET LAST ERROR CODE
CAIN T1,IOX11 ;QUOTA EXCEEDED
JRST OUT1QE ;YES
TMSG <? Can't write 1st line of output file: >
CALL LSTFER ;SAY WHY
HALTF%
RET ;RETURN IF CONTINUE
OUT1QE: TMSG <?Quota exceeded or disk full
(Please fix the problem and type "continue")>
HALTF%
JRST OUT1ST ;START ROUTINE AGAIN
SUBTTL GETCD - GET CONNECTED DIRECTORY STRING AND PUT IN "CD"
GETCD: SETO T1, ;-1 FOR CURRENT JOB
MOVE T2,[-1,,T4] ;GET CONNECTED DIRECTORY NUM IN T4
MOVEI T3,.JIDNO
GETJI%
ERJMP GETCDE ;?FAILED
MOVE T1,[POINT 7,CD] ;PUT IN "CD"
MOVE T2,T4
DIRST%
JFCL ;ALL ERRORS SHOULD NEVER HAPPEN
;MAKE SURE HE IS NOT CONNECTED TO ANY OF THE LIBRARIES
; IF HE IS, MAKE HIM FIX IT AND TYPE "CONTINUE"
MOVSI P1,-NMLIBS ;AOBJN PTR TO LIBRARIES
GETC1A: HRRZ T2,LIBLST(P1) ;POINTER TO ASCIZ <LIB>
HRLI T2,(POINT 7,) ;MAKE A REAL B.P.
MOVE T1,[POINT 7,CD] ;POINT TO THIS DIRECTORY NAME
GETCD2: ILDB T3,T1
ILDB T4,T2 ;GET CHAR FROM EACH
JUMPE T3,GETCD3 ;END OF CONNECTED DIRECTORY STRING
CAIN T3,(T4) ;STILL MATCH?
JRST GETCD2 ;YES
GETCDO: AOBJN P1,GETC1A ;LOOP FOR ALL LIBRARIES
RET ;RETURN, ALL DONE
GETCD3: JUMPN T4,GETCDO ;NO MATCH, OK
;CONNECTED DIRECTORY STRING MATCHES A LIBRARY DIRECTORY STRING
; DON'T ALLOW THIS!
;GETCD ROUTINE (CON'T)
TMSG <?You cannot be connected to >
TYPE CD ;TYPE THE CONNECTED DIRECTORY NAME
TMSG < - it is a library
[Please CONNECT somewhere else and type CONTINUE or START]
>
HALTF%
JRST GETCD ;TRY AGAIN IF HE CONTINUES
GETCDE: TMSG <?Can't get your connected directory name: >
CALL LSTFER
HALTF%
JRST GETCD ;TRY AGAIN
SUBTTL CHKRME - SEE IF FILE IS RESERVED BY ME.
;WE HAVE FOUND A MAZ FILE AND ITS JFN IS NOW IN "MAZJFN".
; THIS ROUTINE READS IT AND CHECKS TO MAKE SURE IT SAYS
; THE FILE WAS RESERVED BY ME.
;IF THERE IS AN ERROR, IT RELEASES THE JFN AND RETURNS
; TO .+1.
;IF EVERYTHING IS OK, IT CLOSES THE FILE AND RETURNS TO .+2.
;OPEN FOR READING
CHKRME: TDZA T1,T1 ;FLAG CHECK RESERVATION
CHKFME: SETO T1, ;FLAG CHECK FREEZE
SAVEAC <P1>
TRVAR <CHKMEF>
MOVEM T1,CHKMEF ;SAVE FLAG
HRRZ T1,MAZJFN
MOVX T2,OF%RD+7B5
OPENF%
ERJMP CHKRE1 ;?CAN'T OPEN FOR READING
;READ FIRST LINE INTO A BUFFER
CHKRM1: SETZM MAZBUF ;CLEAR BUFFER
MOVE T1,[MAZBUF,,MAZBUF+1]
BLT T1,MAZBUF+.MAZLN-1
HRRZ T1,MAZJFN ;FROM HERE
MOVE T2,[POINT 7,MAZBUF] ;TO HERE
MOVEI T3,LINLEN ;80 CHARS MAX
MOVEI T4,.CHLFD ;TERMINATE WITH A LINE FEED
SIN%
IFJE. (R)
CAIE T1,IOX4 ;END OF FILE REACHED?
JRST CHKRE2 ;NO, UNEXPECTED ERROR
ENDIF.
;CLOSE BUT DON'T RELEASE JFN
CHKRM2: HRRZ T1,MAZJFN
TXO T1,CO%NRJ ;DON'T RELEASE JFN
CLOSF%
ERJMP CHKRE3 ;OOPS.. CAN'T
;NOW PARSE THE LINE TO SEE IF IT WAS RESERVED BY ME
MOVE P1,[POINT 7,MAZBUF] ;POINT TO LINE
MOVE T2,[POINT 7,[ASCIZ/! Reserved by /]]
SKIPE CHKMEF ;WHICH FLAVOR?
MOVE T2,[POINT 7,[ASCIZ /! Frozen by /]]
CALL CMPSTR ;CHECK MAZ STRING, UPDATE P1
JRST BADFMT ;DOESN'T MATCH, BAD FORMAT
MOVEM P1,SAVNSP ;SAVE NAM: STRING PTR
;FALL
;READ "<NAM>" AND CHECK TO SEE IF IT'S ME.
MOVE T2,[POINT 7,HNBUF] ;PLACE TO HOLD NAME STRING:
CHKRM3: ILDB T1,P1 ;GET CHAR FROM MAZ FILE
JUMPE T1,CHKRE4 ; ?SHOULDN'T FIND A NULL!
IDPB T1,T2 ;STORE CHAR
CAIE T1," " ;WAS IT A SPACE?
JRST CHKRM3 ;NO, LOOP
SETZ T1, ;STORE NULL TO END STRING
DPB T1,T2
;CHECK TO SEE IF ME
MOVE T3,[POINT 7,USRNAM] ;BYTE PTR TO USER NAME STRING
MOVE T1,[POINT 7,HNBUF] ;BYTE PTR TO MAZ STRING
CHKRM4: ILDB T2,T1
ILDB T4,T3
JUMPE T2,[JUMPN T4,NOTRME ;NOT RESERVED BY ME!
JRST RSVME] ;ELSE IS RESERVED BY ME
CAIN T2,(T4)
JRST CHKRM4 ;ALL RIGHT SO FAR
NOTRME: TXNE F,F.SUSR ;MESSAGE WANTED HERE?
IFSKP.
MOVEI T1,"?"
DPB T1,[POINT 7,MAZBUF,6] ;MAKE FIRST CHAR ?
TYPE MAZBUF ;?Reserved by..
ENDIF.
HRRZ T1,MAZJFN
RLJFN% ;RELEASE MAZ FILE JFN
ERJMP .+1
RET ;RETURN
;FILE WAS RESERVED BY ME -- READ IN DIRECTORY NAME WHERE IT IS
RSVME: TXNN F,F.SUSR ;JUST CHECKING STATUS?
SKIPE CHKMEF ;CHECKING FREEZE?
RETSKP ;YES, DONE
MOVE T2,[POINT 7,[ASCIZ/at /]]
CALL CMPSTR ;MAKE SURE STRINGS MATCH
JRST BADFMT ;? FILE IS WRONG FORMAT
MOVEM P1,SAVNSP ;SAVE POINTER INCASE ERRORS
MOVE T2,[POINT 7,RDIR]
RSVME1: ILDB T1,P1 ;GET CHAR FROM MAZ FILE
JUMPE T1,CHKRE4 ;GO COMPLAIN
IDPB T1,T2 ;STORE CHAR
CAIE T1,">" ;WAS THAT A CLOSING BRACKET?
JRST RSVME1 ;NO, LOOP
SETZ T1, ;NULL TO END STRING
IDPB T1,T2
AOS (P) ;SKIP RETURN
RET
; ERRORS IN CHKRME ROUTINE
CHKRE1: TMSG <?OPENF failed for MAZ file: >
CALL LSTFER
HALTF%
JRST CHKRME ;TRY OPENF AGAIN
CHKRE2: TMSG <? Can't read first line of MAZ file: >
CALL LSTFER
HALTF%
JRST CHKRM1 ;TRY AGAIN IF CONTINUE
CHKRE3: TMSG <?CLOSF failed for MAZ file: >
CALL LSTFER
HALTF%
JRST CHKRM2 ;TRY AGAIN IF CONTINUE
BADFMT: TMSG <?Bad format for MAZ file
>
HRRZ T1,MAZJFN
RLJFN% ;RELEASE JFN
ERJMP .+1
RET ;RETURN .+1
CHKRE4: TMSG <? Can't read name string in MAZ file, it is: >
MOVE T1,SAVNSP ;SAVED NAME STRING PTR
PSOUT% ;TYPE REST OF LINE
HALTF%
RET
ENDTV.
SUBTTL CMPSTR - COMPARE STRING TO FILE TEXT
;ARGS:
; P1/ POINTER TO FILE TEXT
; T2/ POINTER TO STRING TO MATCH
;IF NO MATCH, POPJ
; ELSE SKIP WITH P1 UPDATED
CMPSTR: ILDB T3,T2 ;GET STRING MATCH CHAR
JUMPE T3,RSKP ;MATCH IF MATCH STRING ENDED
ILDB T1,P1 ;GET MAZ CHAR
JUMPE T1,RTN ;NO MATCH IF MAZ STRING ENDED
CAIN T1,(T3) ;ALL RIGHT SO FAR?
JRST CMPSTR ;YES, KEEP GOING
RET ;NO MATCH, POPJ
JRST CMPSTR ;GO ON TO NEXT CHAR
SUBTTL CHKCNN - SEE IF CONNECTED DIRECTORY IS WHERE FILE IS
;THIS ROUTINE IS CALLED BY "REPLACE" TO CHECK IF THE CONNECTED
; DIRECTORY IS THE SAME ONE THAT THE FILE WILL BE REPLACED FROM.
; If not, ask the user whether he wants the file on his connected
;directory to be the replacement file. If not, F.SPCR is set.
;
;INPUT: CD/ CONNECTED DIRECTORY
; RDIR/ RESERVED DIRECTORY
;RETURNS: .+1 AFTER THE COMMAND IS CONFIRMED
CHKCNN: MOVE T1,[POINT 7,CD]
MOVE T2,[POINT 7,RDIR]
CHKCN0: ILDB T3,T1 ;GET CHAR FROM CD
ILDB T4,T2 ;GET CHAR FROM RDIR
JUMPE T3,CHKCN1 ;END OF CD
CAIN T3,(T4) ;STILL MATCH?
JRST CHKCN0 ;YES, LOOP
;NO MATCH, HAVE TO CONFIRM THIS
CHKCNC: TMSG <% File was reserved on >
TYPE RDIR
TMSG <, but you are now connected to >
TYPE CD
TMSG <.
Do you want to replace from the connected directory? >
CALL YESNO
TXO F,F.SPCR ;No, say special filespec
RET ;Yes, continue
CHKCN1: JUMPN T4,CHKCNC ;NO MATCH
RET ;MATCHES, OK
SUBTTL SETMAB - SET JFNS FOR MAB FILE, IFILE, OFILE
;ERRORS RETURN TO .+1 WITH ALL JFN'S RELEASED
; RETURNS .+2 IF ALL OK WITH NEW OUTPUT FILE JFN IN OJFN
SETMAB: HRRZ T2,GTFJFN ;JFN OF RESERVED FILE
HRROI T1,RETJNM ; RETURN STRING HERE
MOVX T3,1B2+1B5+1B8+1B11+JS%PAF ;RETURN DEV:<DIRECTORY>NAME.EXT
JFNS%
SKIPN SWBAKF ;MAKING BACKUP FILES?
JRST SETMB1 ;NO
HRRZ T2,GTFJFN
HRROI T1,MABJNM ; GET NAME OF BAK FILE
MOVX T3,1B2+1B5+1B8+JS%PAF ;DEV:<DIRECTORY>NAME
JFNS%
;TACK ON EXT
MOVEI T2,"."
IDPB T2,T1
HRRZ T2,EXTNUM ;WHICH EXTENSION NUMBER
HRRZ T3,EXBLST(T2) ;MAKE T3 POINT TO IT
HRLI T3,(POINT 7,)
DORN1: ILDB T2,T3 ;GET A CHAR
IDPB T2,T1 ;STASH IN NAME
JUMPN T2,DORN1 ;KEEP GOING TILL NULL
;GET A JFN FOR IT
DORN2: MOVX T1,GJ%SHT+GJ%FOU
MOVE T2,[POINT 7,MABJNM]
GTJFN%
ERJMP DORNE2 ;?SHOULDN'T FAIL
MOVEM T1,MABJFN
;DO GTJFN TO WRITE A NEW ONE
SETMB1: MOVX T1,GJ%SHT+GJ%FOU
MOVE T2,[POINT 7,RETJNM]
GTJFN%
ERJMP DORNE4 ;? DARN, CAN'T.
MOVEM T1,OJFN ;THAT BECOMES THE "OUTPUT FILE" JFN
AOS (P) ;RETURN OK
RET
;ERRORS IN "SETMAB" ROUTINE
DORNE2: TMSG <?GTJFN failed for MAB file: >
CALL LSTFER
HALTF%
JRST DORN2 ;TRY IT AGAIN
DORNE4: TMSG <?GTJFN failed for new output file: >
CALL LSTFER
HALTF%
RET ;RETURN BAD
SUBTTL DORNAM - RENAME OLD FILE TO MAB
DORNAM: SKIPN SWBAKF ;MAKING BACKUP FILES?
JRST DORNA1 ;NO
;RENAME IT
HRRZ T1,GTFJFN ;SOURCE
HRRZ T2,MABJFN ;DEST.
RNAMF% ;RENAME IT
ERJMP DORNE3 ;? CANT, GO COMPLAIN
DORNA1: AOS (P)
RET
DORNE3: TMSG <?RNAMF failed: >
CALL LSTFER
HALTF%
RET ;ERROR
SUBTTL ROUTINE TO PARSE "WHY" TEXT
;CALL: CALL PRSWHY
; <RETURNS HERE WITH TEXT IN WHYTXT>
PRSWHY: MOVE T1,[POINT 7,[ASCIZ/(Why?) /]]
CALL PR2SET ;SETUP 2ND PARSE
MOVEI T1,CM2BLK ;USING THIS PARSE BLOCK NOW
MOVEI T2,[FLDDB. (.CMTXT,CM%SDH,,<One-line comment for FILUPD.HST>)]
CALL COMMND ;PARSE IT
; COPY ANSWER TO "WHYTXT" - IF NO ANSWER GIVEN, ASK AGAIN
MOVE T3,[POINT 7,ATM2BF] ;FROM HERE
MOVE T2,[POINT 7,WHYTXT] ;TO HERE
ILDB T1,T3 ;GET 1ST CHAR
JUMPE T1,PRSWHY ;GO ASK AGAIN IF NOTHING TYPED
IDPB T1,T2 ;SOMETHING, STORE 1ST CHAR
PRSWH1: ILDB T1,T3
IDPB T1,T2
JUMPN T1,PRSWH1 ;LOOP IF MORE CHARS
MOVEI T1,.CHCRT ;APPEND CRLF
DPB T1,T2
MOVEI T1,.CHLFD
IDPB T1,T2
SETZ T1,
IDPB T1,T2 ;AND END WITH NULL
RET
SUBTTL COMMON ROUTINES USED BY COMMAND SCANNERS
;SETUP FOR 2ND COMMAND PARSE
;CALL: T1/ POINTER TO CONTROL-R BUFFER
; CALL PR2SET
; <RETURNS HERE>
PR2SET: SKIPN T1 ;ANY BP GIVEN?
HRROI T1,[0] ;NO, GET A NULL ONE
MOVEM T1,CM2BLK+.CMRTY ;SETUP CONTROL-R BUFFER
POP P,T3 ;GET PUSHDOWN PTR THE WAY IT SHOULD BE
MOVEM P,CM2P ;REMEMBER IT
PUSH P,T3 ;RESTORE P
HRRZM T3,PR2STA ;SAVE ADDR AFTER THIS PUSHJ
MOVEI T1,CM2BLK ;INITIALIZE
MOVEI T2,[FLDDB. (.CMINI)]
COMND% ;DO IT
RET ;RETURN
;HERE IF A REPARSE IS NEEDED FOR CM2 FUNCTIONS
NEWPR2: MOVE P,CM2P ;RESTORE PDL
JRST @PR2STA ;START AGAIN AT THE RIGHT ADDRESS
;read a tty line
ITTLIN: MOVEI T1,TXTIBL ;USE TEXTI BLOCK
MOVE T2,[POINT 7,TLINE] ;BUFFER POINTER
MOVEM T2,.RDDBP(T1) ;STORE IT
MOVEI T2,TXTLEN ;SIZE
MOVEM T2,.RDDBC(T1) ;STORE THAT
MOVX T2,RD%JFN!RD%BEL ;BREAK ON END OF TTY LINE
MOVEM T2,.RDFLG(T1) ;STORE FLAGS
TEXTI% ;DO TEXTI
ERJMP [JSERR
RET]
AOS (P) ;GOOD RETURN
RTN: RET ;RETURN OK
SUBTTL COMMAND ERRORS
LOSE: TMSG <
? > ;TYPE PRELIMINARY ERROR TEXT
CALL LSTFER ;TYPE LAST ERROR IN THIS FORK
LOSFIN: TYPE CRLF ;TYPE FINAL STRING
ERESET: MOVEI T1,.PRIIN ;GET READY
CFIBF% ;CLEAR INPUT BUFFER
MOVE P,[IOWD PDLSIZ,PDL] ;RESET STACK
JRST NEWCMD ;AND GO GET ANOTHER COMMAND
;TYPE LAST ERROR IN THIS FORK
LSTFER: MOVEI T1,.PRIOU ;OUTPUT TO TERMINAL
HRLOI T2,.FHSLF ;LAST ERROR IN THIS FORK
SETZ T3, ;ALL OF THE TEXT
ERSTR%
JFCL
JFCL
RET
;GET LAST ERROR IN THIS FORK
GLERR: MOVEI T1,.FHSLF
GETER%
HRRZ T1,T2 ;Error code only
RET
;LSTFER + CRLF
LSTFRC: CALL LSTFER
TMSG <
>
RET
;UNEXPECTED FATAL ERROR
FATAL: TMSG <
?Unexpected error at >
MOVE T2,0(P) ;PC FROM ERCAL
MOVEI T1,.PRIOU
MOVEI T3,^D8
NOUT%
ERJMPS .+1
TMSG <
?>
CALL LSTFRC ;ERROR MSG
HALTF
JRST ST1 ;IF CONTINUED
SUBTTL COMMAND JSYS SUBROUTINES
NOISE: HRROM T2,NOIBLK+.CMDAT ;SAVE AS DATA
MOVEI T2,NOIBLK ;POINT TO BLOCK
JRST COMMND ;AND GO TO COMND JSYS
CONFRM: MOVEI T2,[FLDDB. (.CMCFM)] ;GET CONFIRM FUNCTION
COMMND: COMND% ;PARSE THE FUNCTION
ERJMP LOSE ;ERROR, GO COMPLAIN
TXNE T1,CM%NOP ;DID IT PARSE?
JRST LOSE ;NO, COMPLAIN
RET ;YES, RETURN SUCCESSFULLY
NOIBLK: FLDDB. (.CMNOI) ;BLOCK FOR NOISE FUNCTION
SUBTTL BYTWRT - ROUTINE TO COPY FILE WITH BYTE I/O
;IJFN AND OJFN FILES ARE OPEN
; AFTER THIS ROUTINE COPIES EVERYTHING, IT CLOSES BOTH FILES
; BUT LEAVES THE JFNS ASSIGNED.
BYTWRT: MOVEI P1,1 ;GET A PAGE FOR SIN/SOUT'S
CALL FINFRE
MOVEM T1,STIPGS
LSH T1,^D9
MOVEM T1,STIPG2
RWSLUP: MOVE T1,IJFN ;READ FROM HERE
HRR T2,STIPG2 ;TO HERE
HRLI T2,(POINT 7,)
MOVNI T3,^D512*5 ; READ WHOLE PAGE IF WE CAN
SIN%
ERJMP LNDON1 ;ERROR READING.. PROBABLY EOF
RWSLP1: MOVE T1,OJFN
HRR T2,STIPG2
HRLI T2,(POINT 7,)
MOVNI T3,^D512*5 ;NOW WRITE THE WHOLE PAGE BACK OUT
SOUT%
ERJMP LNDON2 ;ERROR WRITING.. PROBABLY NO ROOM
JRST RWSLUP ;READ/WRITE SLOW LOOP
LNDON1: MOVE P2,T3 ;SAVE BYTE COUNT
CALL GLERR ;GET LAST ERROR CODE
CAIN T1,IOX4 ;EOF?
JRST BYWEOF ;YES
TMSG <? COPY failure reading: >
CALL LSTFER
HALTF%
RET
;HERE WHEN WE GET TO EOF
BYWEOF: MOVNI T3,^D512*5 ;COMPUTE BYTE COUNT
SUB T3,P2
MOVE T1,OJFN
HRRO T2,STIPG2
SOUT% ;WRITE LAST PART
ERJMP LNDON3 ;ERRORS...
;DONE!
MOVE T1,OJFN ;CLOSE OUTPUT FILE
TXO T1,CO%NRJ ;; DON'T RELEASE JFN
CLOSF%
IFJER.
TMSG <? Couldn't close OJFN
>
ENDIF.
MOVE T1,IJFN ;CLOSE INPUT FILE
TXO T1,CO%NRJ
CLOSF%
IFJER.
TMSG <? Couldn't close IJFN
>
ENDIF.
RET ;RETURN
LNDON2: CALL CHKQTE ;CHECK FOR QUOTA EXCEEDED
JRST RWSLP1 ;GO TRY AGAIN
TMSG <? Error writing file: >
CALL LSTFER
HALTF%
JRST RWSLP1 ;GO TRY AGAIN
LNDON3: CALL CHKQTE ;CHECK FOR QUOTA EXCEEDED
JRST BYWEOF ;GO TRY AGAIN
TMSG <? Error writing file: >
CALL LSTFER
HALTF%
JRST BYWEOF ;GO TRY AGAIN
;ROUTINE TO CHECK FOR OTHER GENERATED OUTPUT FILES AND COPY THE
;ONES CREATED AFTER THE SOURCE FILE.
CHKOF: MOVE T2,EXTNUM ;WHICH EXTENSION?
SKIPN T4,EXOLST(T2) ;ANY POSSIBLE OUTPUT FILES?
RET ;NO, JUST RETURN
DMOVE T1,RFTAD1 ;Get DATE/TIME of main source
DMOVEM T1,RFTADS ;Save that info..
;NOW T4= AOBJN LIST TO [ASCIZ/OEXT/]
CHKOF1: MOVEM T4,CKOFLP ;Save ptr.
MOVE T1,[POINT 7,IFINAM] ;GET POINTER TO FILENAME STRING
;N.B.: CAN'T JUST SEARCH FOR ".", DIRECTORY NAMES MAY CONTAIN "."
DO.
ILDB T2,T1 ;GET CHARS FROM <DIR>FIL.EXT TEXT
CAIE T2,76 ;GET TO END ANGLE BRACKET OF DIRECTORY
LOOP.
ENDDO.
DO.
ILDB T2,T1 ;NOW THE "." FOR EXTENSION
CAIE T2,"."
LOOP.
ENDDO.
HRRZ T3,(T4) ;GET ADDRESS OF ASCII OUTPUT EXT.
HRLI T3,(POINT 7,) ;APPEND THIS EXT.
DO.
ILDB T2,T3
JUMPE T2,ENDLP.
IDPB T2,T1
LOOP.
ENDDO.
SETZ T2,
IDPB T2,T1 ;NULL TO END FILENAME STRING
;DO GTJFN FOR THIS FILE, IF NOT THERE, GO ON TO NEXT
MOVX T1,GJ%SHT!GJ%OLD
MOVE T2,[POINT 7,IFINAM]
GTJFN%
ERJMP CHKOFN ;FAILED, GO ON TO NEXT FILE
MOVEM T1,IJFN ;SAVE INPUT JFN
;LOOK AT DATE, IF FILE IS OLDER THAN THE SOURCE, DON'T COPY IT
MOVE T1,IJFN ;HERE'S JFN OF THE FILE
MOVEI T2,RFTAD1 ;ADDR OF ARG BLOCK
MOVEI T3,2 ;LENGTH OF ARG BLOCK
RFTAD% ;GO GET DATE/TIME INFO
MOVE T1,RFTAD1+.RSWRT ;TIME FILE WAS LAST WRITTEN
CAMGE T1,RFTADS+.RSWRT ;WAS IT BEFORE THE SOURCE?
JRST CHKOF5 ;YES, DON'T DO THE RENAME
;FILE IS NEWER THAN THE SOURCE.. COPY IT TO LIBRARY ALSO
;GET A JFN FOR OUTPUT FILE AND PUT IN "OJFN"
MOVE T2,LIBNUM ;WHICH LIBRARY?
HRRZ T2,LIBLST(T2) ;Get DEV:<DIR> of library
HRLI T2,(POINT 7,) ;T2= ptr to it
MOVE T1,[POINT 7,RETJNM] ;RETURN STRING HERE
CALL CPYNUL
HRRZ T2,GTFJFN ;Real source name
MOVX T3,1B8
JFNS%
MOVEI T2,"."
IDPB T2,T1
HRRZ T2,IJFN ;Ext from this gen. output file.
MOVX T3,1B11 ;EXT
JFNS%
MOVX T1,GJ%SHT+GJ%FOU
HRROI T2,RETJNM
GTJFN%
ERJMP CHKOE1 ;?CAN'T -- GO COMPLAIN
MOVEM T1,OJFN ;SAVE JFN
;Tell user what we're doing a la EXEC "copy"
TMSG < > ;Type a space
MOVEI T1,.PRIOU ;Write to TTY:
HRRZ T2,IJFN
SETZ T3,
JFNS% ;The source filespec
TYPE TOINDI ;Look like a copy
MOVEI T1,.PRIOU
HRRZ T2,OJFN
SETZ T3,
JFNS% ;The dest filespec
TMSG < > ;Type a space
TXNE F,F.RCPY ;Did we copy the new source file?
JRST GOCPOF ;Yes, do a COPY for the new source also
GORNRL: MOVE T1,OJFN ;Get T1= JFN of output file
CALL SETGRC ;Set generation-retention-count
JRST GOCPOF ;?can't, Do a COPY instead.
MOVE T1,IJFN ;PREPARE FOR RENAME
MOVE T2,OJFN
RNAMF%
ERJMP RNFL1 ;FAILED.. GO SEE WHY
;Here when COPY or RENAME is done.
; The new file has been deleted from my area and
; IJFN has been released.
ROJFN: MOVE T1,OJFN
RLJFN%
JFCL ;NO ERROR SHOULD HAPPEN!
TYPE <[ASCIZ/[OK]
/]>
JRST CHKOFN ;GO ON TO NEXT OUTPUT FILE
;HERE IF RENAME FAILED
RNFL1: CALL GLERR ;GET LAST ERROR CODE
CAIN T1,RNAMX4
JRST RNFL2 ;?QUOTA EXCEEDED IN DEST OF RENAME
TMSG <
? Can't rename >
TYPE IFINAM
TMSG <: >
CALL LSTFER ;TYPE THE ERROR
HALTF%
JRST GORNRL ;TRY AGAIN IF "CONTINUE"
RNFL2: TYPE <[ASCIZ/
?Quota exceeded on library
[Please fix the problem and type "CONTINUE"]/]>
HALTF%
JRST GORNRL ;TRY IT AGAIN
;Here if we must copy the generated output file to the library
;IJFN and OJFN set up but no yet OPEN.
GOCPOF: CALL OPENO ;Get ready to write new file
RET ;Errors, forget it
CALL IOPEN ;Open file for reading
JRST [CALL RLOJFN ;Errors, release OJFN
RET] ;And return
CALL PRELD0 ;Preload some pages
CALL PPCPY ;** Copy the file **
HRRZ T1,IJFN ;Now delete the file from my area
MOVEI T2,0 ;Keep 0 generations
DELNF%
IFJER.
TMSG <%Can't delete >
TYPE IFINAM ;Type the name
CALL LSTFRC
TMSG <, continuing...
>
ENDIF.
HRRZ T1,IJFN ;Throw away new object file's JFN
RLJFN%
ERJMP .+1 ; Error, ignore it
JRST ROJFN ;Done with this file
;HERE IF CAN'T GTJFN OUTPUT FILE
CHKOE1: TMSG <?Can't write output file: >
CALL LSTFER
TYPE CRLF
CHKOF5: MOVE T1,IJFN
RLJFN% ;RELEASE JFN AND CLOSE FILE
JFCL ;NO ERROR SHOULD HAPPEN!
CHKOFN: MOVE T4,CKOFLP ;Get AOBJN ptr to list of extensions
AOBJN T4,CHKOF1 ;LOOP FOR ALL OUTPUT FILENAMES
RET ;DONE, RETURN
;ROUTINE TO OUTPUT A REPLACE ENTRY TO FILUPD.HST
;CALL: "WHY" TEXT IN "WHYTXT"
; UID IN NEWUID
DOLOG: CALL STLOG ;START LOG ENTRY
MOVE T2,[POINT 7,[ASCIZ/
Replaced /]]
CALL LOGSTR
MOVE T1,P1
CALL TACKLB ;LIB:
MOVE T2,OJFN
MOVX T3,1B8+1B11+JS%PAF ;JUST FILENAME.EXT
JFNS%
MOVE P1,T1
MOVE T2,[POINT 7,[ASCIZ/
Updated file: /]]
CALL LOGSTR
MOVE T1,P1 ;DESTINATION
MOVE T2,OJFN ; FILE WE ARE WRITING TO
MOVX T3,1B2+1B5+1B8+1B11+1B14+JS%PAF
JFNS%
MOVE P1,T1
MOVE T2,[POINT 7,[ASCIZ/
Copied from: /]]
CALL LOGSTR
MOVE T2,[POINT 7,FROMFL]
CALL LOGSTR
SKIPN SWFUID ;UID IN FILE?
JRST DOLOG2 ;NO, CAN'T PRINT UID:
MOVE T2,[POINT 7,[ASCIZ/ UID: /]]
CALL LOGSTR
SKIPN T2,UID1 ;ANY UID?
JRST DOLOG1 ;NO, SAY "NONE"
MOVE T1,P1
MOVEI T3,^D10
NOUT%
ERCAL IMPERR
MOVE P1,T1
JRST DOLOG2
;DOLOG ROUTINE (CONT'D)
DOLOG1: MOVE T2,[POINT 7,[ASCIZ/NONE/]]
CALL LOGSTR
DOLOG2: SKIPN SWBAKF ;MAKING BACKUP FILE?
JRST DOLOG3 ;NO
MOVE T2,[POINT 7,[ASCIZ/
Backup: /]]
CALL LOGSTR
MOVE T1,P1
MOVE T2,MABJFN
MOVX T3,1B2+1B5+1B8+1B11+1B14+JS%PAF
JFNS%
MOVE P1,T1
DOLOG3: MOVE T2,[POINT 7,[ASCIZ/
Why: /]]
CALL LOGSTR
MOVE T2,[POINT 7,WHYTXT]
CALL LOGSTR
MOVE T2,[POINT 7,CRLF]
CALL LOGSTR
SETZ T2,
IDPB T2,P1
CALL ALULOG ;APPEND TO LOG FILE
RET ;RETURN
;ROUTINE TO DO A "ADD" LOG ENTRY
ADDLOG: CALL STLOG ;START OFF THE LOG ENTRY
MOVE T2,[POINT 7,[ASCIZ/
Added /]]
CALL LOGSTR
MOVE T1,P1
CALL TACKLB ;LIB:
MOVE T2,OJFN
MOVX T3,1B8+1B11+JS%PAF
JFNS% ;FILE.EXT
MOVE P1,T1
MOVE T2,[POINT 7,[ASCIZ/
New file: /]]
CALL LOGSTR
MOVE T1,P1
MOVE T2,OJFN
MOVX T3,1B2+1B5+1B8+1B11+1B14+JS%PAF
JFNS%
MOVE P1,T1
MOVE T2,[POINT 7,[ASCIZ/
Copied from: /]]
CALL LOGSTR
MOVE T1,P1
MOVE T2,IJFN
MOVX T3,1B2+1B5+1B8+1B11+1B14+JS%PAF
JFNS%
MOVE P1,T1
MOVE T2,[POINT 7,[ASCIZ/
Why: /]]
CALL LOGSTR
MOVE T2,[POINT 7,WHYTXT]
CALL LOGSTR
MOVE T2,[POINT 7,CRLF]
CALL LOGSTR
SETZ T2,
IDPB T2,P1
CALL ALULOG ;APPEND LOG ENTRY
RET ;RETURN
;WRITE A DELETE LOG ENTRY
LOGDEL: CALL STLOG ;START OFF THE LOG ENTRY
MOVE T2,[POINT 7,[ASCIZ/
Deleted /]]
CALL LOGSTR
MOVE T1,P1
CALL TACKLB ;LIB:
MOVE T2,GTFJFN
MOVX T3,1B8+1B11+JS%PAF
JFNS% ;FILE.EXT
MOVE P1,T1
MOVE T2,[POINT 7,[ASCIZ/
File deleted: /]]
CALL LOGSTR
MOVE T1,P1
MOVE T2,GTFJFN
MOVX T3,1B2+1B5+1B8+1B11+1B14+JS%PAF
JFNS% ;WHOLE FILESPEC
MOVE P1,T1
MOVE T2,[POINT 7,[ASCIZ/
Why: /]]
CALL LOGSTR
MOVE T2,[POINT 7,WHYTXT]
CALL LOGSTR
MOVE T2,[POINT 7,CRLF]
CALL LOGSTR
SETZ T2, ;NULL TO END ENTRY
IDPB T2,P1
CALL ALULOG ;APPEND LOG ENTRY
RET ;RETURN
;ROUTINE TO START OFF THE LOG ENTRY
;PUTS OUT ALU VERSION NUMBER AND UID
STLOG: MOVE P1,[POINT 7,LOGBUF]
MOVE T2,[POINT 7,[ASCIZ/**********
/]]
CALL LOGSTR
MOVE T2,[POINT 7,AVERST] ;Get ALU version number string
CALL LOGSTR
MOVE T2,[POINT 7,[ASCIZ/ UID: /]]
CALL LOGSTR ;GET READY FOR UID TEXT
MOVE T2,NEWUID
MOVEI T3,^D10 ;DECIMAL
MOVE T1,P1
NOUT%
ERCAL IMPERR
MOVE P1,T1
MOVEI T2,.CHTAB
IDPB T2,P1
CALL DTLOG ;DATE/TIME IN LOG
MOVEI T2,.CHTAB ;ANOTHER TAB
IDPB T2,P1 ;TO SEPARATE DATE FROM NAME
MOVE T2,[POINT 7,USRNAM] ;GET USER NAME
CALL LOGSTR ;APPEND STRING TO LOG ENTRY
MOVE T2,[POINT 7,CRLF]
CALL LOGSTR
RET
;ROUTINE TO PUT DATE/TIME IN LOG
DTLOG: MOVE T1,P1
SETO T2, ;CURRENT DATE/TIME
SETZ T3, ;STANDARD FORMAT
ODTIM%
ERCAL IMPERR
MOVE P1,T1 ;GET UPDATED BP
RET
;ROUTINE LOGSTR APPEND STRING IN T2 TO P1
LOGSTR: ILDB T1,T2
JUMPE T1,RTN
IDPB T1,P1
JRST LOGSTR
;ROUTINE TO CHECK FOR QUOTA EXCEEDED ERROR
;RETURNS .+1 IF LAST ERROR WAS QUOTA EXCEEDED, AFTER HE FIXES THE PROBLEM
;RETURNS .+2 IF IT WASN'T
CHKQTE: CALL GLERR ;GET LAST ERROR CODE
CAMN T1,IOX11 ;WAS IT QUOTA EXCEEDED?
JRST CHKQT1 ;YES
RETSKP
CHKQT1: TMSG <? No room or quota exceeded
(Type "CONTINUE" after the problem has been fixed)
>
HALTF%
RET ;RETURN WHEN CONTINUE
; ROUTINES TO RELEASE JFNS
RLMAB: MOVE T1,MABJFN
RLJFN%
ERJMP RLMABE ;CAN'T
RET
RLMABE: HRROI T1,[ASCIZ/% Can't release MAB JFN: /]
JRST RLERR ;GO SAY WHY
RLIJFN: MOVE T1,IJFN
RLJFN%
ERJMP RLIJFE
RET
RLIJFE: HRROI T1,[ASCIZ/% Can't release IJFN: /]
JRST RLERR
RLOJFN: MOVE T1,OJFN
RLJFN%
ERJMP RLOJFE
RET
RLOJFE: HRROI T1,[ASCIZ/% Can't release OJFN: /]
JRST RLERR
RLERR: PSOUT% ;FIRST PART OF MESSAGE
CALL LSTFER ;TYPE WHY
TYPE CRLF
RET ;RETURN OK
SUBTTL ALUUID - ALLOCATE AND RETURN A UID
ALUUID: MOVE T1,[POINT 7,UIDNAM] ;Find out UID name
MOVE T2,LIBNUM ;Which library are we using?
HRRZ T2,LB2LST(T2)
HRLI T2,(POINT 7,)
CALL CPYNUL
MOVE T2,[POINT 7,[ASCIZ/UID.TXT/]]
CALL CPYNUL
MOVX T1,GJ%OLD+GJ%SHT ;GET JFN FOR UID.TXT
HRROI T2,UIDNAM
GTJFN%
IFJER.
; CREATE UID.TXT SINCE IT DOESN'T EXIST
MOVX T1,GJ%NEW+GJ%SHT
HRROI T2,UIDNAM
GTJFN%
ERJMP UIDE2 ;CAN'T GET JFN TO CREATE
ENDIF.
; NOW OPEN UID.TXT AND GENERATE NEW UID.
MOVEM 1,UIDJFN ;SAVE JFN FOR UID.TXT
MOVE T2,[<^D7>B5+OF%RD+OF%WR] ;OPEN THE FILE
OPENF%
ERJMP UIDE3 ;CAN'T OPEN IT
SKIPE PBFPNO ;ALREADY HAVE A PAGE FOR UIDS?
JRST AUID.2 ;YES
MOVEI P1,1 ;NO, GET ONE NOW
CALL FINFRE
MOVEM T1,PBFPNO ;SAVE VALUE
AUID.2: HRLZ T1,UIDJFN ;MAP IN THE UID COUNTER PAGE
HRRZ T2,PBFPNO
HRLI T2,.FHSLF
MOVX T3,PM%RD+PM%WR
PMAP%
;GENERATE NEW UID
MOVE T1,PBFPNO ;GENERATE NEW UID
LSH T1,^D9
SKIPN T2,(T1) ;ANYTHING THERE?
JRST AUID.3 ;NO, MUST BE A BRAND NEW FILE
HRLI T1,(POINT 7,)
MOVEI T3,^D10 ;READ DECIMAL NUMBER
NIN%
ERJMP BADUID ;?NIN FAILED
;THE OLD UID IS NOW IN AC2
AUID.3: AOJ T2, ;INCREMENT IT TO MAKE A NEW UID
MOVEM T2,NEWUID ;AND SAVE THE NEW UID
SETZ T4, ;COUNT # CHARS
DO.
IDIVI T2,^D10
SKIPE T2
AOJA T4,TOP.
ENDDO.
ADDI T4,3 ;+ LAST DIGIT + CRLF
MOVE T1,PBFPNO ;WRITE NEW UID INTO THE FILE
LSH T1,^D9
HRLI T1,(POINT 7,) ;GET DESTINATION DESIGNATOR
MOVE T2,NEWUID
MOVEI T3,^D10
NOUT%
ERCAL IMPERR ;?NOTHING CAN HAPPEN!
;APPEND CRLF TO NUMBER TO MAKE USER EDITING EASIER
MOVEI T2,.CHCRT
IDPB T2,T1
MOVEI T2,.CHLFD
IDPB T2,T1
CALL UNMAPA ;UNMAP THE FILE
;SET FILE POINTER SO OTHERS CAN EDIT IT
MOVE T2,T4 ;BYTE COUNT
HRRZ T1,UIDJFN
SFPTR% ;SET FILE PTR
ERJMP SFPER1 ;?FAILED - GO COMPLAIN
HRLI T1,.FBSIZ ;SET EOF PTR IN FILE
MOVE T3,T2 ;THE NEW VALUE IN T3
SETO T2, ;"CHANGE ALL BITS"
CHFDB%
ERCAL IMPERR
HRLI T1,.FBBYV ;Change byte size word.
MOVEI T2,^D7 ;Set byte size to 7
DPB T2,[POINTR T3,FB%BSZ]
MOVX T2,FB%BSZ ;Change byte size bits
CHFDB%
ERCAL IMPERR
AUID.C: MOVE T1,UIDJFN ;CLOSE THE FILE UID.TXT
CLOSF%
ERJMP UIDE4 ;CAN'T
RET ;DONE, RETURN
SUBTTL ERRORS IN ALUUID ROUTINE
;CAN'T GTJFN TO WRITE NEW UID.TXT
UIDE2: TMSG <?ALUUID - GTJFN failed for output file UID.TXT: >
CALL LSTFER
HALTF%
JRST ALUUID ;TRY AGAIN IF "CONTINUE"
;CAN'T OPENF UID.TXT
UIDE3: TMSG <?ALUUID - OPENF failed for UID.TXT: >
CALL LSTFER
MOVE T1,UIDJFN
RLJFN% ;RELEASE THE JFN
ERJMP .+1
HALTF%
JRST ALUUID ;;TRY AGAIN IF "CONTINUE"
;BAD FORMAT FOR UID
BADUID: TMSG <?ALUUID - UID must be a decimal number, got: >
MOVE T1,PBFPNO ;WHERE THE TEXT LIVES
LSH T1,^D9
HRLI T1,(POINT 7,)
PSOUT% ;TYPE WHAT WAS THERE (GARBAGE!)
CALL UNMAPA ;UNMAP THE FILE
MOVE T1,UIDJFN ;CLOSE THE FILE
CLOSF%
ERJMP UIDE4 ;DIE IF CAN'T
TYPE <[ASCIZ/
[Please fix /]>
TYPE UIDNAM
TYPE <[ASCIZ/ and type "CONTINUE"]
/]>
HALTF% ;TO TOPS20
JRST ALUUID ;TRY AGAIN
UNMAPA: MOVX T1,-1
HRRZ T2,PBFPNO ;PAGE WHERE THE UID IS KEPT
HRLI T2,.FHSLF
MOVX T3,0
PMAP%
RET ;DONE, RETURN
;CAN'T CLOSE UID.TXT
UIDE4: TMSG <?ALUUID - CLOSF failed for UID.TXT: >
CALL LSTFER
HALTF%
JRST AUID.C ;TRY CLOSF AGAIN IF CONTINUE
SUBTTL ALULOG - WRITE AN ENTRY IN THE ALU FILE UPDATE HISTORY LOG FILE
; THE TEXT OF THE ENTRY WILL BE IN "LOGBUF". IT WILL BE APPENDED TO THE
;FILE FILUPD.HST.
ALULOG:
;FIRST, IF FILUPD.HST DOESN'T EXIST, CREATE ONE.
MOVE T1,[POINT 7,LOGNAM]
MOVE T2,LIBNUM ;Which library?
HRRZ T2,LB2LST(T2) ;Get place where it is
HRLI T2,(POINT 7,)
CALL CPYNUL
MOVE T2,[POINT 7,[ASCIZ/FILUPD.HST/]]
CALL CPYNUL
MOVX T1,GJ%OLD+GJ%SHT
HRROI T2,LOGNAM
GTJFN%
SKIPA ;FILE DOESN'T EXIST, CREATE IT
JRST ALG.1 ;FILE EXISTS, GO PROCESS IT.
;CREATE EMPTY FILUPD.HST
ALULG0: MOVX T1,GJ%NEW+GJ%SHT
HRROI T2,LOGNAM
GTJFN%
ERJMP ALOGE1 ;CAN'T GET JFN
ALG.1: MOVEM T1,LOGJFN ;SAVE JFN FOR THE LOG FILE
SETZ T4, ;NOTE FIRST OPENF% ATTEMPT
ALG2: MOVE T2,[7B5+OF%APP] ;OPEN FILE FOR APPENDING
OPENF%
ERJMP ALOGE2 ;CAN'T OPEN FOR APPEND
IFG. T4
TYPE <[ASCIZ/ OK]
/]>
ENDIF.
;NOW APPEND THE ENTRY
MOVE T1,LOGJFN ;WRITE THE LOG ENTRY TO THE FILE
HRROI T2,LOGBUF
MOVEI T3,0
MOVEI T4,0
SOUT%
;NOW CLOSE THE LOG FILE.
ALULGC: MOVE T1,LOGJFN
CLOSF%
ERJMP ALOGE3 ;CLOSF FAILED
RET ;DONE, RETURN
ALOGE1: TMSG <?GTJFN failed for new FILUPD.HST: >
CALL LSTFER
HALTF%
JRST ALULG0
ALOGE2: CALL GLERR ;GET LAST ERROR CODE
CAIN T1,OPNX9 ;BUSY?
JRST [ JUMPG T4,ALOG21 ;JUMP IF MSG ALREADY TYPED
TYPE <[ASCIZ/[File FILUPD.HST busy, waiting.../]>
ALOG21: MOVEI T1,^D1000
DISMS%
AOJA T4,ALG2] ;TRY AGAIN
TMSG <?OPENF% failed for FILUPD.HST: >
CALL LSTFER
HALTF%
JRST ALULG0
ALOGE3: TMSG <?CLOSF failed for FILUPD.HST: >
CALL LSTFER
HALTF%
JRST ALULGC ;GO TRY AGAIN IF "CONTINUE"
SUBTTL CHECK FOR REGISTERED USER
;CALL: CALL RGUSR
; <RETURN HERE IF NO>
; <HERE IF YES, INTERNAL USER # IN INTUNM>
;Checks your logged-in user number against internal list.
; If SWANYU is on (any user allowed), this routine always skips
;but does not set INTUNM.
RGUSR: CALL RGUCHK ;CHECK
JRST NOTRU ;?NOT A REGISTERED USER
JRST RSKP ;A REGISTERED USER, RETURN
NOTRU: TMSG <? You are not a registered user.
>
RET
;HERE IS ROUTINE TO SILENTLY CHECK FOR REGISTERED USER, AND IF SO
; PUTS USER NUMBER IN "INTUNM" AND SKIPS
RGUCHK: SETO T1, ;-1 FOR CURRENT JOB
MOVE T2,[-1,,P1] ;GET USER NUMBER IN P1
MOVEI T3,.JIUNO
GETJI% ;GET IT
ERJMP RGUSE1 ;? FAILED
;LOOK AT ALL REGISTERED USERS AND SEE IF WE ARE ONE OF THEM
MOVSI T4,-NMUSRS
RGUSR1: HRRO T2,USRLST(T4) ;GET PTR TO REGISTERED USER'S NAME
MOVX T1,RC%EMO ;EXACT MATCH ONLY
RCUSR% ;TRANSLATE
ERJMP RGUSRE ;ERROR - GO SEE WHY
TXNE T1,RC%NOM ;NO MATCH?
JRST RGUSR2 ;RIGHT, GO ON TO NEXT
CAMN T3,P1 ;MATCH?
JRST RGUSR3 ;YES - WE ARE A REGISTERED USER
RGUSR2: AOBJN T4,RGUSR1 ;LOOP THRU LIST
SKIPN SWANYU ;ANY USER ALLOWED?
RET ;NO
SETZM USRBIT ;UNKNOWN USER HAS NO PRIVS
JRST RGUSR4 ;CONTINUE
RGUSR3: HLLZ T3,USRLST(T4) ;KNOWN USER, GET FLAGS
MOVEM T3,USRBIT ;SAVE
RGUSR4: GJINF% ;GET LOGIN USER NUM
MOVE T2,T1
HRROI T1,USRNAM
DIRST% ;SAVE USER NAME STRING
JSHLT
AOS (P) ;AND SKIP RETURN
RET
RGUSE1: TMSG <?Can't get user number: >
CALL LSTFER
HALTF%
JRST RGUCHK ;TRY AGAIN IF CONTINUE
;HERE IF RCUSR FAILS TRYING TO TRANSLATE A USER NAME IN OUR LIST
RGUSRE: CALL GLERR ;GET LAST ERROR CODE
CAIE T1,STRX08 ;INVALID USER NAME?
CALL IMPERR ;NO, IMPOSSIBLE ERROR
TMSG <%Invalid user name in table: >
TYPE <(T4)> ;TYPE IT
JRST RGUSR2 ;GO ON TO NEXT
SUBTTL SETPMP - SETUP PAGE MAP
SETPMP: MOVE P2,[POINT 1,PAGMAP]
SETZ T4, ;START WITH PAGE 0
;Set aside some pages for ALU itself
MOVEI T3,LASTLC ;GET LAST USED LOC
LSH T3,-^D9 ;GET ITS PAGE NUMBER
SETO T1, ;MARK THEM ALL AS NOT FREE
SETPM0: IDPB T1,P2
SOSL T3 ;STOP WHEN ALL THOSE PAGES MARKED
AOJA T4,SETPM0
ADDI T4,1 ;NOW START LOOKING AT NEXT PAGE
SETPM1: HRLI T1,.FHSLF
HRR T1,T4
RPACS%
TXNN T2,PA%PEX ;DOES THIS PAGE EXIST?
TDZA T1,T1 ;NO, MARK AS FREE
SETO T1, ;YES, MARK AS NOT FREE
IDPB T1,P2
ADDI T4,1 ;GO ON TO NEXT PAGE
CAIG T4,765 ;SAVE SOME SPACE FOR DDT
JRST SETPM1
SETO T1, ;MARK REST OF PAGES AS NOT FREE
SETPM2: IDPB T1,P2
ADDI T4,1
CAIG T4,777
JRST SETPM2
RET
SUBTTL FINFRE - FIND A CLUMP OF FREE PAGES WE CAN USE
;CALL: MOVEI P1, # OF CONTIGUOUS PAGES WE WANT
; CALL FINFRE
; <RETURNS T1= NUMBER OF THE FIRST ONE>
FINFRE: SETZ T4, ;START AT PAGE 0
MOVE P2,[POINT 1,PAGMAP] ;POINTER TO PAGE MAP
FINFR0:
DO.
ILDB T2,P2 ;LOOK FOR A FREE ONE
JUMPE T2,ENDLP.
AOJA T4,TOP.
ENDDO.
CAILE T4,777 ;DID WE FIND ANY?
JRST NOROOM ;NO - USED THEM ALL!
HRRZ T1,T4 ;ASSUME THIS IS IT
HRRZ T3,P1 ;COUNTDOWN
MOVEM P2,SAVEPB ;SAVE PAGE TABLE BYTE PTR
ADDI T4,1 ;ACCOUNT FOR PAGE WE FOUND
FINFR1: SOJLE T3,GOTEM ;GOT 'EM... MARK AS TAKEN
ILDB T2,P2 ;LOOK SOME MORE
ADDI T4,1 ;ON NEXT PAGE NOW
CAILE T4,777
JRST NOROOM
JUMPE T2,FINFR1 ;STILL OK.. KEEP GOING
;This clump won't do.. try again
JRST FINFR0
GOTEM: MOVE P2,SAVEPB ;GET BYTE PTR AT START OF CLUMP
SETO T2, ;SET FLAG TO -1
DPB T2,P2 ;MARK THAT PAGE
MOVE T3,P1
DO.
SOJLE T3,RTN ;RETURN WHEN MARKED THEM ALL
IDPB T2,P2
LOOP.
ENDDO.
NOROOM: TMSG <? FINFRE: NOT ENOUGH FREE PAGES
>
HALTF%
JRST FINFRE
SUBTTL CLRPMP - CLEAR PAGE MAP & RETURN PAGES
;CLEAR PAGE MAP
;CALL: P1/ # PAGES TO CLEAR
; T1/ STARTING PAGE
CLRPMP: MOVE P2,[POINT 1,PAGMAP]
SETZ T2, ;"CLEAR" BIT
DO.
SOJL T1,ENDLP. ;GET TO THAT PAGE
IBP P2
LOOP.
ENDDO.
DO.
IDPB T2,P2
SOJG P1,TOP.
ENDDO.
RET
;** DEBUG **
LISTFR: TMSG <Used pages:
>
MOVE P2,[POINT 1,PAGMAP]
SETZ T4, ;START AT PAGE 0
LISTF0: ILDB T2,P2
JUMPN T2,LISTF1 ;TELL HIM NON-EMPTY
LISTF2: ADDI T4,1
CAILE T4,1000
RET
JRST LISTF0
LISTF1: MOVEI T1,.PRIOU
HRRZ T2,T4 ;PAGE NUMBER
MOVEI T3,8
NOUT%
ERJMP .+1
TMSG <,>
JRST LISTF2
SUBTTL CHECK OUT DEFAULT LIBRARY
WDFLIB: SKIPN DFLIBW ;SKIP IF THERE IS A DEFAULT LIBRARY
RET ;NO, NOTHING TO CHECK
;IT MUST BE ONE OF THE KNOWN LIBRARIES
MOVSI T4,-NMLIBS ;-# LIBS
WDFL1: HRRZ T1,LB1LST(T4) ;Get ptr to ASCIZ/LIB:/
HRLI T1,(POINT 7,)
PUSH P,DFLIBW
POP P,TEMPBP ;Save temp bp (to default lib)
WDFL2: ILDB T2,T1 ;Get char
ILDB T3,TEMPBP ;Get char
JUMPE T3,WDFDON ;Jump if done with default lib
CAIN T2,(T3) ;Ok so far?
JRST WDFL2 ;Yes, keep matching
;NO MATCH
WDFNOM: AOBJN T4,WDFL1 ;Loop for all libs
TYPE <[ASCIZ \?DFLIB (the default library defined in ALUPRM.MAC)
is not a known library .. please fix ALUPRM.MAC and rebuild ALU
Hint: If V6: is your default library, DEFINE DFLIB,< ASCIZ /V6/ >
\]>
HALTF%
JRST .-1
;END OF THIS LIB
WDFDON: CAIE T2,":" ;Better be at ":" in this library name
JRST WDFNOM ;No, no match
;MATCH, STORE INDEX AWAY.
HRRZM T4,DLBIDX ;Save index for default library
RET ;Return
SUBTTL GET ALU VERSION NUMBER STRING
;Called once-only when ALU is built to initialize AVERST.
SETAVR: MOVE T1,[POINT 7,AVERST] ;T1 = output BP
MOVE T2,[POINT 7,[ASCIZ/ALU %/]]
CALL CPYNUL
LDB T2,[POINT 6,ALUVER,11] ;Major version #
MOVEI T3,^D8 ;Output in octal
NOUT%
ERCAL IMPERR ;?Nothing should happen!
LDB T2,[POINT 6,ALUVER,17] ;Minor version #
JUMPE T2,SETAV1 ;Don't output anything if 0
SUBI T2,1 ;^D26="Z", ^D27="AA"
IDIVI T2,^D26 ;Get two letters
JUMPE T2,SETAV0 ;Don't output 1st letter if null
MOVEI T2,100(T2)
IDPB T2,T1 ;Output it
SETAV0: MOVEI T2,101(T3) ;Get 2nd letter
IDPB T2,T1 ;Output it
SETAV1: HRRZ T2,ALUVER ;Get edit level
JUMPE T2,SETAV2 ;Don't output if zero
MOVEI T3,"("
IDPB T3,T1
MOVEI T3,^D8 ;Octal edit number
NOUT%
ERCAL IMPERR
MOVEI T3,")"
IDPB T3,T1
SETAV2: LDB T2,[POINT 3,ALUVER,2] ;Get "who" field
JUMPE T2,SETAV3 ;Don't output if zero
MOVEI T3,"-"
IDPB T3,T1 ;Mark it
MOVEI T3,^D8
NOUT%
ERCAL IMPERR
SETZ T2, ;End with null
SETAV3: IDPB T2,T1 ;Output null to end
RET ;Done, return
SUBTTL SETUP FILCOM STRING
;SETUP STRING TO SEND TO FILCOM
;CALLED AT END OF REPLACE COMMAND, WHILE ALL JFNS ARE STILL ASSIGNED.
; THE MAC FILE IS OJFN
; THE MAB FILE IS MABJFN
; THE LIBRARY NUMBER IS IN LIBNUM
; THE UID NUMBER IS IN NEWUID
;THE FILCOM STRING IS:
; ALU:UID=LIB:MABNAM,LIB:MACNAM
FCSTR: MOVE T1,[POINT 7,FCTXT]
MOVE T2,[POINT 7,[ASCIZ/ALU:/]] ;Only choice
CALL CPYNUL ;COPY to NUL
MOVE T2,NEWUID ;GET UID NUMBER
MOVEI T3,^D10
NOUT%
ERCAL IMPERR
MOVEI T2,"="
IDPB T2,T1
CALL TACKLB ;LIB:
MOVE T2,MABJFN ;JFN IN T2
MOVX T3,1B8+1B11+JS%PAF
JFNS%
ERCAL IMPERR
MOVEI T2,","
IDPB T2,T1
CALL TACKLB ;LIB:
MOVE T2,OJFN
MOVX T3,1B8+1B11+JS%PAF
JFNS%
ERCAL IMPERR
MOVEI T2,0
IDPB T2,T1
RET ;RETURN
TACKLB: MOVE T2,LIBNUM ;GET LIBRARY NUMBER
HRRZ T2,LB1LST(T2)
HRLI T2,(POINT 7,)
DO.
ILDB T3,T2
JUMPE T3,ENDLP.
IDPB T3,T1
LOOP.
ENDDO.
RET
SUBTTL MISC ROUTINES
;COPY STRING TO NULL
; T1/ DESTINATION PTR
; T2/ SOURCE PTR
CPYNUL: ILDB T3,T2 ;GET SOURCE BYTE
IDPB T3,T1 ;STORE IN DEST
JUMPN T3,CPYNUL
DBP. T1 ;BACKUP DEST OVER NUL
RET
;SAVE AS ABOVE BUT SOURCE IN T3, DEST IN P1
CPT3P1: ILDB T2,T3
IDPB T2,P1
JUMPN T2,CPT3P1
DBP. P1 ;BACKUP DEST OVER NUL
RET
;AND AGAIN, BUT SOURCE IN T2, DEST IN T3
CPT2T3: ILDB T1,T2
IDPB T1,T3
JUMPN T1,CPT2T3
DBP. T3 ;BACKUP DEST OVER NUL
RET
;Routine to set generation-retention-count of a file.
;Call:
; T1/ JFN of output file (another JFN will be RENAMEd to this).
; CALL SETGRC
; <here if error, warning message typed>
; <here if done>
;This must be done prior to a RENAME.
;
; If the routine returns .+1, the program should COPY the file
;instead of RENAME'ing it.
SETGRC: MOVEM T1,GRCJFN ;Save this a sec..
MOVE T2,T1 ;Get JFN in T2
MOVX T1,RC%EMO ;No recognition
RCDIR% ;Get 36-bit directory number
ERJMP STGRE1 ;?Failed
MOVE T1,T3 ;Get directory number
MOVEI T2,CD.LEN ;get length of CRDIR block
MOVEM T2,GRCDBL+.CDLEN ;Store in length word of block
MOVEI T2,GRCDBL ;Point to directory block
GTDIR% ;Get directory parameters
ERJMP STGRE2 ;?failed
MOVE T4,GRCDBL+.CDRET ;Get generation-retention-count
HRRZ T1,GRCJFN ;RH= JFN
HRLI T1,.FBBYV
DPB T4,[POINTR T3,FB%RET] ;Put retention-count we want in there
MOVX T2,FB%RET ;Only change these bits
CHFDB% ;** Change FDB of the output file **
ERJMP STGRE3 ;?can't
JRST RSKP ;OK, return success
;** ERRORS in SETGRC routine **
;Can't get directory number from the JFN
STGRE1: TYPE CNTSRC ;Give warning
CALL TCGFIL
TMSG <RCDIR failed: >
JRST STGREE
;Can't get directory parameters from the dir #
STGRE2: TYPE CNTSRC
CALL TCGFIL
TMSG <GTDIR failed: >
JRST STGREE
;Can't set generation-retention-count in the FDB
STGRE3: TYPE CNTSRC
CALL TCGFIL
TMSG <CHFDB failed: >
; JRST STGREE
STGREE: CALL LSTFER
TMSG <
; file will be copied instead of RENAME'd
>
RET ;Return .+1 to copy
CNTSRC: TEXT <%Can't set generation-retention-count for >
;Routine to type file name of GRCJFN
TCGFIL: MOVEI T1,.PRIOU
MOVE T2,GRCJFN
SETZ T3,
JFNS%
TMSG <
% >
RET
SUBTTL REDIT ROUTINES
;Routine to call REDIT
;Called when file is about to get REPLACED with COPY or RENAME.
;Input:
; IJFN/ new source file
; GTFJFN/ file to replace (on the library)
; NEWUID/ UID number to use
;Call:
; CALL CALRDT
; <return here always>
CALRDT: CALL IREDIT ;Initialize REDIT
JRST CALRD1 ;?Failed, type warning
CALL SREDIT ;Setup REDIT string
CALLRET DREDIT ;Do REDIT and return when done
;Error initializing REDIT
CALRD1: TMSG <% REDIT not called
> ;Clarify the situation
RET ;Return
;Routine to initialize REDIT in a lower fork.
;Call:
; CALL IREDIT
; <here if error, message typed>
; <here if ok>
IREDIT: SKIPE RDTFRK ;Do we have a fork handle already?
JRST IRDT1 ;Yes
;Create a fork for REDIT
MOVX T1,CR%CAP ;Create fork
CFORK%
ERJMP CFFAI ;?Failed
MOVEM T1,RDTFRK ;Save it's fork handle
IRDT1: SKIPE RDTINC ;Is REDIT in core already?
JRST RSKP ;Yes, initialization done
;Do GTJFN and GET to read it into core
MOVX T1,GJ%OLD
HRROI T2,[ASCIZ/SYS:REDIT.EXE/]
GTJFN%
ERJMP RDTJFL ;GTJFN failed
HRRZ T1,T1 ;RH= JFN
PUSH P,T1 ;Save JFN
HRL T1,RDTFRK ;LH= fork handle
GET% ;Read in a copy of REDIT
ERJMP RDTGFL ;?GET failed
SETOM RDTINC ;Got it, set flag
POP P,(P) ;Throw away JFN info, don't need it.
JRST RSKP ;And return success
;CREATE-A-FORK failed.
CFFAI: TMSG <?CFORK failed: >
CALLRET LSTFRC ;Type why and give single return
;GTJFN failed for SYS:REDIT.EXE
RDTJFL: TMSG <?Can't GTJFN SYS:REDIT.EXE: >
CALLRET LSTFRC ;Type why and give single return
;GET failed
RDTGFL: TMSG <?Can't GET SYS:REDIT.EXE: >
CALL LSTFRC ;Type why and CRLF
POP P,T1 ;Release JFN
RLJFN%
ERJMP .+1 ;Error, don't worry.
RET ;Return .+1
;Routine to setup REDIT string
;Called when file is about to get REPLACED with COPY or RENAME.
;Input:
; IJFN/ new source file
; GTFJFN/ file to replace (on the library)
; NEWUID/ UID number to use
;Call:
; CALL SREDIT
; <return here always>
;Output:
; RDTTXT/ ASCIZ string to be sent to REDIT
; ADVTXT/ ASCIZ string to advise user what is happening
SREDIT: STKVAR <RPTR>
MOVE T1,[POINT 7,ADVTXT] ;INIT ADVISORY TEXT
MOVEM T1,ADVPTR
MOVE T1,[POINT 7,RDTTXT] ;Point to text area
MOVE T2,[POINT 7,[ASCIZ/REDIT COMPARE (NEW SOURCE FILE) /]]
CALL CPYNUL
MOVEM T1,RPTR ;SAVE START OF FILESPEC
MOVE T2,IJFN ;New source file
MOVX T3,1B2+1B5+1B8+1B11+1B14+JS%PAF ;DEV:<DIRECTORY>FILE.EXT
JFNS%
MOVE T2,RPTR
HRROI T3,[ASCIZ /[Compare: /]
CALL APPAVT ;BUILD ADVISORY TEXT
MOVE T2,[POINT 7,[ASCIZ/ (WITH FILE) /]]
CALL CPYNUL
MOVEM T1,RPTR
MOVE T2,GTFJFN ;File to replace
MOVX T3,1B2+1B5+1B8+1B11+1B14+JS%PAF
JFNS%
MOVE T2,RPTR
HRROI T3,[ASCIZ /
With: /]
CALL APPAVT
MOVE T2,[POINT 7,[ASCIZ/ (CHANGES TO) /]]
CALL CPYNUL
MOVEM T1,RPTR
MOVE T2,LIBNUM
HRRZ T2,LB2LST(T2) ;Get directory to make the .DIF file in
HRLI T2,(POINT 7,)
CALL CPYNUL
MOVE T2,GTFJFN
MOVX T3,1B8 ;Replaced file name only
JFNS%
MOVEI T2,"-" ;DASH
IDPB T2,T1
MOVE T2,NEWUID ;Put UID in filename string
MOVX T3,^D10 ;Decimal
NOUT%
ERJMPS .+1 ;No error should happen
MOVE T2,[POINT 7,[ASCIZ/.RED/]]
CALL CPYNUL
MOVE T2,RPTR
HRROI T3,[ASCIZ /
Changes to: /]
CALL APPAVT
MOVE T2,[POINT 7,[ASCIZ/
/]]
CALL CPYNUL
MOVE T2,T1 ;NO ADDITIONAL TEXT THIS TIME
HRROI T3,[ASCIZ /]
/]
CALL APPAVT ;FINISH UP ADVISORY STRING
SETZ T2, ;Null
IDPB T2,T1
RET ;Done, return
;APPAVT - APPEND TO ADVISORY TEXT
; T1/ END OF STRING #2
; T2/ BEGINNING OF STRING #2
; T3/ PTR TO ASCIZ STRING #1
APPAVT: SAVEAC <T1>
STKVAR <EPTR,BPTR>
MOVEM T2,BPTR ;SAVE SECOND STRING FOR NOW
MOVEM T1,EPTR ;SAVE END OF STRING
MOVE T1,ADVPTR ;PTR TO ADVISORY TEXT
MOVE T2,T3
HLRZ T3,T2
CAIN T3,-1 ;DEFAULT?
HRLI T2,(POINT 7,0) ;YES, FILL IN
CALL CPYNUL ;COPY IT
MOVE T2,BPTR ;NOW FOR SECOND STRING
DO.
CAMN T2,EPTR ;END OF FIRST STRING?
EXIT. ;YES
ILDB T3,T2 ;NO, GET NEXT CHAR FROM IT
IDPB T3,T1 ;APPEND TO ADVISORY TEXT
LOOP. ;DO THIS UNTIL PTRS MATCH
OD.
MOVEM T1,ADVPTR ;SAVE PTR HERE
SETZ T3,
IDPB T3,T1 ;ALWAYS APPEND A NULL
RET
;Routine to actually do the work of calling REDIT.
;Waits until REDIT is done, then returns.
;If errors happen, a warning message is typed.
;IREDIT must have successfully completed before this routine will work.
;Inputs:
; RDTTXT/ holds ASCIZ TEXT SENT TO REDIT
;Call:
; CALL DREDIT
; <return here always>
DREDIT: TYPE <[ASCIZ/[ALU: Calling REDIT]
/]>
; TYPE RDTTXT ;TYPE THE TEXT WE ARE SENDING
TYPE ADVTXT ;TYPE ADVISORY TEXT
;Set REDIT's RESCAN buffer.
MOVE T1,[POINT 7,RDTTXT] ;Get ptr to text string
RSCAN% ;Put in RESCAN buffer
ERJMP RSCFAI ;?Failed
;Start it up
MOVE T1,RDTFRK ;Get fork handle
MOVEI T2,0 ;Start at primary start address
SFRKV% ;Start it up
ERJMP SFRFAI ;?Failed
MOVE T1,RDTFRK ;Get fork handle
WFORK% ;Wait for completion
;Give warning if it didn't terminate successfully
MOVE T1,RDTFRK
RFSTS% ;Read fork status
HLRZ T2,T1 ;Get status
CAIN T2,.RFHLT ;Better be just "halt'ed"
RET ;Ok, return
;Fork status not good.
PUSH P,T1 ;Save status
TMSG <% Problem with REDIT-- FORK STATUS = >
POP P,T1
CALL TYPFSS ;Type it out symbolically
RET ;Return
;Couldn't put text in RESCAN buffer
RSCFAI: TMSG <?Error setting RESCAN buffer for REDIT: >
CALL LSTFRC
JRST RDTNTD
;Couldn't start up the fork
SFRFAI: TMSG <?Couldn't "START" REDIT: >
CALL LSTFRC
JRST RDTNTD
;Here to explain what happens if an error comes up, then
; return .+1
RDTNTD: TMSG <% REDIT not called
>
RET ;Return
SUBTTL GENERAL-PURPOSE ROUTINES
;Routine to type a fork status symbolically from T1.
;Call:
; T1/ results from RFSTS
; CALL TYPFSS
; <return here always>
;Types:
;NNNNNN,,NNNNNN<CRLF>(WHAT IT MEANS)<CRLF>
TYPFSS: PUSH P,T1 ;Save info
MOVEI T1,.PRIOU ;Output to TTY
HLRZ T2,(P) ;Get left half
MOVX T3,NO%LFL+NO%ZRO+6B17+^D8 ;000003
NOUT%
ERJMPS .+1
TMSG <,,>
MOVEI T1,.PRIOU
HRRZ T2,(P)
MOVX T3,NO%LFL+NO%ZRO+6B17+^D8
NOUT%
ERJMPS .+1
TYPE CRLF
;Now type what that means
TMSG <(>
POP P,T4 ;Get into T4
TXZN T4,RF%FRZ ;Frozen?
IFSKP.
TYPE [ASCIZ /Frozen, /]
ENDIF.
HLRZ T1,T4 ;Get status code
CAIN T1,.RFFPT ;Forced termination?
JRST STSFTR ;yes
CAILE T1,.MXSTS ;Too big?
SKIPA T1,[[ASCIZ/?? Unknown status ??/]]
MOVE T1,RFSTST(T1) ;Get address OF ASCIZ status
TYPE <(T1)> ;Type the ASCIZ
TMSG <)>
RET ;Return
;Forced termination
STSFTR: TMSG <Forced termination - >
HRRZ T1,T4 ;Why?
CAILE T1,.MXFTR
SKIPA T1,[[ASCIZ/?? Unknown software channel ??/]]
MOVE T1,FTRTBL(T1) ;Get address of ASCIZ
TYPE <(T1)>
TMSG <)>
RET ;Return
;STATUS values from RFSTS
RFSTST: [ASCIZ /Runnable/]
[ASCIZ /Dismissed for I-O/]
[ASCIZ /Halted, voluntary termination/]
[ASCIZ /Halted/] ;.RFFPT, just type the error
[ASCIZ /Dismissed waiting for another process to terminate/]
[ASCIZ /Dismissed for a specified amount of time/]
[ASCIZ /JSYS-UUO interrupt wait/] ;.RFTRP
[ASCIZ /ADBRK interrupt wait/] ;.RFABK
.MXSTS==.-RFSTST-1
;Values of software channels for forced termination
FTRTBL: [ASCIZ /Software channel 0/]
[ASCIZ /Software channel 1/]
[ASCIZ /Software channel 2/]
[ASCIZ /Software channel 3/]
[ASCIZ /Software channel 4/]
[ASCIZ /Software channel 5/]
[ASCIZ /Arithmetic overflow/]
[ASCIZ /Arithmetic floating point overflow/]
[ASCIZ /Software channel 8/]
[ASCIZ /Pushdown list overflow/]
[ASCIZ /End of file condition/]
[ASCIZ /Data error file condition/]
[ASCIZ /Disk full or quota exceeded/]
[ASCIZ /Software channel 13/]
[ASCIZ /Software channel 14/]
[ASCIZ /Illegal instruction/]
[ASCIZ /Illegal memory read/]
[ASCIZ /Illegal memory write/]
[ASCIZ /Software channel 18/]
[ASCIZ /Inferior process termination or forced freeze/]
[ASCIZ /System resources exhausted/]
[ASCIZ /Software channel 21/]
[ASCIZ /Reference to non-existant page/]
[ASCIZ /Software channel 23/]
[ASCIZ /Software channel 24/]
[ASCIZ /Software channel 25/]
[ASCIZ /Software channel 26/]
[ASCIZ /Software channel 27/]
[ASCIZ /Software channel 28/]
[ASCIZ /Software channel 29/]
[ASCIZ /Software channel 30/]
[ASCIZ /Software channel 31/]
[ASCIZ /Software channel 32/]
[ASCIZ /Software channel 33/]
[ASCIZ /Software channel 34/]
[ASCIZ /Software channel 35/]
.MXFTR==.-FTRTBL-1 ;Maximum index value
SUBTTL LOWER/UPPERCASE CONVERSION
;Used when individually parsed fields need to be converted
; to uppercase. COMND% JSYS only lets you do this with the
; whole line.
;Input:
; t1/ address of ASCIZ string
; CALL CNVUPP
; <return here always>
CNVUPP: HRLI T1,(POINT 7,) ;Make BP
CNVUP1: ILDB T2,T1 ;Get char
JUMPE T2,RTN ;Null ends string
CAIL T2,"A"+40
CAILE T2,"Z"+40
JRST CNVUP1 ;Not lowercase
SUBI T2,40 ;Convert this character to uppercase
DPB T2,T1 ;Store back
JRST CNVUP1 ;Loop until null seen
SUBTTL TABLES OF USERS, LIBRARIES, KNOWN EXTENSIONS
E.BIT==1B0 ;USER MAY DO ^E COMMANDS
DEFINE USR (A,B),<
%%BTS==0
IRPC B,<
%%BTS==%%BTS!B'.BIT
>
%%BTS+[ASCIZ \'A\]
>
USRLST: RUSERS
NMUSRS==.-USRLST
;LIBRARIES
DEFINE LIB (A,B,C),<
[ASCIZ /A/]
>
LIBLST: LIBS
NMLIBS==.-LIBLST
DEFINE LIB (A,B,C),<
[ASCIZ /B':/]
>
LB1LST: LIBS
DEFINE LIB (A,B,C),<
[ASCIZ /C/]
>
LB2LST: LIBS ;Place to put FILUPD.HST, .DIF, .SCM, UID.TXT
DEFINE EXTN(A,B,C,D,E),<
[ASCIZ /B/]
>
STEXTS: EXTS
NMEXTS==.-STEXTS
DEFINE EXTN(A,B,C,D,E),<
XWD D,[ASCIZ /A/]
>
EXTLST: EXTS
DEFINE EXTN(A,B,C,D,E),<
[ASCIZ /C/]
>
EXBLST: EXTS ;BACKUP EXTS
DEFINE EXTN(A,B,C,D,E),<
...X==0 ;# OUTPUT EXTS
IRP E,<
...X==...X+1 ;COUNT # OUTPUT EXTS
>
IFE ...X,<EXP 0> ;IF NO OUTPUT EXTS
IFN ...X,<
-<...X>,,[
IRP E,<
[ASCIZ /E/]
>;END IRP E
]
>;END IFN ...X
>;END DEFINE EXTN
EXOLST: EXTS ;GENERATED OUTPUT EXTS
SUBDIR: SUBDNS ;SUBDIRECTORY NAME STRING
;DEFINE DEFAULT LIBRARY IF GIVEN
DFLIBW:
IFNDEF DFLIB,<
EXP 0 ;NO DEFAULT LIBRARY
>
IFDEF DFLIB,<
POINT 7,[DFLIB]
>
SUBTTL STORAGE
;PRESET SECTION
CMDBLK: NEWPAR ;ADDRESS OF REPARSE ROUTINE
.PRIIN,,.PRIOU ;INPUT,,OUTPUT JFNS
-1,,[ASCIZ /ALU>/] ;CONTROL-R BUFFER
-1,,TXTBUF ;POINTER TO TEXT BUFFER
-1,,TXTBUF ;POINTER TO CURRENT POSITION
TXTLEN ;NUMBER OF CHARACTERS IN BUFFER
0 ;NUMBER OF UNPARSED CHARACTERS
-1,,ATMBUF ;POINTER TO ATOM BUFFER
TXTLEN ;NUMBER OF CHARACTERS IN BUFFER
EXP JFNBLK ;POINTER TO JFN BLOCK
;2ND COMMAND JSYS BLOCK (FOR PARSING RANDOM STRINGS)
CM2BLK: NEWPR2 ;ADDRESS OF 2ND REPARSE ROUTINE
.PRIIN,,.PRIOU ;INPUT,,OUTPUT JFNS
0 ;CONTROL-R BUFFER (FILLED IN)
-1,,TX2BUF ;POINTER TO TEXT BUFFER
-1,,TX2BUF ;POINTER TO CURRENT POSITION
TXTLEN ;NUMBER OF CHARACTERS IN BUFFER
0 ;NUMBER OF UNPARSED CHARACTERS
-1,,ATM2BF ;ATOM BUFFER
TXTLEN ;NUMBER OF CHARACTERS IN BUFFER
EXP JFNBLK ;POINTER TO JFN BLOCK
JFNBLK: GJ%OLD ;FLAGS,,GENERATION NUMBER
.PRIIN,,.PRIOU ;INPUT,,OUTPUT JFNS
BLOCK 20 ;NO DEFAULTS
;TEXTI BLOCK FOR READING LINES
TXTIBL: .RDRTY ;LAST WORD GIVEN
0 ;FLAGS
.PRIIN,,.PRIOU ;INPUT,,OUTPUT JFNS
0 ;DESTINATION PTR (FILLED IN)
0 ;BYTES AVAILABLE (FILLED IN)
0 ;USE START OF BUFFER AS ABOVE
0 ;CONTROL-R TEXT (FILLED IN)
;TEXTI BLOCK TO READ STRING INTO ATMBUF
TXTIB: .RDBRK ;LAST WORD GIVEN
0 ;FLAGS (FILLED IN)
.PRIIN,,.PRIOU ;INPUT,,OUTPUT JFNS
0 ;DESTINATION PTR (FILLED IN)
0 ;BYTES AVAILABLE (FILLED IN)
0 ;USE START OF ATMBUF AS ABOVE
0 ;NO CONTROL-R TEXT
BCHRS ;ADDRESS OF BREAK CHAR MASKS
;CHARACTER MASKS, TO MAKE ONLY CONTROL-Z A BREAK CHARACTER
BCHRS: 1B<.CHCNZ> ;CONTROL-Z ONLY
0
0
0
DLBIDX: BLOCK 1 ;Default library index
PAGMAP: BLOCK ^D512/^D36 + 1 ;BIT TABLE FOR PAGE MAP
PBFPNO: BLOCK 1 ;PAGE NUMBER OF PAGE BUFFER
AVERST: BLOCK ^D20 ;ASCIZ ALU version number
SAVEF: BLOCK 1 ;SAVED FLAGS
RSCANF: BLOCK 1 ;Number rescan chars to do
TEMPBP: BLOCK 1 ;Temp byte ptr.
;BEHAVIOR SWITCHES
SWFUID: BLOCK 1 ;1= PUT UID STRING IN REPLACED SOURCE FILE
SWCOPO: BLOCK 1 ;COPY GENERATED OUTPUT FILES
SWFCOM: BLOCK 1 ;RUN FILCOM AFTER REPLACING SOURCE FILE
SWRUID: BLOCK 1 ;REPLACE UID LINE
SWBAKF: BLOCK 1 ;MAKE BACKUP FILES
SWANYU: BLOCK 1 ;ALLOW ANY USER
SWGCPY: BLOCK 1 ;1= ASK USER IF HE WANTS A COPY OF
;FILE ANYWAY IF IT IS RESERVED AND HE DOES A "GET"
SWREDT: BLOCK 1 ;1= RUN REDIT BEFORE REPLACE
SWCGET: BLOCK 1 ;1= DEFAULT IS /COPY ON GET
SUBTTL ZEROED CORE
XLIST
LIT
LIST ;LITERALS
ZROST==. ;START OF AREA TO CLEAR ON STARTUP
MEPRIV: BLOCK 1 ;-1 IF I AM PRIVILEDGED TO DO ^E COMMANDS
PDL: BLOCK PDLSIZ
SAVEP: BLOCK 1 ;A GOOD STACK POINTER
TXTBUF: BLOCK TXTLEN/5+1 ;BUFFER FOR COMMAND JSYS
ATMBUF: BLOCK TXTLEN/5+1 ;BUFFER FOR ATOM BUFFER
TX2BUF: BLOCK TXTLEN/5+1 ;BUFFER FOR 2ND COMND JSYS
ATM2BF: BLOCK TXTLEN/5+1 ;2ND ATOM BUFFER
PR2STA: BLOCK 1 ;START ADDR OF 2ND PARSE CODE
CM2P: BLOCK 1 ;PDL AT START OF 2ND PARSE
TLINE: BLOCK TXTLEN/5+1 ;READ LINE BY "ITTLIN"
TILTXT: BLOCK TXTLEN/5+1 ;STORED ANSWER TO (TILL WHEN?) WITH ".."
PRSJFN: BLOCK 1 ;JFN OF SOMETHING WE PARSED
UIDJFN: BLOCK 1 ;JFN OF ALU:UID.TXT
UIDNAM: BLOCK FILWDS ;Whole Name of UID.TXT
SAVEPB: BLOCK 1 ;SAVED BP TO PAGMAP
NEWUID: BLOCK 1 ;VALUE RETURNED BY ALUUID
UID1: BLOCK 1 ;UID OF FILE ON MY AREA IN REPLACE
; (OR 0)
LOGJFN: BLOCK 1 ;JFN FOR FILUPD.HST
LOGNAM: BLOCK FILWDS ;Whole name of it
LOGBUF: BLOCK LOGLEN/5+1 ;BUFFER FOR OUTPUT TO LOG FILE
LIBHLD: BLOCK FILWDS ;FOR ASCIZ /<LIBARY>*.*/
RETJNM: BLOCK FILWDS ;PLACE FOR FILENAME
GTFJFN: BLOCK 1 ;JFN OF "GET" FILE
MAZJFN: BLOCK 1 ;JFN OF ".MAZ" FILE
MAZNAM: BLOCK FILWDS ;ASCII FILENAME FOR .MAZ FILE
MABJFN: BLOCK 1 ;;JFN OF ".MAB" FILE
MABJNM: BLOCK FILWDS ;ASCII NAME OF THE FILE
MAZBUF: BLOCK LINLEN/5+1 ;FIRST LINE OF MAZ FILE (S.B. THE ONLY LINE!)
.MAZLN==.-MAZBUF
RFBUF: BLOCK MAXLIN/5+1 ;FIRST LINE OF RESERVED FILE
.RFLN==.-RFBUF
LUIDTX==^D40 ;LENGTH OF UID TEXT
UIDTXT: BLOCK LUIDTX ;HOLDS BUILT UID TEXT
FSTLIN: BLOCK 1 ;ADDRESS OF 72 CHAR LINE TO CHANGE
WHYTXT: BLOCK WHYLEN/5+1 ;"WHY" TEXT
SAVNSP: BLOCK 1 ;SAVED NAM: STRING PTR
HNBUF: BLOCK ^D20 ;PLACE TO HOLD NAM: STRING
CD: BLOCK ^D20 ;MY CURRENT CONNECTED DIRECTORY <DIR>
RDIR: BLOCK ^D20 ;RESERVED DIRECTORY <DIR> FROM MAZ FILE
IJFN: BLOCK 1 ;INPUT JFN FOR COPIES
OJFN: BLOCK 1 ;OUTPUT JFN FOR COPIES
STIPGS: BLOCK 1 ;START OF PAGE BLOCK FOR IFILE
STOPGS: BLOCK 1 ;START OF PAGE BLOCK FOR OFILE
STIPG2: BLOCK 1 ;ADDRESS OF START OF IFILE BLOCK
STOPG2: BLOCK 1 ;ADDRESS OF START OF OFILE BLOCK
ENDPTR: BLOCK 1 ;ADDR OF LAST WORD OF DEST BUFFER
NXTBEG: BLOCK 1 ;PAGES WE HAVE "PRELOADED" IN FROM IJFN
BLTPTR: BLOCK 1 ;FOR MEM/MEM BLT
SAVBLT: BLOCK 1 ; SAVED BLT PTR
BCINP: BLOCK 1 ;BYTE COUNT FOR INPUT FILE
BSINP: BLOCK 1 ;BYTE SIZE FOR INPUT FILE
USRBIT: BLOCK 1 ;FLAGS FOR THIS USER
USRNAM: BLOCK 10 ;USER NAME STRING
LIBNUM: BLOCK 1 ;INTERNAL LIBRARY NUMBER
EXTNUM: BLOCK 1 ;INTERNAL EXTENSION NUMBER
HPTXTP: BLOCK 1 ;Holds help text when parsing a library
IFINAM: BLOCK TXTLEN/5+1 ;<DIR>NAME.EXT STRING FOR IJFN
RFTAD1: BLOCK 2 ;DATE/TIME INFO FOR SOURCE FILE
RFTADS: BLOCK 2 ;The main source file's RFTAD1 when copying
; generated output files.
FROMFL: BLOCK FILWDS ;COMPLETE JFNS TEXT FOR "FROM" FILE
HLDTIM: BLOCK ^D10
HLDTM1: BLOCK ^D10 ;ASCII TIME
FCTXT: BLOCK ^D20 ;FILCOM TEXT
RDTTXT: BLOCK <FILWDS*3>+^D10 ;REDIT text (usually a lot!)
ADVPTR: BLOCK 1 ;WORKING PTR TO ADVTXT
ADVTXT: BLOCK <FILWDS*3>+^D10 ;REDIT ADVISORY TEXT
MYTTY: BLOCK 1 ;MY TERMINAL NUMBER
RDTFRK: BLOCK 1 ;FORK for REDIT
RDTINC: BLOCK 1 ;-1 IF REDIT IN CORE ALREADY
CKOFLP: BLOCK 1 ;AOBJN ptr for CHKOF routine
TLCOLM: BLOCK 1 ;Actual column number on output
ILBCD: BLOCK 1 ;Column # of "DIRECTORY" header
ILBCL: BLOCK 1 ;Column # of "LOG" header
GRCJFN: BLOCK 1 ;JFN used by "SETGRC" routine
GRCDBL: BLOCK CD.LEN ;Directory block used by "SETGRC"
;CHANGE MODE SWITCHES
CNFCOM: BLOCK 1 ;FILCOM
CNCOPO: BLOCK 1 ;COPY OUTPUT FILES
CNFUID: BLOCK 1 ;UID IN SOURCE FILE
CNRUID: BLOCK 1 ;REPLACE UID
CNBAKF: BLOCK 1 ;MAKE BACKUP FILES
CNANYU: BLOCK 1 ;ANY USER ALLOWED TO USE ALU
CNGCPY: BLOCK 1 ;ASK USER IF HE WANTS A COPY ANYWAY
;WHEN FILE IS RESERVED
CNREDT: BLOCK 1 ;RUN REDIT BEFORE REPLACE DONE
CNCGET: BLOCK 1 ;/COPY IS DEFAULT ON "GET"
ZROEND==.-1 ;END OF AREA TO CLEAR ON STARTUP
LASTLC==.-1 ;LAST NON-FREE LOC
END 3,,AENTRY