Trailing-Edge
-
PDP-10 Archives
-
decuslib10-10
-
43,50522/biblio.mac
There is 1 other file named biblio.mac in the archive. Click here to see a list.
Comment/
BIBLIO is a program to create, maintain, search through, and
edit bibliographical entries.
It was written by Mike Rubin of the Wesleyan Computing Center in
June, 1979.
/
TITLE BIBLIO
TWOSEG ;MAKE BIBLIO SHARABLE
SALL ;SUPPRESS TEXT EXPANSION OF MACROS
SUBTTL DEFINITIONS
;
F=0 ;FLAG REGISTER
T1=1 ;TEMPORARY REGISTER 1
T2=2 ;TEMPORARY REGISTER 2
T3=3 ;TEMPORARY REGISTER 3
T4=4 ;TEMPORARY REGISTER 4
CT=5 ;COUNTER
BK=6 ;BLOCK OF FILE
OF=7 ;ARGUMENT FLAG REGISTER
CH=10 ;CHANNEL
C=11 ;CHARACTER
I=12 ;INSTRUCTION
A=16 ;ARGUMENT REGISTER
P=17 ;PUSHDOWN STACK
;
FLINFD==1 ;LINE-FEED FLAG
FLFAIL==2 ;LOOKUP-FAILURE FLAG
FDELIM==4 ;DELIMITER FLAG
FMATCH==10 ;CHARACTER MATCH MADE
FEOF==20 ;EOF REACHED
;
;PARAMETERS
VERNUM==2 ;VERSION NUMBER
STAKSZ==15 ;PUSHDOWN STACK SIZE
WORDS==^D80/5+1 ;SIZE OF SEARCH STRING (80 CHARS)
TTYSIZ==^D83 ;TTY BUFFER SIZE (BYTES)
MAXCHN==5 ;MAX NUMBER OF FILE CHANNELS
;
DATCHI==0 ;DATA FILE INPUT CHANNEL
DATCHO==1 ;DATA FILE OUTPUT CHANNEL
HLPI==2 ;HELP FILE INPUT CHANNEL
LPTO==3 ;LPT OUTPUT CHANNEL
EDITO==4 ;TEMP EDIT FILE OUTPUT CHANNEL
;
HT==11
LF==12
VT==13
FF==14
CR==15
CONZ==32 ;CONTROL-Z
ESC==33
SPACE==40
POINT==56
COLON==72
SUBTTL IMPURE AREA
;
LOC 137
.JBVER: BYTE (3)(9)VERNUM ;SET VERSION NUMBER
RELOC
;
PDSTK: BLOCK STAKSZ ;SUBROUTINE PUSHDOWN STACK
OBUF:
IBUF: BLOCK MAXCHN*3 ;INPUT OR OUTPUT BUFFER RING HEADERS
DFILE: BLOCK 2 ;LOOKUP BLOCK FOR DATA FILE
STRING: BLOCK WORDS ;SEARCH STRING
BLTAC: Z ;TEMP STORAGE FOR AC FOR BLT INSTRUC
OUTCHN: Z ;OUTPUT CHANNEL FOR EDIT SUBROUTINES
ENBKFF: Z ;BLOCK OF FF AT END OF ENTRY
BLOKC: Z ;BLOCK OF LAST COLON SEEN
STBKFF: Z ;BLOCK OF FF AT START OF ENTRY
STBFFF: Z ;BUFFER POSITION OF FF AT START OF ENTRY
ENBFFF: Z ;BUFFER POSITION OF FF AT END OF ENTRY
BUFRC: Z ;BUFFER POSITION OF LAST COLON SEEN
STRPTR: Z ;POINTER TO NEXT WORD OF SEARCH STRING
DISIND: Z ;COMMAND DISPATCH INDEX
RETADR: Z ;TEMP STORAGE FOR VARIABLE RET ADDRESS
TTYHDR: BLOCK 2 ;TTY BUFFER HEADER
TTYBUF: BLOCK TTYSIZ/5+1 ;TTY BUFFER (INTERNAL)
SUBTTL INITIALIZE I/O
RELOC 400000 ;START CODE IN HIGH SEGMENT
START: MOVE P,STKSET ;SET UP PUSHDOWN STACK
;
COMMENT/
Open channels for data file input, data file output, and help file
input. Set up one buffer on each of these channels.
/
;
RESET ;CLEAR ALL I/O FLAGS
SETZB T1,T2 ;MODE ASCII
TLO T2,(SIXBIT/DSK/) ;DEVICE DSK
MOVEI CH,DATCHI ;DATA FILE INPUT CHANNEL
MOVE T3,CH ;COMPUTE INDEX OF BUFFER RING HEADER
IMULI T3,3
HRRZI T3,IBUF(T3) ;ADDRESS OF INPUT BUFFER RING HEADER
PUSHJ P,OPNCHN ;OPEN CHANNEL FOR INPUT TO DATA FILE
INBUF DATCHI,1 ;SET UP 1 INPUT BUFFER FOR DATA FILE
SETZB T1,T2 ;MODE ASCII
TLO T2,(SIXBIT/DSK/) ;DEVICE DSK
MOVEI CH,DATCHO ;DATA FILE OUTPUT CHANNEL
MOVE T3,CH ;COMPUTE INDEX
IMULI T3,3
HRLZI T3,OBUF(T3) ;ADDRESS OF OUTPUT BUFFER RING HEADER
PUSHJ P,OPNCHN ;OPEN CHANNEL FOR OUTPUT TO DATA FILE
OUTBUF DATCHO,1 ;SET UP 1 OUTPUT BUFFER FOR DATA FILE
SETZB T1,T2 ;MODE ASCII
TLO T2,(SIXBIT/HLP/) ;DEVICE HLP
MOVEI CH,HLPI ;HELP FILE INPUT CHANNEL
MOVE T3,CH ;COMPUTE INDEX
IMULI T3,3
HRRZI T3,IBUF(T3) ;ADDRESS OF INPUT BUFFER RING HEADER
PUSHJ P,OPNCHN ;OPEN CHANNEL FOR INPUT FROM HELP FILE
INBUF HLPI,1 ;SET UP 1 INPUT BUFFER FOR HELP FILE
SUBTTL INPUT DATA FILE NAME
;
COMMENT/
Get a valid data file name, initialize all flags and pointers to
beginning of file, and LOOKUP the data file. If the file is not found,
set LOOKUP fails flag; if found, check first character for validity (".").
/
INPNAM: SETZB F,OF ;ZERO OUT FLAG REGISTERS
TRO F,FEOF ;FLAG THAT NO STRING GIVEN YET
MOVE T1,TTYPTR ;BYTE POINTER TO TTY BUFFER
MOVEM T1,TTYHDR ;STORE IN FIRST WORD OF TTY HEADER
MOVEI T1,TTYSIZ ;SIZE OF TTY BUFFER
MOVEM T1,TTYHDR+1 ;STORE IN SECOND WORD OF TTY HEADER
SETOM STBKFF ;FLAG THAT ON FIRST ENTRY
SETZM DFILE ;CLEAR FILE NAME
SETZM DFILE+1
MOVEI CT,6 ;INITIALIZE CHAR COUNT FOR FILE NAME
MOVE T1,FILPTR ;GET POINTER TO FILE NAME
OUTSTR[ASCIZ/
Data file name: /]
NXTNAM: INCHWL C ;GET A CHAR FROM TTY
CAIN C,POINT ;SEE IF A POINT
JRST GETEXT ;YES. GO GET THE EXTENSION
PUSHJ P,EOLDEL ;SEE IF CHAR IS AN EOL DELIM
JRST LOKDAT ;YES. GO LOOKUP FILE
PUSHJ P,ALPNUM ;IS CHAR ALPHANUMERIC?
JRST ILNAME
SOSGE CT ;DECREMENT COUNT - CONT IF NOT 6 CHRS
JRST ILNAME ;HERE IF >6 CHARS
SUBI C,40 ;MAKE CHAR SIXBIT
IDPB C,T1 ;AND DEPOSIT CHAR IN FILE NAME
JRST NXTNAM ;GO BACK FOR NEXT CHAR
GETEXT: MOVEI CT,3 ;SET UP COUNTER FOR EXTENSION
MOVE T1,EXTPTR ;GET POINTER TO FILE EXTENSION
GETEX1: INCHWL C ;AND GET A CHAR
PUSHJ P,EOLDEL ;SEE IF CHAR IS AN EOL DELIM
JRST LOKDAT ;YES. GO LOOKUP FILE
PUSHJ P,ALPNUM ;MAKE SURE ALPHANUMERIC
JRST ILNAME ;NO. ILLEGAL FILE NAME
SUBI C,40 ;MAKE CHAR SIXBIT
IDPB C,T1 ;DEPOSIT CHAR IN EXTENSION
SOJG CT,GETEX1 ;AND GO BACK FOR REST OF EXTENSION
JRST LOKDAT ;AND GO LOOKUP THE FILE
;CHECK IF CHAR IS ALPHANUMRIC. FIRST RETURN IF NO. SKIP RETURN IF YES.
ALPNUM: PUSH P,T1 ;SAVE T1
MOVE T1,C ;SAVE C
TRZ C,40 ;MAKE CHAR UC
CAIL C,"A" ;SEE IF CHAR IS ALPHA
CAILE C,"Z"
SKIPA C,T1 ;NO. RESTORE CHAR AND SKIP
JRST RESPOP ;YES. TAKE SKIP RETURN
POP P,T1 ;RESTORE T1
CAIL C,"0" ;SEE IF CHAR IS NUMERIC
CAILE C,"9"
POPJ P, ;NO. THEN ILLEGAL NAME
JRST CPOPJ1 ;YES. TAKE SKIP RETURN
RESPOP: POP P,T1 ;RESTORE T1
JRST CPOPJ1 ;AND TAKE SKIP RETURN
;CHECK IF CHAR IS EOL DELIM. NORMAL RETURN IF NO. SKIP RETURN IF YES.
EOLDEL: PUSHJ P,CHKDEL ;IS CHAR A DELIM?
JRST CPOPJ1 ;NO. TAKE SKIP RETURN
CAILE A,DELG ;IS CHAR AN EOL DELIM?
CPOPJ1: AOS (P) ;NO. TAKE SKIP RETURN
POPJ P, ;YES. TAKE NORMAL RETURN
ILNAME: OUTSTR[ASCIZ/Illegal file name
/]
CLRBFI ;CLEAR THE TTY INPUT BUFFER
JRST INPNAM ;AND GO TRY AGAIN
;
LOKDAT: CLRBFI ;EMPTY TTY INPUT BUFFER
MOVEI CH,DATCHI ;LOOKUP DATA FILE ON INPUT CHANNEL
MOVE T1,DFILE ;GET FILE NAME
HLLZ T2,DFILE+1
SETZB T3,T4 ;DEFAULT PPN, PROT, ETC. FIELDS
PUSHJ P,LOKFIL ;LOOKUP THE FILE
TROA F,FLFAIL ;TURN ON LOOKUP FAILS FLAG
PUSHJ P,CHKFOR ;CHECK FILE FORMAT IF THERE
JRST COMMND ;GO GET COMMAND
CHKFOR: PUSHJ P,CHRIN ;GET THE FIRST CHARACTER
JRST ILFORM ;ILLEGAL FORMAT IF EOF
CAIE C,POINT ;MAKE SURE FIRST CHAR IS A POINT
JRST ILFORM ;NO. ILLEGAL FORMAT
PUSHJ P,REWDAT ;REWIND THE DATA FILE
POPJ P, ;RETURN
;
;RESET THE STACK AFTER FATAL ERROR AND START AGAIN
RESSET: MOVE P,STKSET ;SET UP STACK
PUSHJ P,BRKTTY ;BREAK TTY OUTPUT
JRST COMMND ;GO GET NEXT COMMAND
SUBTTL COMMAND SCANNER
;
;GET THE INDEX OF ITEM IN TABLE <EXP>1 OF LENGTH <EXP>LG AND STORE IT IN T1.
DEFINE GETIND(EXP,ERRLBL)<
MOVSI T1,-EXP'LG ;GET LENGTH OF TABLE
CAME C,EXP'1(T1) ;LEGITIMATE MATCH?
AOBJN T1,.-1 ;NO. JUMP BACK IF MORE
SKIPL T1 ;ILLEGAL COMMAND?
JRST ERRLBL ;YES
>;END GETIND
;
COMMENT/
Read command character, and store its dispatch index in DISIND.
Read any options, and set flags occording to their indices in OF.
Read search string, if one, and store in STRING. One or more
successive delimiters are converted to a single ESCAPE character, and two
ESCAPE characters are stored at the end of the string.
/
COMMND: INCHSL C ;CLEAR CONTROL-O
JFCL
OUTSTR [ASCIZ/
Command (H for help): /]
SETZ T2, ;PUT OPTION FLAGS IN T2
COMD1: INCHWL C ;GET COMMAND
PUSHJ P,CHKDEL ;CHECK IF DELIMITER
JRST COMDA ;COME HERE IF NOT A DELIM
CAILE A,DELG ;IS IT AN EOL DELIMITER?
JRST COMD1 ;NO. IGNORE IT.
JRST ERROR ;ERROR SINCE FIRST CHAR
COMDA: TRZ C,40 ;MAKE CHARACTER UC
GETIND CMD,ERROR ;GET INDEX FOR DISPATCH
MOVEM T1,DISIND ;SAVE INDEX
COMD2: INCHWL C ;GET OPTION
PUSHJ P,CHKDEL ;GET AN ARGUMENT
JRST COMDB ;NOT A DELIMITER
CAILE A,DELG ;IS IT AN EOL DELIM?
JRST COMD2 ;NO. IGNORE IT.
JRST CHKOPT ;GO CHECK FOR NEW OPTIONS
COMDB: CAIN C,COLON ;IS IT A COLON?
JRST GETSTR ;YES. GO GET STRING
TRZ C,40 ;FORCE ARGUMENT UC
GETIND OPT,ERROR ;GET THE FLAG FOR THE OPTION
TRO T2,@OPT2(T1) ;TURN ON THE FLAG
JRST COMD2 ;AND GO GET THE NEXT ARG
;
GETSTR: TRZ F,FEOF ;TURN OFF EOF FLAG
SETOM ENBKFF ;FLAG THAT ON FIRST ENTRY
MOVE T1,BSTPTR ;SET UP POINTER TO STRING
TRNE F,FLFAIL ;SEE IF LOOKUP FAILED
JRST NOTTHR ;YES. GO GET STRING
GETST1: USETI DATCHI,1 ;POINT TO FIRST BLOCK OF FILE
MOVEI CH,DATCHI ;AND GET IT
PUSHJ P,GETBF
JRST ILFORM ;SHOULD NEVER GET HERE (EOF)
MOVEI BK,1 ;REINITIALIZE BLOCK COUNT
INCHWL C ;GET STRING CHARACTER
PUSHJ P,CHKDEL ;CHECK IF DELIMITER
JRST STORE ;STORE IT IF NOT A DELIM
CAILE A,DELG ;IS IT AN EOL DELIMITER?
JRST READ ;NO. IGNORE IT.
JRST ERROR ;ELSE, ILLEGAL COMMAND
STORE: IDPB C,T1 ;WRITE THE CHAR TO STRING
TRZ F,FDELIM ;TURN OFF DELIM FLAG
READ: INCHWL C ;GET A CHAR OF STRING
PUSHJ P,CHKDEL ;CHECK IF A DELIMITER
JRST STORE ;STORE IT IF NOT A DELIM
MOVEI C,ESC ;CHAR IS NOW AN ESCAPE
TRNN F,FDELIM ;DELIM LAST CHAR?
IDPB C,T1 ;NO. WRITE AN ESCAPE TO STING
CAILE A,DELG ;IS CHAR AN EOL DELIM?
TROA F,FDELIM ;NO. TURN ON DEL FLAG AND SKIP
CAIA ;JUST SKIP
JRST READ ;GO GET NEXT CHAR
IDPB C,T1 ;WRITE ANOTHER ESCAPE
MOVE OF,T2 ;LOAD OPTION FLAGS INTO REGISTER
SKIPN OF ;CHECK IF ANY OPTIONS GIVEN
SETO OF, ;NO. SET ALL OPTION FLAGS
JRST EOCOM ;AND DISPATCH
;
;CHECK IF DELIMITER. STORE INDEX IN A. NORMAL RETURN IF NO. SKIP
;RETURN IF YES.
CHKDEL: PUSH P,T1 ;SAVE T1
GETIND DEL,NOTDEL ;JUMP TO NOTDEL IF NOT DELIM
HRRZ A,T1 ;GET INDEX OF DELIM
POP P,T1 ;RESTORE T1
JRST CPOPJ1 ;AND SKIP RETURN
NOTDEL: POP P,T1 ;COME HERE IF NOT A DELIM
POPJ P, ;TAKE FIRST RETURN
;
ERROR: OUTSTR[ASCIZ/ILLEGAL COMMAND
/]
CLRBFI ;CLEAR TYPE-IN BUFFER
JRST COMMND ;AND GET NEXT COMMAND
;
CHKOPT: SKIPE T2 ;NEW OPTIONS GIVEN?
SKIPA OF,T2 ;YES. STORE AS OPT FLAGS & SKIP
SKIPE OF ;ANY OPTS GIVEN LAST TIME?
CAIA ;YES. USE SAME OPTIONS
SETO OF, ;SET ALL OPTION FLAGS
EOCOM: CLRBFI ;GET RID OF POSSIBLE LF
MOVE T1,DISIND ;GET DISPATCH INDEX
JRST @CMD2(T1) ;AND DISPATCH
;
;TELL USER FILE NOT THERE BEFORE RETURNING FOR NEXT COMMAND
;
NOTTHR: PUSHJ P,MAKNAM ;OUTPUT FILE NAME TO TTY
PUSHJ P,BRKTTY ;BREAK OUTPUT TO TTY
OUTSTR [ASCIZ/ does not exist.
/] ;TELL USER NOT THERE
CLRBFI ;CLEAR TTY INPUT BUFFER
CLOSE DATCHI, ;CLOSE DATA FILE INPUT CHANNEL
JRST COMMND ;GO GET NEXT COMMAND
SUBTTL I/O ROUTINES
;
;OPEN A CHANNEL CONTAINED IN CH. OPEN BLOCK IS IN T1, T2, AND T3
;
OPNCHN: MOVEI I,1 ;Y FIELD IS AC 1
DPB CH,INSPTR ;DEPOSIT CHANNEL IN INSTRUCTION
TLO I,(OPEN) ;TEST ON OPEN INSTRUCTION
XCT I ;DO OPEN
CAIA ;SKIP IF FAILS
POPJ P, ;RETURN
OUTSTR [ASCIZ/Open fails/]
EXIT 1, ;EXIT IF FAILS
POPJ P, ;ALLOW OPTION TO CONTINUE
;
;LOOKUP A FILE ON CHANNEL CONTAINED IN CH. LOOKUP BLOCK IS IN T1, T2, T3,
;AND T4. FIRST RETURN IF NOT FOUND. SKIP RETURN IF FOUND.
;
LOKFIL: MOVEI I,1 ;Y FIELD IS AC 1
DPB CH,INSPTR ;DEPOSIT CHANNEL
TLO I,(LOOKUP) ;TEST ON INSTRUCTION
XCT I ;DO LOOKUP
CAIA ;SKIP IF FAILS
JRST CPOPJ1 ;SKIP RETURN IF SUCCESSFUL
TRNN T2,777777 ;TEST IF FILE NOT FOUND
POPJ P, ;RETURN IF TRUE
OUTSTR [ASCIZ/Lookup fails. Error codes in rh of ac 2/]
EXIT 1, ;EXIT IF ERROR
POPJ P, ;ALLOW OPTION TO CONTINUE
;
;ENTER A FILE ON CH. ENTER BLOCK IS IN T1, T2, T3, AND T4
;
ENTFIL: MOVEI I,1 ;Y FIELD IS AC 1
DPB CH,INSPTR ;DEPOSIT CHANNEL
TLO I,(ENTER) ;TEST ON ENTER INSTRUCTION
XCT I ;DO ENTER
CAIA ;SKIP IF ERROR
POPJ P, ;RETURN
OUTSTR [ASCIZ/Enter fails. Error codes in rh of ac 2/]
EXIT 1, ;EXIT ON ERROR
POPJ P, ;OPTION TO CONTINUE
;
;RENAME A FILE ON CHANNEL CONTAINED IN CH. RENAME BLOCK IS IN T1,T2, T3, AND T4
;
RENFIL: MOVEI I,1 ;Y FIELD IS AC 1
DPB CH,INSPTR ;DEPOSIT CHANNEL
TLO I,(RENAME) ;TEST ON RENAME INSTRUCTION
XCT I ;DO RENAME
CAIA ;SKIP IF ERROR
POPJ P, ;RETURN
OUTSTR [ASCIZ/RENAME fails. Error codes in rh of ac 2/]
EXIT 1, ;EXIT ON ERROR
POPJ P, ;OPTION TO CONTINUE
;
;READ A CHARACTER INTO C ON CHANNEL.
;FIRST RETURN IF EOF. SKIP RETURN IF SUCCESSFUL.
CHRIN: PUSH P,T1 ;SAVE T1
MOVE T1,CH ;COMPUTE BUFFER INDEX
IMULI T1,3
GET: SOSL IBUF+2(T1) ;CHECK IF BUFFER EMPTY
JRST GETC ;NO. GET CHARACTER
PUSHJ P,GETBF ;GET NEW BUFFER
JRST EOFRET ;RETURN IF EOF
JRST GET ;START AGAIN WITH NEW BUFFER
GETC: ILDB C,IBUF+1(T1) ;GET CHARACTER
JUMPE C,GET ;LOOP BACK IF NULL
POP P,T1 ;RESTORE T1
JRST CPOPJ1 ;SKIP RETURN
;
;GET A NEW BUFFER ON CHANNEL CONTAINED IN CH.
;FIRST RETURN IF EOF. SKIP RETURN IF SUCCESSFUL.
;
GETBF: CAIN CH,DATCHI ;SEE IF DATA FILE INPUT
AOJ BK, ;YES. INCREMENT BLOCK COUNT
SETZ I, ;LOAD IN HERE
DPB CH,INSPTR ;DEPOSIT CHANNEL
TLO I,(IN) ;TEST ON IN INSTRUCTION
XCT I ;DO IN
JRST CPOPJ1 ;SKIP RETURN IF SUCCESSFUL
PUSH P,T1 ;SAVE T1
AOJ I, ;Y FIELD IS AC 1
TLZ I,777000 ;ZERO OUT OP-CODE FIELD
TLO I,(GETSTS) ;TEST ON GETSTS INSTRUCTION
XCT I ;DO GETSTS
TRNE T1,1B22 ;TEST FOR EOF
JRST EOFRET ;GO RETURN IF EOF
OUTSTR [ASCIZ/In fails. Error codes in ac 1/]
EXIT 1, ;EXIT IF ERROR
TLZ T1,74B23 ;TURN OFF ERROR BITS
TLZ I,777000 ;ZERO OUT OP-CODE
TLO I,(SETSTS) ;TEST ON SETSTS INSTRUCTION
XCT I ;DO SETSTS
EOFRET: POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
;
;OUTPUT A CHARACTER IN C ON CHANNEL CONTAINED IN CH
;
CHROUT: SKIPGE CH ;SKIP IF NOT TTY (CH)=-1
JRST TTYOUT ;GO DO TTY OUTPUT ROUTINE
PUSH P,T1 ;SAVE T1
MOVE T1,CH ;COMPUTE BUFFER INDEX
IMULI T1,3
PUT: SOSG OBUF+2(T1) ;BUFFER FULL?
PUSHJ P,PUTBF ;YES. GO OUTPUT IT
PUTC: IDPB C,OBUF+1(T1) ;DEPOSIT A CHAR IN BUFFER
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
;
;OUTPUT A BUFFER ON CHANNEL CONTAINED IN CH.
PUTBF: SETZ I, ;PUT OUT INSTRUCTON HERE
DPB CH,INSPTR ;DEPOSIT CHANNEL NUMBER
TLO I,(OUT) ;TEST ON OUT INSTRUCTION
XCT I ;DO OUT
POPJ P, ;RETURN IF SUCCESSFUL
AOJ I, ;Y FIELD IS AC 1
TLZ I,777000 ;TEST OUT OP-CODE
TLO I,(GETSTS) ;TEST ON GETSTS INSTRUCTION
XCT I ;DO GETSTS
OUTSTR [ASCIZ/Out fails. Error codes in ac 1/]
EXIT 1, ;EXIT ON ERROR
TLZ T1,74B23 ;TURN OFF ERROR BITS
TLZ I,777000 ;ZERO OP-CODE
TLO I,(SETSTS) ;TEST ON SETSTS INSTRUCTION
XCT I ;DO SETSTS
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
;
;OUTPUT A CHARACTER TO TTY
;
TTYOUT: SOSG TTYHDR+1 ;SEE IF TTY BUFFER FULL
PUSHJ P,BRKTTY ;YES. GO OUTPUT IT
IDPB C,TTYHDR ;DEPOSIT A CHAR IN TTY BUFFER
POPJ P, ;RETURN
;
;BREAK OUTPUT TO TTY
;
BRKTTY: PUSH P,T1 ;SAVE T1
SETZ T1, ;SET CHAR TO NULL
IDPB T1,TTYHDR ;DEPOSIT NULL IN TTY BUFFER
OUTSTR TTYBUF ;OUTSTR TTY BUFFER
MOVE T1,TTYPTR ;RESET TTY BUFFER POINTER
MOVEM T1,TTYHDR ;IN TTYHDR
MOVEI T1,TTYSIZ ;RESET BYTE COUNT FOR TTY BUFFER
MOVEM T1,TTYHDR+1 ;IN TTYHDR+1
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
;
;OUTPUT A PAGE ON CHANNEL CONTAINED IN A
;FIRST RETURN IF EOF. SKIP RETURN IF ENTRY OUTPUT.
;
SHOW: MOVEI CH,DATCHI ;SET DATA FILE INPUT CHANNEL
PUSHJ P,CHRIN ;GET THE POINT
POPJ P, ;FIRST RETURN IF EOF
SHOW1: PUSHJ P,CHRIN ;GET THE CODE
JRST ILFORM ;SHOULD NEVER GET HERE (EOF)
PUSHJ P,CHRIN ;GET THE COLON
JRST ILFORM ;SHOULD NEVER GET HERE (EOF)
MOVE CH,A ;GET OUTPUT CHANNEL
MOVEI C,CR ;OUTPUT A CR AND LF
PUSHJ P,CHROUT
MOVEI C,LF
PUSHJ P,CHROUT
MOVEI CH,DATCHI ;RESET CHANNEL TO DATA FILE INPUT
GTNXT: PUSHJ P,CHRIN ;GET A CHARACTER
JRST ILFORM ;SHOULD NEVER GET HERE (EOF)
OUTIT: MOVE CH,A ;SET CHANNEL FOR OUTPUT
PUSHJ P,CHROUT ;OUTPUT CHARACTER
MOVEI CH,DATCHI ;RESET CHANNEL
CAIE C,LF ;CHECK IF CHAR IS LF
JRST GTNXT ;NO. GO BACK FOR NEXT CHARACTER
PUSHJ P,CHRIN ;GET CHAR AFTER LF
JRST ILFORM ;SHOULD NEVER GET HERE (EOF)
CAIN C,POINT ;SEE IF A POINT
JRST SHOW1 ;YES. GO OUTPUT NEXT FIELD
CAIE C,FF ;SEE IF A FF
JRST OUTIT ;NO. CONTINUE OUTPUTTING FIELD
MOVE T1,ENBFFF ;SAVE BUFFER POSITION OF LAST FF
MOVEM T1,STBFFF
MOVE T1,ENBKFF ;SAVE BLOCK OF LAST FF
MOVEM T1,STBKFF
MOVEI T1,DATCHI ;COMPUTE BUFFER INDEX
IMULI T1,3
MOVE T1,IBUF+2(T1) ;SAVE BYTE COUNT AT FF
MOVEM T1,ENBFFF
MOVEM BK,ENBKFF ;SAVE BLOCK OF THIS FF
JRST CPOPJ1 ;SKIP RETURN IF ENTRY OUTPUT
;
;TYPE OUT FILE NAME ON TERMINAL
MAKNAM: PUSH P,T1 ;SAVE T1
SETO CH, ;CHANNEL -1 (TTY)
MOVE T1,FILPTR ;GET POINTER TO FILE NAME
MOVEI CT,6 ;COUNT 6 CHARACTER NAME
PUSHJ P,NOFILE ;GET AND WRITE NAME
MOVEI C,POINT ;WRITE POINT
PUSHJ P,CHROUT
MOVEI CT,3 ;COUNT 3 CHARACTER EXTENSION
PUSHJ P,NOFILE ;GET AND WRITE EXTENSION
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
NOFILE: SOSGE CT ;DECREMENT CHARACTER COUNT
POPJ P, ;RETURN IF COVERED ALL CHARS
ILDB C,T1 ;LOAD SIXBIT BYTE FROM FILE NAME
JUMPE C,NOFILE ;IGNORE IT IF NULL
ADDI C,40 ;ELSE, MAKE IT UC ASCII
PUSHJ P,CHROUT ;OUTPUT IT TO TTY
JRST NOFILE ;GO BACK FOR NEXT CHAR
;
;SET UP TEMP EDIT FILE FOR WRITING
;
;OPEN AN OUTPUT CHANNEL AND ENTER A TEMPORARY EDIT FILE FILE.TEM
SETEDT: PUSH P,T1 ;SAVE T1
PUSH P,T2 ;SAVE T2
PUSH P,T3 ;SAVE T3
PUSH P,T4 ;SAVE T4
SETZB T1,T2 ;MODE ASCII
TLO T2,(SIXBIT/DSK/) ;DEVICE DSK
MOVEI T3,EDITO ;COMPUTE BUF INDEX OF EDIT OUT CHAN
IMULI T3,3
HRLZI T3,OBUF(T3) ;GET OUT BUFFER INDEX FOR EDIT CHAN
MOVEI CH,EDITO ;SET UP EDIT OUT CHANNEL
PUSHJ P,OPNCHN ;OPEN CHANNEL TO TEMP EDIT FILE
MOVE T1,DFILE ;LOAD FILE NAME
HRLZI T2,(SIXBIT/TEM/) ;GIVE IT TEMP EXTENSION
SETZB T3,T4 ;DEFAULTS
PUSHJ P,ENTFIL ;ENTER TEMP EDIT FILE
OUTBUF EDITO,1 ;1 OUTPUT BUFFER
POP P,T4 ;RESTORE T4
POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE T2
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
;
;COPY FILE TO FILE.TEM FROM BEGINNING TO FF AT START OF ENTRY
;
COPBEG: PUSH P,T1 ;SAVE T1
PUSH P,T2 ;SAVE T2
PUSH P,T3 ;SAVE T3
PUSHJ P,SETEDT ;SET UP TO WRITE TO TEMP EDIT FILE
MOVEI T2,DATCHI ;COMPUTE INDEX FOR DATA IN CHAN
IMULI T2,3
MOVEI T3,EDITO ;COMPUTE INDEX FOR EDIT OUT CHAN
IMULI T3,3
MOVE CT,STBKFF ;GET BLOCK AT WHICH TO STOP
USETI DATCHI,1 ;START AT BEGINNING FOR INPUT
USETO EDITO,1 ;AND OUTPUT
MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
PUSHJ P,GETBF ;GET FIRST BLOCK
JRST ILFORM ;IMPOSSIBLE (EOF)
MOVEI CH,EDITO ;SET UP TEMP EDIT FILE
PUSHJ P,PUTBF ;DUMMY OUT TO SET UP BUF RING HDR
HRRZ T1,IBUF+1(T2) ;GET ADR OF INPUT BUFFER - 1
MOVSI T1,1(T1) ;LOAD ADR OF INPUT BUFFER
HRR T1,OBUF+1(T3) ;GET ADR OF OUTPUT BUFFER - 1
AOJ T1, ;MAKE IT ADR OF OUTPUT BUFFER
MOVEM T1,BLTAC ;STORE AC FOR BLT INSTRUCTION
BLTLOP: SOJE CT,ATFFBK ;TEST HERE SO DON'T COPY BLOCK W/ FF
HRLZI I,(BLT T1,) ;LOAD BLT INSTRUCTION
HRR I,@IBUF+1(T2) ;GET WORD COUNT FROM INPUT BUFFER
ADDI I,-1(T1) ;COMPUTE ENDING ADR FOR BLT INSTRUCTION
XCT I ;DO BLT FROM INPUT TO OUTPUT BUFFERS
HRRM I,OBUF+1(T3) ;RESET OUT BUF RING HDR BYTE PTR
MOVEI CH,EDITO ;SET UP EDIT OUT CHANNEL
PUSHJ P,PUTBF ;OUTPUT THE BUFFER
MOVE T1,BLTAC ;RESTORE AC FOR BLT INSTRUCTION
MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
PUSHJ P,GETBF ;GET THE NEXT BUFFER
JRST ILFORM ;IMPOSSIBLE (EOF)
JRST BLTLOP ;GO COPY NEXT BLOCK
ATFFBK: MOVEI T1,EDITO ;SET UP EDIT FILE OUTPUT CHANNEL
MOVEM T1,OUTCHN ;STORE AWAY FOR SUBROUTINES
MOVE A,STBFFF ;GET CHAR COUNT AT STARTING FF
PUSHJ P,COPBLK ;READ AND WRITE UP TO STARTING FF
POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE T2
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
;
;READ AND WRITE THE CURRENT BLOCK UNTIL (A) BLOCKS LEFT (AT START OF ENTRY)
;OR EOF. STORE CHARACTER COUNT ON RETURN IN CT.
;
COPBLK: PUSH P,T1 ;SAVE T1
MOVEI T1,DATCHI ;COMPUTE BUF INDEX FOR DATA IN CHAN
IMULI T1,3
SETZ CT, ;INITIALIZE CHAR COUNT
COPLOP: MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
PUSHJ P,CHRIN ;GET A CHARACTER
JRST COPRET ;GO RETURN IF EOF
AOJ CT, ;INCREMENT CHAR COUNT
MOVE CH,OUTCHN ;GET OUTPUT CHANNEL
PUSHJ P,CHROUT ;OUTPUT THE CHAR
CAME A,IBUF+2(T1) ;CHECK IF (A) BYTES LEFT
JRST COPLOP ;NO. LOOP FOR MORE CHARS
COPRET: MOVEM CT,STBFFF ;STORE CHAR COUNT
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
;
;COPY REST OF FILE, RENAME TEMP EDIT FILE
;
EDTEND: PUSH P,T1 ;SAVE T1
PUSH P,T2 ;SAVE T2
PUSH P,T3 ;SAVE T3
PUSH P,T4 ;SAVE T4
MOVEI T1,EDITO ;GET EDIT OUTPUT CHANNEL
MOVEM T1,OUTCHN ;STORE IT FOR SUBROUTINES
PUSHJ P,WRTEND ;WRITE REST OF FILE TO TEMP EDIT
CLOSE EDITO, ;CLOSE EDIT OUTPUT CHANNEL
SETZ T1, ;DELETE FILE (NULL NAME)
MOVEI CH,DATCHI ;ON DATA FILE INPUT CHA NNEL
PUSHJ P,RENFIL ;GO RENAME TO NULL
MOVE T1,DFILE ;LOAD FILE NAME
HLLZ T2,DFILE+1
SETZB T3,T4 ;DEFAULTS
MOVEI CH,EDITO ;RENAME TO ORIGINAL ON EDIT CHANNEL
PUSHJ P,RENFIL ;DO RENAME
RELEAS EDITO, ;RELEASE EDIT CHANNEL
MOVE T1,DFILE ;LOAD FILE NAME
HLLZ T2,DFILE+1
SETZB T3,T4 ;DEFAULTS
MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
PUSHJ P,LOKFIL ;LOOKUP FILE AGAIN
JRST ILFORM ;IMPOSSIBLE (NOT FOUND)
POP P,T4 ;RESTORE T4
POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE T2
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
;
;COPY REST OF FILE TO OUTPUT FILE ON CHANNEL CONTAINED IN OUTCHN.
;
WRTEND: MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
PUSHJ P,CHRIN ;GET A CHARACTER
POPJ P, ;RETURN ON EOF
MOVE CH,OUTCHN ;GET OUTPUT CHANNEL
PUSHJ P,CHROUT ;WRITE A CHARACTER
JRST WRTEND ;LOOP BACK FOR MORE CHARACTERS
;
;REWIND THE DATA FILE ON INPUT CHANNEL
;
REWDAT: USETI DATCHI,1 ;POINT TO FIRST BLOCK
MOVEI CH,DATCHI ;SET DATA FILE INPUT CHANNEL
PUSHJ P,GETBF ;GET FIRST BLOCK
JRST ILFORM ;SHOULD NEVER GET HERE (EOF)
MOVEI BK,1 ;RESET BLOCK COUNT
SETOM ENBKFF ;RESET BLOCK COUNT OF FF
SETOM STBKFF ;RESET OLD BLOCK COUNT OF FF
POPJ P, ;RETURN
;
;RESTORE POSITION OF FILE BEFORE EDITING. BLOCK IS IN BK; NUMBER OF CHARACTERS
;TO RESTORE AFTER IS IN STBFFF.
;
RESPOS: PUSH P,T1 ;SAVE T1
PUSH P,T2 ;SAVE T2
MOVE CT,STBFFF ;GET CHARACTER COUNT INTO BUFFER
MOVEI CH,DATCHI ;SET DATA FILE INPUT CHANNEL
USETI DATCHI,(BK) ;POINT TO BLOCK WHERE EDIT STARTED
PUSHJ P,GETBF ;GET THAT BLOCK
JRST ILFORM ;SHOULD NEVER GET HERE (EOF)
SOJ BK, ;RESTORE BLOCK COUNT
MOVEI T2,DATCHI ;COMPUTE INDEX OF INPUT BUFFER
IMULI T2,3
MOVE T1,IBUF+2(T2) ;GET NEW BUFFER SIZE
SUB T1,CT ;COMPUTE BYTE COUNT AFTER POSITIONING
MOVEM T1,IBUF+2(T2) ;SET BUFFER HEADER BYTE COUNT TO ANSWER
IBP IBUF+1(T2) ;INCREMENT BUF HDR BYTE POINTER
SOJG CT,.-1 ;UNTIL PASSED NUMBER OF CHARS IN CT
MOVE T1,IBUF+2(T2) ;GET BYTES LEFT
MOVEM T1,STBFFF ;STORE AS STARTING FF BUFFER POSITION
MOVEM T1,ENBFFF ;AND AS NEW FF BUFFER POSITION
MOVEM BK,ENBKFF ;STORE BLOCK COUNT AS NEW FF BLOCK
POP P,T2 ;RESTORE T2
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
SUBTTL FIND COMMAND
COMMENT/
Find the next match of the search string, and type out the entry
in which it occurs on the terminal.
/
;
FIND: TRNE F,FLFAIL ;CHECK IF LOOKUP FAILED
JRST NOTTHR ;YES. GO TELL NOT THERE
TRNE F,FEOF ;AT EOF?
JRST ERROR ;YES. THEN ILLEGAL COMMAND
PUSHJ P,FINSEA ;GO FIND A MATCH
JRST NOTFND ;EOF - GO TELL USER NOT FOUND
SETO A, ;SET TTY CHANNEL
PUSHJ P,SHOW ;DISPLAY PAGE
JRST ILFORM ;ILLEGAL FORMAT OF FILE IF EOF
PUSHJ P,BRKTTY ;BREAK TTY OUTPUT
JRST COMMND ;GO GET NEXT COMMAND
;
NOTFND: OUTSTR[ASCIZ/SEARCH FAILS.
/]
TRO F,FEOF ;TURN ON EOF FLAG
JRST COMMND ;GO GET NEXT COMMAND
;
SUBTTL COMMON ROUTINES FOR FIND AND SEARCH COMMANDS
COMMENT/
The following algorithm is used for all search commands:
1. Get a character from the search string.
2. If it is an escape then
Get another character from the search string.
If this character is also an escape then
Rewind the file to the start of the current entry and return;
Else, rewind the file to the start of the current field.
3. Loop
Get a character from the file
If at the end of the current field then
Rewind the search string to before the first word.
Go to step 1.
If characters match then go to step 1.
If previous characters matched then rewind the search string
to the start of the current word.
End Loop
First return if match not found. Skip return if match found.
/
;
FINSEA: MOVEI CH,DATCHI ;SET UP TO READ DATA FILE
PUSH P,T1 ;SAVE T1
PUSH P,T2 ;SAVE T2
PUSH P,T3 ;SAVE T3
PTAFFF: PUSHJ P,CHRIN ;GET CHAR AFTER FF
JRST ENDFIL ;FIRST RETURN IF EOF
CAIE C,POINT ;IS CHAR A POINT?
JRST ILFORM ;NO. THEN ILLEGAL FILE FORMAT
NEWFLD: PUSHJ P,CHRIN ;GET A CODE FROM INPUT BUFFER
JRST ILFORM ;WE SHOULD NEVER GET HERE (EOF)
GETIND OPT,ILFORM ;GET THE INDEX OF THE OPTION
TRNE OF,@OPT2(T1) ;SHOULD WE SEARCH THIS FIELD?
JRST SCAN ;YES. GO SCAN IT
SCNNXT: PUSHJ P,CHRIN ;GET NEXT CHARACTER
JRST ILFORM ;WE SHOULD NEVER GET HERE (EOF)
CAIE C,LF ;IS CHAR A LF?
JRST SCNNXT ;ELSE, LOOK AT NEXT CHARACTER
PTAFLF: PUSHJ P,CHRIN ;GET NEXT CHARACTER
JRST ILFORM ;WE SHOULD NEVER GET HERE (EOF)
CAIN C,POINT ;SEE IF A POINT
JRST NEWFLD ;YES. START SCANNING NEXT FIELD
CAIE C,FF ;SEE IF CHAR IS A FF?
JRST SCNNXT ;NO. LOOK AT NEXT CHARACTER
FFAFLF: MOVEM BK,ENBKFF ;STORE BLOCK OF THIS FF
MOVEI T1,DATCHI ;COMPUTE BUFFER INDEX
IMULI T1,3
MOVE T1,IBUF+2(T1) ;STORE POSITION OF FF
MOVEM T1,ENBFFF
JRST PTAFFF ;AND START SCANNING NEXT ENTRY
;
;SCAN A FIELD FOR A MATCH
SCAN: PUSHJ P,CHRIN ;GET CHARACTER AFTER CODE
JRST ILFORM ;WE SHOULD NEVER GET HERE (EOF)
CAIE C,COLON ;SEE IF CHAR IS A COLON
JRST ILFORM ;NO. THEN ILLEGAL FILE FORMAT
MOVEM BK,BLOKC ;STORE BLOCK OF COLON
MOVEI T1,DATCHI ;COMPUTE BUFFER INDEX
IMULI T1,3
MOVE T1,IBUF+2(T1) ;GET # OF USED BYTES AFTER THIS POINT
MOVEM T1,BUFRC ;AND STORE IT AWAY
MOVE T1,BSTPTR ;LOAD POINTER TO SEARCH STRING
MOVEM T1,STRPTR ;STORE IT IN TEMPORARY POINTER LOC
SCNFIL: PUSHJ P,CHRIN ;GET NEXT FILE CHAR
JRST ILFORM ;WE SHOULD NEVER GET HERE (EOF)
CAIE C,LF ;SEE IF CHAR IS A LF
JRST SCNSTR ;NO. GO GET STRING CHAR
PUSHJ P,CHRIN ;YES. GET NEXT CHAR
JRST ILFORM ;WE SHOULD NEVER GET HERE (EOF)
CAIN C,POINT ;IS IT A POINT?
JRST NEWFLD ;YES. WE ARE AT NEW FIELD
CAIN C,FF ;IS IT A FF?
JRST FFAFLF ;YES. GO CHECK FOR FOLLOWING POINT
SCNSTR: ILDB T3,T1 ;GET A CHARACTER FROM STRING
CAIE T3,ESC ;IS IT AN ESCAPE?
JRST LOOK ;NO. GO LOOK FOR MATCH
MOVEM T1,STRPTR ;STORE TEMP STRING POINTER
ILDB T3,T1 ;GET ANOTHER CHAR
CAIN T3,ESC ;IS THIS CHAR ALSO AN ESCAPE?
JRST ENDSEA ;YES. THEN WE HAVE A MATCH!
MOVE BK,BLOKC ;GET BLOCK OF LAST COLON
MOVE A,BUFRC ;GET POSITION OF LAST COLON SEEN
PUSHJ P,POSTN ;AND POSTION AFTER IT
TRZ F,FMATCH ;TURN OFF MATCH MADE FLAG
PUSHJ P,CHRIN ;AND GO GET FIRST CHARACTER AGAIN
JRST ILFORM ;WE SHOULD NEVER GET HERE (EOF)
LOOK: MOVEI T2,NXTCHR ;GET ADDRESS OF LOOP RETURN IF NO MATCH
MOVEM T2,RETADR ;STORE IT
MOVE T2,T3 ;GET STRING CHARACTER
TRZ T2,40 ;INDISCRIMINANTLY DROP UC/LC BIT
CAIL T2,"A" ;IS CHAR ALPHA?
CAILE T2,"Z"
SKIPA T2,T3 ;NO. RESTORE STRING CHAR
CAIA ;YES. JUST SKIP
AOSA RETADR ;INCREMENT LOOP RETURN ADDRESS
NXTCHR: TRZ C,40 ;MAKE CHAR UC (NOOP IF MASK=0)
CAMN T2,C ;DO CHARACTERS MATCH?
JRST MATCH ;YES. GO TO MATCH ROUTINE
TRZN F,FMATCH ;HAS A MATCH BEEN MADE?
JRST RECYCL ;NO. SO GO GET NEXT FILE CHAR & RECYCLE
MOVE T1,STRPTR ;YES. SET STRING PTR TO START OF WORD
JRST SCNSTR ;AND GO GET FIRST STRING CHAR OF WORD
RECYCL: PUSHJ P,CHRIN ;GET ANOTHER FILE CHAR
JRST ILFORM ;WE SHOULD NEVER GET HERE (EOF)
CAIE C,LF ;SEE IF CHAR IS A LF?
JRST @RETADR ;NO. JUST GO MAKE NEW COMPARE
PUSHJ P,CHRIN ;GET CHAR AFTER LF
JRST ILFORM ;WE SHOULD NEVER GET HERE (EOF)
CAIN C,POINT ;IS CHAR A POINT?
JRST NEWFLD ;YES. GO GET NEXT FIELD
CAIN C,FF ;IS CHAR A FF?
JRST FFAFLF ;YES. GO CHECK FOR FOLLOWING POINT
JRST @RETADR ;ELSE, RECYCLE
MATCH: TRO F,FMATCH ;TURN ON MATCH MADE FLAG
JRST SCNFIL ;AND GO GET NEXT PAIR OF CHARS
;
POSTN: PUSH P,T1 ;SAVE T1
PUSH P,T2 ;SAVE T2
MOVEI CH,DATCHI ;USE DATA FILE INPUT CHANNEL
USETI DATCHI,(BK) ;POSITION FILE AT BLOCK BK
PUSHJ P,GETBF ;AND GO GET BLOCK BK
JRST ILFORM ;WE SHOULD NEVER GET HERE (EOF)
SOJ BK, ;RESTORE BLOCK COUNT
MOVE T2,CH ;COMPUTE BUFFER INDEX
IMULI T2,3
MOVE T1,IBUF+2(T2) ;GET USED BYTE COUNT FOR BLOCK
MOVEM A,IBUF+2(T2) ;SET BUFFER COUNT TO POS OF COLON
SUB T1,A ;COMPUTE # OF BYTES TO ADVANCE
IBP IBUF+1(T2) ;INCREMENT THE BUFFER BYTE POINTER
SOJG T1,.-1 ;JUMP BACK IS NOT IN POSITION YET
POP P,T2 ;ELSE, RESTORE T1
POP P,T1 ;RESTORE T2
POPJ P, ;AND RETURN
;
ENDSEA: SKIPGE ENBKFF ;SKIP IF NOT FIRST ENTRY
JRST FIRSTB ;ELSE, GO GET FIRST BLOCK
MOVE BK,ENBKFF ;GET BLOCK COUNT OF LAST FF
MOVE A,ENBFFF ;GET BYTE COUNT OF LAST FF
PUSHJ P,POSTN ;POSITION BUFFER AFTER LAST FF
JRST RETFS ;RETURN
FIRSTB: USETI DATCHI,1 ;POINT TO FIRST BLOCK
PUSHJ P,GETBF ;GET IT (RESTORES BK TO 1)
JRST ILFORM ;SHOULD NEVER GET HERE (EOF)
MOVEI BK,1 ;RESET BLOCK COUNT TO FIRST BLOCK
RETFS: TRZ F,FMATCH ;TURN OFF MATCH MADE FLAG
POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE T2
POP P,T1 ;RESTORE T1
JRST CPOPJ1 ;SKIP RETURN
;
ILFORM: OUTSTR[ASCIZ/ILLEGAL FORMAT OF DATA FILE /]
PUSHJ P,MAKNAM ;GET NAME OF DATA FILE
MOVEI C,CR ;OUTPUT A CRILIF
PUSHJ P,CHROUT
MOVEI C,LF
PUSHJ P,CHROUT
JRST RESSET
;
ENDFIL: POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE T2
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
;
SUBTTL HELP COMMAND
COMMENT/
Open a channel to device HLP:, LOOKUP a help text, and type it on
the terminal.
/
;
HELP: MOVEI CH,HLPI ;GET HELP FILE INPUT CHANNEL
MOVE T1,[SIXBIT/BIBLIO/] ;LOAD NAME OF HELP FILE
HRLZI T2,(SIXBIT/HLP/)
SETZB T3,T4 ;DEFAULT PPN, PROT, ETC. FIELDS
PUSHJ P,LOKFIL ;LOOKUP THE HELP FILE
JRST NOHELP ;JUMP IF NOT FOUND
HLPLOP: PUSHJ P,CHRIN ;GET A CHARACTER
JRST ENDHLP ;RETURN ON EOF
SETO CH, ;TTY CHANNEL
PUSHJ P,CHROUT ;OUTPUT CHAR TO TTY
MOVEI CH,HLPI ;RESET CHANNEL TO HELP FILE INPUT
JRST HLPLOP ;LOOP BACK
ENDHLP: PUSHJ P,BRKTTY ;BREAK OUTPUT TO TTY
CLOSE HLPI, ;CLOSE HELP FILE INPUT CHANNEL
JRST COMMND ;GO GET NEXT COMMAND
NOHELP: OUTSTR [ASCIZ/I'm sorry, but no help is available.
/]
JRST COMMND ;GO GET NEXT COMMAND
;
SUBTTL DUMP DATA FILE
COMMENT/
Write all entries to a .LPT file by setting up a null search
string.
/
;
DUMP: TRNE F,FLFAIL ;CHECK IF LOOKUP FAILED
JRST NOTTHR ;YES. GO TELL NOT THERE
TRNE F,FLFAIL ;CHECK IF LOOKUP FAILED
JRST NOTTHR ;YES. GO TELL NOT THERE
HRLZI T1,(BYTE (7)33,33) ;LOAD DOUBLE ESCAPE
HLLZM T1,STRING ;INTO STRING (NO STRING)
SETO OF, ;SET ALL OPTION FLAGS
TRZ F,FEOF ;TURN OFF EOF FLAG
JRST SEARCH ;AND GO DO A NORMAL SEARCH
SUBTTL SEARCH ROUTINE
COMMENT/
Open a channel to device LPT:, and write all entries in which matches
occur to this device.
/
;
SEARCH: TRNE F,FLFAIL ;CHECK IF LOOKUP FAILED
JRST NOTTHR ;YES. GO TELL NOT THERE
TRNE F,FEOF ;CHECK IF AT EOF
JRST ERROR ;YES. ILLEGAL COMMAND
SETOM ENBKFF ;FLAG THAT ON FIRST ENTRY
MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
USETI DATCHI,1 ;POINT TO FIRST BLOCK
PUSHJ P,GETBF ;GET IT
JRST ILFORM ;SHOULD NEVER GET HERE (EOF)
MOVEI BK,1 ;INITIALIZE BLOCK COUNT
PUSHJ P,FINSEA ;FIND A MATCH
JRST NOTFND ;JUMP IF NOT FOUND
SETZB T1,T2 ;MODE ASCII
TLO T2,(SIXBIT/LPT/) ;DEVICE LPT
MOVEI CH,LPTO ;SET UP LPT OUTPUT CHANNEL
MOVE T3,CH ;COMPUTE BUFFER INDEX
IMULI T3,3
HRLZI T3,OBUF(T3) ;LOAD ADDRESS OF BUFFER HEADER
PUSHJ P,OPNCHN ;OPEN OUTPUT CHANNEL TO LPT
OUTBUF LPTO,1 ;SET UP 1 OUTPUT BUFFER TO LPT
SEARA: MOVEI A,LPTO ;WRITE PAGE TO LPT
PUSHJ P,SHOW ;WRITE PAGE TO LPT
JRST ILFORM ;ILLEGAL FORMAT OF FILE IF EOF
MOVEI CH,DATCHI ;RESET CHANNEL TO DATA FILE INPUT
PUSHJ P,FINSEA ;SEARCH FOR MATCH
JRST ENDFND ;RETURN IF NOT FOUND
MOVEI CH,LPTO ;RESET CHANNEL TO LPT OUTPUT
MOVEI C,CR ;WRITE A CR,CR,LF TO LPT
PUSHJ P,CHROUT
MOVEI C,LF
PUSHJ P,CHROUT
MOVEI C,LF
PUSHJ P,CHROUT
JRST SEARA ;LOOP BACK FOR MORE SEARCHING
ENDFND: TRO F,FEOF ;TURN ON EOF FLAG
CLOSE LPTO, ;CLOSE CHANNEL TO LPT
RELEAS LPTO, ;RELEASE CHANNEL TO LPT
JRST COMMND ;JUMP TO GET NEXT COMMAND
SUBTTL EXIT ROUTINE
;
LEAVE: EXIT ;EXIT
SUBTTL COMMON ROUTINES FOR APPEND, INSERT, AND REPLACE COMMANDS
;ASK QUESTIONS AND WRITE FOUR FIELDS TO DATA FILE OUTPUT CHANNEL
;
INSENT: MOVEI CH,DATCHO ;SET UP DATA FILE OUTPUT CHANNEL
MOVEI A,CODES-1 ;GET POINTER TO LIST OF FIELD CODES
MOVEI C,FF ;OUTPUT A FF TO TTY
OUTCHR C
OUTSTR [ASCIZ/
End each entry with a CONTROL-Z.
/]
MOVNI T1,4 ;ASK FOR 4 FIELDS
REDFLD: OUTSTR @QUEST+4(T1) ;ASK FOR FIELD
PUSHJ P,FIELD ;GO GET FIELD
AOJN T1,REDFLD ;LOOP BACK IF MORE FIELDS
MOVEI C,FF ;WRITE A FF TO OUTPUT FILE
PUSHJ P,CHROUT
POPJ P, ;RETURN
;
;WRITE A SINGLE FIELD ON DATA FILE OUTPUT CHANNEL.
FIELD: PUSH P,T1 ;SAVE T1
AOJ A, ;POINT TO NEXT FIELD CODE
MOVEI CT,3 ;INITIALIZE COUNTER
MOVE T1,[POINT 7,(A)] ;GET NEXT CODE
CODELP: ILDB C,T1 ;GET A CHARACTER FROM CODE
PUSHJ P,CHROUT ;WRITE CODE TO OUTPUT BUFFER
SOJG CT,CODELP ;LOADED 3 CHARACTERS?
PUSHJ P,NEXT ;GO READ AND WRITE FIELD TEXT
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
;READ AND WRITE ON CHANNEL SPECIFIED IN CH TEXT FOR A SINGLE FIELD.
;
MOVEI CH,EDITO ;SET UP OUTPUT TO EDIT FILE
NEXT: INCHWL C ;GET A CHAR FROM TTY BUFFER
CAIN C,CONZ ;CONTROL-Z?
JRST CNTZ ;YES.
TRZ F,FLINFD ;TURN OFF LF FLAG IF ON
PUSHJ P,CHROUT ;WRITE CHAR TO OUTPUT BUFFER
CAIN C,LF ;LINE FEED?
TRO F,FLINFD ;YES. TURN OF LF SEEN FLAG
JRST NEXT ;NO. GET NEXT CHAR.
CNTZ: TRNE F,FLINFD ;LINE FEED LAST CHAR ENTERED?
JRST NXTRET ;YES. RETURN AND RESTORE T1
MOVEI C,CR ;WRITE A CR TO OUTPUT BUFFER
PUSHJ P,CHROUT
MOVEI C,LF ;WRITE A LF TO OUTPUT BUFFER
PUSHJ P,CHROUT
NXTRET: TRZ F,FLINFD ;TURN OFF LF LAST CHAR FLAG
POPJ P, ;AND RETURN
;
;COMPUTE BLOCK COUNT FROM NEGATIVE WORD COUNT
GETBKS: PUSH P,BK+1 ;SAVE BK+1 FOR REMAINDER
IDIVI BK,200 ;GET NEGATIVE BLOCK COUNT-1
MOVNS BK ;MAKE IT POSITIVE
SKIPE BK+1 ;SKIP IF LAST BLOCK EXACTLY FULL
AOJ BK, ;GET NEXT PARTIAL BLOCK NUMBER
POP P,BK+1 ;RESTORE BK+1
POPJ P, ;AND RETURN
;
;OPEN, LOOKUP, AND ENTER DATA FILE ON OUTPUT CHANNEL
;
UPDTIO: PUSH P,T1 ;SAVE T1
PUSH P,T2 ;SAVE T2
PUSH P,T3 ;SAVE T3
PUSH P,T4 ;SAVE T4
MOVEI CH,DATCHO ;SET UP FOR DATA FILE OUTPUT
MOVE T1,DFILE ;LOAD FILE NAME
HLLZ T2,DFILE+1
SETZB T3,T4 ;DEFAULTS
PUSHJ P,LOKFIL ;LOOKUP THE FILE ON OUTPUT CHANNEL
JRST ILFORM ;IMPOSSIBLE (NOT FOUND)
HLRE BK,T4 ;GET -WORD/BLOCK COUNT
SKIPG BK ;SEE IF BLOCK COUNT
PUSHJ P,GETBKS ;NO. GO COMPUTE BLOCK COUNT
MOVE T1,DFILE ;LOAD FILE NAME FOR ENTER
HLLZ T2,DFILE+1
SETZB T3,T4 ;DEFAULTS
PUSHJ P,ENTFIL ;ENTER FILE ON OUTPUT CHANNEL
POP P,T4 ;RESTORE T4
POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE T2
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
SUBTTL BEGIN ROUTINE
COMMENT/
Position at start of data file, and reset the proper flags.
/
;
BEGIN: TRNE F,FLFAIL ;CHECK IF FILE EXISTS
JRST NOTTHR ;NO. TELL USER NOT THERE
PUSHJ P,REWDAT ;REWIND DATA FILE
TRZ F,FEOF ;TURN OFF EOF FLAG
JRST COMMND ;GET NEXT COMMAND
SUBTTL PAGE ROUTINE
COMMENT/
Type out next entry on the terminal.
/
;
PAGE: TRNN F,FEOF ;TEST IF AT EOF
JRST PAGE1 ;NO. CONTINUE
SKIPL STBKFF ;TEST IF AT FIRST ENTRY
JRST ERROR ;NO. ILLEGAL COMMAND
PAGE1: TRNE F,FLFAIL ;CHECK IF FILE EXISTS
JRST NOTTHR ;NO. GO TELL NOT THERE
TRZ F,FEOF ;CLEAR EOF FLAG IN CASE ON
SETO A, ;SET OUTPUT TO TTY
PUSHJ P,SHOW ;SHOW NEXT PAGE
JRST PAGEOF ;JUMP IF EOF
PUSHJ P,BRKTTY ;BREAK OUTPUT TO TTY
JRST COMMND ;GO GET NEXT COMMAND
PAGEOF: TRO F,FEOF ;TURN ON EOF FLAG
OUTSTR [ASCIZ/NO MORE PAGES
/]
JRST COMMND ;GET NEXT COMMAND
SUBTTL TYPE ROUTINE
COMMENT/
Type out the next entry on the terminal.
/
;
TYPE: TRNE F,FLFAIL ;CHECK IF FILE EXISTS
JRST NOTTHR ;NO. GO TELL NOT THERE
SKIPG STBKFF ;SEE IF AT FIRST ENTRY
JRST TYPFIR ;YES. GO REWIND FILE
TRNE F,FEOF ;SEE IF EOF FLAG IS ON
JRST ERROR ;YES. ILLEGAL COMMAND
PUSH P,STBFFF ;SAVE STARTING FF BUFFER POS
PUSH P,STBKFF ;SAVE STARTING FF BLOCK
MOVE A,STBFFF ;GET STARTING FF BUFFER POS
MOVE BK,STBKFF ;GET STARTING FF BLOCK
PUSHJ P,POSTN ;POSITION AT START OF ENTRY
SETO A, ;OUTPUT TO TTY
PUSHJ P,SHOW ;OUTPUT FIELD
JRST ILFORM ;ILLEGAL FORMAT ON EOF
PUSHJ P,BRKTTY ;BREAK OUTPUT TO TTY
POP P,STBKFF ;RESTORE STARTING FF BLOCK
POP P,STBFFF ;RESTORE STARTING FF BUFFER POS
JRST COMMND ;GO GET NEXT COMMAND
TYPFIR: PUSHJ P,REWDAT ;REWIND THE FILE
SETO A, ;OUTPUT TO TTY
PUSHJ P,SHOW ;SHOW FIELD
JRST ILFORM ;ILLEGAL FORMAT ON EOF
PUSHJ P,BRKTTY ;BREAK OUTPUT TO TTY
SETOM STBKFF ;RESTORE STARTING FF BLOCK COUNT
JRST COMMND ;GO GET NEXT COMMAND
SUBTTL KILL ROUTINE
COMMENT/
Delete the current entry. Copy the file to FILE.TEM without the
current entry, then rename back to original file name.
/
;
KILL: TRNE F,FLFAIL ;CHECK IF FILE EXISTS
JRST NOTTHR ;NO. TELL NOT THERE
SKIPG STBKFF ;CHECK IF AT FIRST ENTRY
JRST KILFIR ;YES. GO TO SPECIAL ROUTINE
TRNE F,FEOF ;CHECK IF AT EOF
JRST ERROR ;YES. ILLEGAL COMMAND
PUSHJ P,COPBEG ;COPY BEGINNING OF FILE TO FF
PUSHJ P,KILLS ;KILL ENTRY
MOVE BK,STBKFF ;GET STARTING FF BLOCK
PUSHJ P,RESPOS ;RESTORE POSITION BEFORE EDIT
JRST COMMND ;GET NEXT COMMAND
KILFIR: PUSHJ P,SETEDT ;OPEN CHANNEL AND ENTER EDIT FILE
PUSHJ P,REWDAT ;REWIND DATA FILE
PUSHJ P,KILLS ;KILL FIRST ENTRY
PUSHJ P,REWDAT ;REWIND DATA FILE AGAIN
JRST COMMND ;GO GET NEXT COMMAND
KILLS: MOVEI CH,DATCHI ;SET UP INPUT CHANNEL TO DATA FILE
PUSHJ P,CHRIN ;GET A CHARACTER
JRST ILFORM ;SHOULD NOT GET HERE (EOF)
CAIE C,FF ;CHECK IF CHAR IS A FF
JRST .-3 ;NO. GO GET MORE CHARACTERS
PUSHJ P,EDTEND ;WRITE REST OF FILE AND RENAME
OUTSTR [ASCIZ/ENTRY KILLED
/]
POPJ P, ;RETURN
SUBTTL REPLACE ROUTINE
COMMENT/
Replace fields in the current entry. Copy the file to FILE.TEM
with the changes, then rename to the original file.
/
;
REPLAC: TRNE F,FLFAIL ;CHECK IF FILE EXISTS
JRST NOTTHR ;NO. TELL NOT THERE
SKIPN T2 ;CHECK IF ANY OPTIONS GIVEN
SETO OF, ;NO. SET ALL OPTION FLAGS
SKIPG STBKFF ;CHECK IF AT FIRST ENTRY
JRST REPFIR ;YES. GO TO SPECIAL ROUTINE
TRNE F,FEOF ;CHECK IF AT EOF
JRST ERROR ;YES. ILLEGAL COMMAND
PUSHJ P,COPBEG ;COPY BEGINNING OF FILE TO FF
PUSHJ P,REPLCS ;REPLACE FIELD(S)
MOVE BK,STBKFF ;GET STARTING FF BLOCK
PUSHJ P,RESPOS ;RESTORE POSITION BEFORE EDIT
JRST COMMND ;GET NEXT COMMAND
REPFIR: PUSHJ P,SETEDT ;OPEN CHANNEL AND ENTER EDIT FILE
PUSHJ P,REWDAT ;REWIND DATA FILE
PUSHJ P,REPLCS ;REPLACE FIELDS IN FIRST ENTRY
PUSHJ P,REWDAT ;REWIND DATA FILE AGAIN
JRST COMMND ;GO GET NEXT COMMAND
REPLCS: PUSH P,T1 ;SAVE T1
PUSH P,T2 ;SAVE T2
MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
PUSHJ P,CHRIN ;GET THE POINT
JRST ILFORM ;IMPOSSIBLE (EOF)
REPLC1: PUSHJ P,CHRIN ;GET A CODE
JRST ILFORM ;IMPOSSIBLE (EOF)
GETIND OPT,ILFORM ;GET INDEX OF CODE
TRNE OF,@OPT2(T1) ;CHECK IF THIS CODE IS ON
OUTSTR @QUEST(T1) ;YES. OUTPUT QUESTION FOR THIS CODE
MOVEI CH,EDITO ;SET UP EDIT FILE OUTPUT CHANNEL
MOVE T2,[POINT 7,CODES(T1)] ;LOAD POINTER TO FIELD CODE
MOVEI CT,3 ;3 CHAR FIELD CODE (.<CODE>:)
MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
PUSHJ P,CHRIN ;GET COLON
JRST ILFORM ;IMPOSSIBLE (EOF)
MOVEI CH,EDITO ;RESET EDIT FILE OUTPUT CHANNEL
LODCOD: ILDB C,T2 ;GET A CHAR OF CODE
PUSHJ P,CHROUT ;OUTPUT IT TO EDIT FILE
SOJG CT,LODCOD ;LOOP BACK IF NOT ALL OF CODE
LODFLD: MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
PUSHJ P,CHRIN ;GET A CHARACTER
JRST ILFORM ;IMPOSSIBLE (EOF)
LODFDA: TRNE OF,@OPT2(T1) ;CHECK IF CODE IS ON FOR REPLACE
JRST LODFD1 ;YES. DO NOT WRITE OUT FIELD
MOVEI CH,EDITO ;SET UP EDIT FILE OUTPUT CHANNEL
PUSHJ P,CHROUT ;OUTPUT CHAR
LODFD1: CAIE C,LF ;CHECK IF CHAR IS A LF
JRST LODFLD ;NO. CONTINUE GETTING FIELD CHARS
MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
PUSHJ P,CHRIN ;GET THE NEXT CHAR
JRST ILFORM ;IMPOSSIBLE (EOF)
CAIE C,POINT ;CHECK IF CHAR IS A POINT
JRST CHKFF ;YES. GO CHECK FOR END OF ENTRY (FF)
TRNE OF,@OPT2(T1) ;CHECK IF REPLACING THIS FIELD
PUSHJ P,NEXT-1 ;YES. GO READ REPLACEMENT
MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
JRST REPLC1 ;LOOP BACK FOR NEXT FIELD
CHKFF: CAIE C,FF ;CHECK IF CHAR IS FF
JRST LODFDA ;NO. CONTINUE READING FIELD
TRNE OF,@OPT2(T1) ;CHECK IF REPLACING THIS FIELD
PUSHJ P,NEXT-1 ;YES. GET REPLACEMENT FIELD
MOVEI CH,EDITO ;SET UP EDIT OUTPUT CHANNEL
MOVEI C,FF ;OUTPUT A FF
PUSHJ P,CHROUT ;TO EDIT FILE
POP P,T2 ;RESTORE T2
PUSHJ P,EDTEND ;WRITE REST OF FILE AND RENAME
POP P,T1 ;RESTORE T1
POPJ P, ;RETURN
SUBTTL APPEND ROUTINE
COMMENT/
Append an entry to the data file writing to the data file output
channel.
/
;
APPEND: TRNE F,FLFAIL ;SEE IF FILE THERE
JRST NOTTHR ;NO. GO TELL NOT THERE
PUSHJ P,UPDTIO ;OPEN, LOOKUP, AND ENTER DATA FILE
MOVEM BK,STBKFF ;STORE LAST BLOCK AS STARTING FF BLOCK
USETI DATCHI,(BK) ;READ LAST BLOCK OF FILE
MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
PUSHJ P,GETBF ;GET LAST BLOCK
JRST ILFORM ;SHOULD NOT GET HERE (EOF)
SOJ BK, ;RESTORE BLOCK COUNT
USETO DATCHO,(BK) ;WRITE LAST BLOCK OF FILE
MOVEI T1,DATCHO ;OUTPUT GOES TO DATA FILE
MOVEM T1,OUTCHN
SETO A, ;COPY UNTIL EOF
PUSHJ P,COPBLK ;READ AND WRITE LAST BLOCK UNTIL EOF
PUSHJ P,INSENT ;APPEND A NEW ENTRY
CLOSE DATCHO, ;CLOSE DATA FILE OUTPUT CHANNEL
MOVE BK,STBKFF ;GET OLD EOF POSITION
PUSHJ P,RESPOS ;POSITION AT OLD EOF
TRZ F,FEOF ;TURN OFF EOF FLAG
JRST COMMND ;GO GET NEXT COMMAND
SUBTTL INSERT ROUTINE
COMMENT/
Insert and entry in the data file before the current entry writing to
the data file output channel.
/
;
INSERT: MOVEI T1,DATCHO ;OUTPUT GOES TO DATA FILE
MOVEM T1,OUTCHN
TRNE F,FLFAIL ;CHECK IF FILE EXISTS
JRST CREATE ;NO. GO CREATE IT
SKIPG STBKFF ;SKIP IF NOT ON FIRST BLOCK
JRST FIRINS ;GO TO SPECIAL ROUTINE FOR FIRST BLOCK
TRNE F,FEOF ;CHECK IF AT EOF
JRST ERROR ;YES. ILLEGAL COMMAND
PUSHJ P,UPDTIO ;OPEN, LOOKUP, AND ENTER DATA FILE
MOVE BK,STBKFF ;GET BLOCK OF STARTING FF
USETI DATCHI,(BK) ;POINT TO THAT BLOCK FOR INPUT
MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
PUSHJ P,GETBF ;GET BLOCK OF LAST FF
JRST ILFORM ;SHOULD NOT GET HERE (EOF)
SOJ BK, ;RESTORE BLOCK COUNT
USETO DATCHO,(BK) ;POINT TO BLOCK OF STARTING FF FOR OUT
MOVE A,STBFFF ;LOAD BUFFER POS OF START OF ENTRY
PUSHJ P,COPBLK ;COPY BLOCK UP TO START OF ENTRY
PUSHJ P,INSENT ;INSERT A NEW ENTRY
PUSHJ P,WRTEND ;COPY THE REST OF THE FILE
CLOSE DATCHO, ;CLOSE DATA FILE OUTPUT CHANNEL
MOVE BK,STBKFF ;LOAD POS OF STARTING FF
PUSHJ P,RESPOS ;RESTORE THERE
JRST COMMND ;GET NEXT COMMAND
FIRINS: PUSHJ P,UPDTIO ;OPEN, LOOKUP, AND ENTER DATA FILE
PUSHJ P,REWDAT ;REWIND THE DATA FILE ON INPUT CHANNEL
PUSHJ P,INSENT ;INSERT AN ENTRY AT START OF FILE
PUSHJ P,WRTEND ;COPY REST OF FILE
CLOSE DATCHO, ;CLOSE DATA FILE FOR OUTPUT
PUSHJ P,REWDAT ;REWIND THE DATA FILE AGAIN
JRST COMMND ;GET NEXT COMMAND
CREATE: MOVE T1,DFILE ;LOAD FILE NAME
HLLZ T2,DFILE+1
SETZB T3,T4 ;DEFAULTS
MOVEI CH,DATCHO ;SET UP DATA FILE OUTPUT CHANNEL
PUSHJ P,ENTFIL ;ENTER FILE
PUSHJ P,INSENT ;INSERT FIRST ENTRY
CLOSE DATCHO, ;CLOSE OUTPUT CHANNEL TO DATA FILE
MOVE T1,DFILE ;LOAD FILE NAME
HLLZ T2,DFILE+1
SETZB T3,T4 ;DEFAULTS
MOVEI CH,DATCHI ;SET UP DATA FILE INPUT CHANNEL
PUSHJ P,LOKFIL ;LOOKUP DATA FILE ON INPUT CHANNEL
JRST ILFORM ;IMPOSSIBLE (NOT FOUND)
TRZ F,FLFAIL ;TURN OFF LOOKUP FAILED FLAG
JRST COMMND ;GET NEXT COMMAND
SUBTTL PURE AREA
;
STKSET: IOWD STAKSZ,PDSTK ;SET UP STACK
CODES: ASCIZ/.A:/ ;AUTHOR
ASCIZ/.T:/ ;TITLE
ASCIZ/.R:/ ;REFERENCE
ASCIZ/.S:/ ;SUMMARY
CMD1: EXP "A","B","D","E","F","H","N","I","K","P","R","S","T"
;LIST OF COMMANDS
CMDLG==.-CMD1 ;GET NUMBER OF COMMANDS
CMD2: EXP APPEND,BEGIN,DUMP,LEAVE,FIND ;COMMAND ROUTINES
EXP HELP,INPNAM,INSERT,KILL,PAGE,REPLAC,SEARCH,TYPE
OPT1: EXP "A","T","R","S" ;LIST OF ARGUMENTS
OPTLG==.-OPT1 ;GET NUMBER OF OPTIONS
OPT2: EXP 1,2,4,10 ;FLAG VALUES OF ARGS
DEL1: EXP LF,FF,CR,CONZ ;THESE DELIMS MEAN EOL
DELG==.-DEL1-1 ;GET NUMBER OF EOL DELIMS
EXP HT,VT,SPACE ;JUST IGNORE THESE DELIMS
DELLG==.-DEL1 ;GET TOTAL NUMBER OF DELIMS
QUEST: EXP AQ,TQ,RQ,SQ ;POINTERS TO QUESTIONS
AQ: ASCIZ/
Enter author(s):
---------------
/
TQ: ASCIZ/
Enter title of work:
-------------------
/
RQ: ASCIZ/
Enter page and publication references to the work:
-----------------------------------------------
/
SQ: ASCIZ/
Enter a summary - abstract of the work:
--------------------------------------
/
FILPTR: POINT 6,DFILE ;POINTER TO FILE NAME
EXTPTR: POINT 6,DFILE+1 ;POINTER TO FILE EXTENSION
BSTPTR: POINT 7,STRING ;POINTER TO BEGINNING OF STRING
TTYPTR: POINT 7,TTYBUF ;POINTER TO TTY BUFFER
INSPTR: POINT 4,I,12 ;POINTER TO DEPOSIT CHAN IN INST
;
END START