.TITLE HEWLETT-PACKARD EDITOR (HPE) .IDENT /X001/ .PAGE .SBTTL TITLE PAGE ;HEWLETT-PACKARD EDITOR (HPE) ;THE HP2640A TERMINAL HAS IT'S OWN ;EDITOR WITH APPROX. 4K BYTES MEMORY. THIS ;EDITOR WILL ONLY OPERATE WHEN THE TERMINAL ;IS IN BLOCK MODE. THE FOLLOWING PROGRAM ;WILL TRANSMIT OR RETRIEVE DATA TO ;OR FROM THE SYSTEM DISC IN BLOCK MODE. ; ; ;THIS PROGRAM WAS WRITTEN BY: ; PETER HANSCHKE ; OCTOBER 1976 ; ; REVISED MAY 1977 ; ; AECL, CHALK RIVER ONTARIO ; ; ;The user of this program has the choice of ;seven different commands to use. These commands ;are invoked by depressing one of the function ;keys or the enter key on the terminal. The ;following is a table of what keys are valid along ;with their corresponding descriptions: ; ; f1: This command issues an immediate ; stop to the execution of HPE. A ; message is displayed on the screen, ; the files are closed and control is ; passed to MCR. The code for this ; command is an ESC p. ; ; f2: This command is a convenience feature. ; It causes the data on the screen to ; be transmitted to the output file, as ; normal, but then the rest of the input ; file if transferred to the output file ; without using any QIO's. Upon completion ; control is transferred to MCR. This is ; primarily used for making one edit in the ; file. The code generated is an ESC q. ; ; f3: This command will transfer data on the ; screen to the output file and will ; erase the screen upon completion of this ; transfer. It will generate an ESC r code. ; ; f4: This command transfers a block of data ; from the input file to the terminal. Code ; generated is an ESC s. ; ; f5: This command invokes subroutine SEARCH. The ; user types a phrase on the terminal and ; depresses the enter key to start the searching ; process. F4 generates an ESC t code. ; ; f8: This command produces a program restart. ; it will delete the newly created version ; of the output file, type a message and return ; with the HPE prompt. The code is an ESC w. ; ;The rest of the function keys (f6 and f7) are ;considered invalid commands by HPE. ; ; ENTER: This is the command that does the normal ; operation of HPE. The data on the screen is ; transferred to the output file and another diplay ; full is retrieved from the input file. If no ; more records are to be displayed, HPE will close ; the files and pass control to MCR. ; ;Any other key generates an invalid command code. HPE ;will warn the user and wait for another command. Three ;chances are awarded to enter a correct command, then ;control is passed to MCR. .PAGE .SBTTL MACRO DEFINITIONS ;SYSTEM MACROS USED IN THIS PROGRAM .MCALL FSRSZ$,FDRC$A,CSI$,QIOW$,DELET$ .MCALL GCMLB$,NMBLK$,FDBDF$,FDAT$A .MCALL CSI$2,FINIT$,CLOSE$,EXIT$S,GCML$ .MCALL CSI$1,DIR$,OFNB$,CSI$SW,CSI$ND,CSI$SV .MCALL GET$S,QIO$,PUT$S,WTSE$,MRKT$,RDEF$ ;MACRO USED TO SET UP AND SEND MESSAGES TO THE ; TERMINAL .MACRO DFNMSG,ARG1,ARG2,ARG3 MOVB ARG1,SENBUF MOVB ARG2,SENBUF+1. MOVB ARG3,SENBUF+2. CALL SENMSG .ENDM DFNMSG ;MACRO TO CALL A SUBROUTINE .MACRO CALL,SUBR JSR PC,SUBR .ENDM CALL ;MACRO TO RETURN FROM A SUBROUTINE .MACRO RETURN RTS PC .ENDM RETURN ;MACRO TO SET UP A MEASSAGE FOR TYPING .MACRO TYPE,MSG .CSECT TYPMSG TMP1=. .ASCII /MSG/ TMP2=.-TMP1 .CSECT BLKEDI JSR R1,TYPE .WORD TMP1,TMP2 .ENDM TYPE .PAGE .SBTTL SWITCH AND FILE DEFINITIONS FSRSZ$ 3 ;MAX NUMBER OF FILES .PSECT BLKEDI CSI$ .EVEN CSIBLK: .BLKB C.SIZE CMLBLK: GCMLB$ ,HPE,,5 ;FILE DEFINITIONS FDBTBS: .WORD INNMB,INFDB .WORD OUTNMB,OUTFDB FDBTBL: OUTNMB: NMBLK$ ,,,SY,0 INNMB: NMBLK$ ,,,SY,0 ;OUTPUT FILE OUTFDB: FDBDF$ ;CREATES FDB FDAT$A R.VAR,FD.CR ;INITIALIZES FILE ATTRIBUTE SECTION FDOP$A 3 ;INITIALIZES FILE OPEN SECTION FDRC$A ,RECBUF,200. ;INITIALIZES RECORD ACCESS SECTION ;INPUT FILE INFDB: FDBDF$ ;CREATES FDB FDOP$A 2 ;INITIALIZES FILE OPEN SECTION FDAT$A R.VAR ;INITIALIZES FILE ATTRIBUTE SECTION FDRC$A ,RECBUF,200. ;INITIALIZES RECORD ACCESS SECTION ;SWITCH DEFINITIONS NLMSK =1 SRMSK =2 SWTAB: CSI$SW NL,NLMSK,,,,NLSYM ;CREATE SWITCH DESCRIPTOR CSI$SW SR,SRMSK CSI$ND ; TABLE ENTRY NLSYM: CSI$SV DECIMAL,NLVAL,2 ;CREATE SWITCH VALUE CSI$ND ; DESCRIPTOR TABLE ENTRY .PAGE .SBTTL QIO'S ;QIO'S USED IN THIS PROGRAM ; ;FORMAT: ; QIO(W)$ FNC,LUN,EFN,PRI,IOST,AST, ; W INDICATES WAIT ; FNC= I-O FUNCTION CODE ; IO.WVB: WRITE VIRTUAL BLOCK ; IO.RVB: READ VIRTUAL BLOCK ; IO.ATT: ATTACH DEVICE ; IO.DET: DETACH DEVICE ; SPECIAL FUNCTION CODES PASALL =8. ;PASS ALL SPECIAL CHARACTERS NOECHO =16. ;DO NOT ECHO CHARACTERS INPUT FROM THE ; TERMINAL (READ ONLY) ; LUN= LOGICAL UNIT NUMBER TTY =5 ; EFN= EVENT FLAG NUMBER RDEFN =1 ;EVENT FLAG NUMBER FOR READS WRTEFN =2 ;EVENT FLAG NUMBER FOR WRITES NOEFN =0 ;NO EVENT FLAG SPECIFIED ATTEFN =3 ;EVENT FLAG FOR ATTACHING AND DETACHING ; PRI= PRIORITY ; IOST= ADDRESS OF I-O STATUS BLOCK ; QIO WILL RETURN COMPLETION CODE ; +1 INDICATES SUCCESS ; AST= ADDRESS OF I-O DONE AST ENTRY POINT ; PRMLST= PARAMETER LIST ; FORMAT: ; ARG1: STARTING ADDRESS OF BUFFER ; ARG2: SIZE OF BUFFER (IN BYTES) ; ARG3: VERTICAL FORMAT CHARACTER SS =40 ;SINGLE SPACE NULL =00 ;NO VFC NOLF =53 ;NO LF OUTREC: QIOW$ IO.WVB,TTY,WRTEFN,,IOSTBL,, INREC: QIOW$ IO.RVB!TF.RAL!TF.RNE!TF.TMO,TTY,RDEFN,,IOSTBL,, MSGREC: QIOW$ IO.WVB+PASALL,TTY,WRTEFN,,IOSTBL,, STATUS: QIOW$ IO.RVB+NOECHO+PASALL,TTY,RDEFN,,,, ERRREC: QIOW$ IO.WVB,TTY,WRTEFN,,,, ATTACH: QIOW$ IO.ATT,TTY,ATTEFN,,IOSTBL DETACH: QIOW$ IO.DET,TTY,ATTEFN ;QIO CALLS ARE PERFORMED IN THE FOLLOWING MANNER ; DIR$ #NAME ; NAME IS THE LABEL OF THAT PARTICULAR QIO .PAGE .SBTTL ****HPE**** .ENABL LSB ;PROGRAM RESTART SYSWT: MOV SAVSP,SP ;RESTORE STACK POINTER AND CALL ENDST ;INSURE THAT BLOCK MODE AND ; AUTO LINE FEED ARE DISABLED BR RSTART ;RESTART PROGRAM .PAGE .SBTTL MAIN LOOP .ENABL LSB HPE: FINIT$ MOV SP,SAVSP ;SAVE STACK POINTER RSTART: MOVB OFF,SEQFLG CALL CSI1 ;OPEN FILES TYPE DIR$ #MARK4 ;ISSUE MARK TIME FOR HPE TIME OUT CALL BLKMD ;WAIT FOR ENABLING OF BLOCK MODE CMPB ON,SEQFLG ;SEARCHING REQUESTED? BEQ 5$ ;YES! CALL GETREC ;GET RECORDS FROM INPUT FILE ; RESUME: BICB #SRMSK,CSIBLK+C.MKW1 CLR COUNT ;INITIALIZE COMMAND ENTER COUNTER CALL COMPR ;PROCESS COMMANDS CMPB ON,SEQFLG ;SEARCHING REQUESTED? BEQ 5$ ;YES!! CMPB ON,F4FLAG ;WAS F4 COMMAND ISSUED? BEQ RESUME ;YES!! CALL SETUP ;SETUP TERMINAL TO INSURE PROPER TRANSMITTAL CMPB ON,LFFLAG ;AUTO LINE FEED ON? BEQ 1$ ;YES!! CALL FIRSRD ;NO!! READ THE FIRST LINE 1$: CALL PUTREC ;PUTREC RECORDS FROM TERMINAL TO FILE CMPB F2FLAG,ON ;"QIO SUPRESSING" FLAG ON?? BEQ 2$ ;YES!!! CMPB F3FLAG,ON ;"EXTEND FILE" FLAG ON?? BEQ 4$ ;YES!!! CALL SETTER ;SET UP TERMINAL FOR DISPLAYING RECORDS CLR LCOUNT ;INITIALIZE LINE COUNTER CALL GETREC ;GET NEXT RECORD FROM FILE BR RESUME ;LOOP UNTIL EOF ; 2$: CMPB F1FLAG,ON ;ONLY ONE FILE SPECIFIED? BNE 3$ ;NO, DO THE PUTS AND GETS DFNMSG ESC,EEE,#0 ;RESET TERMINAL JMP STOP ;YES 3$: JMP NOQIO ;TRANSFER REST OF INPUT FILE TO OUTPUT ; 4$: CALL SETTER ;RESET TERMINAL AND SET THE TABS MOVB OFF,F3FLAG ;TURN "EXTEND FILE" FLAG OFF JMP RESUME ; 5$: CALL SEARCH ;SEARCH FOR A PHRASE JMP RESUME ; STOP: TYPE QUIT1: CALL ENDST ;MAKE SURE BLOCK MODE AND AUTO LF IS OFF CLOSE$ #INFDB ;CLOSE FILES CLOSE$ #OUTFDB DIR$ #DETACH ;DETACH TERMINAL EXIT$S .DSABL LSB .PAGE .SBTTL BLKMD --- CHECK FOR BLOCK MODE ;SUBROUTINE TO CHECK FOR BLOCK MODE KEY .ENABL LSB BLKMD: DIR$ #RDEF4 ;HPE TIMES OUT AFTER 60 SEC. TST @#0 ;TEST DSW FOR COMPLETION CODE BNE SYSWT ;BRANCH IF FLAG4 NOT SET DFNMSG ESC,ARROW,DC1 ;REQUEST TERMINAL STATUS CALL STATST ;CHECK STATUS BEQ BLKMD ;LOOP UNTIL BLOCK MODE IS ENABLED DIR$ #ATTACH ;ATTACH TERMINAL TSTB IOSTBL BGT 1$ ;ERROR CALL QIOERR TYPE < ERROR OCCURED DURING ATTACH> TYPE < DISABLE BLOCK MODE AND AUTO LINE FEED> DELET$ #OUTFDB ;DELETE NEWLY CREATED OUTPUT FILE CLOSE$ #INFDB JMP SYSWT ;ATTACHED! 1$: CALL SETTER ;SET UP TERMINAL FOR DISPLAYING RECORDS CLR LCOUNT ;INITIALIZE LINE COUNTER 2$: RETURN .DSABL LSB MARK4: MRKT$ 4,60.,2 RDEF4: RDEF$ 4 .PAGE .SBTTL GETREC --- GET RECORDS FROM INPUT FILE ;ROUTINE TO GET RECORDS FROM FILE .ENABL LSB GETREC: CMPB F1FLAG,ON ;HAS ONLY ONE FILE BEEN SPECIFIED??? BEQ 4$ ;YES!!! ;GET A RECORD 1$: MOV #RECBUF,R1 MOV #INFDB,R0 ;GET A RECORD FROM THE INPUT FILE AND GET$S R0,,,ERRRTN ; PLACE IT IN RECBUF TSTB F.NRBD(R0) ;CHECK FOR NULL LINE BNE 2$ MOVB SPACE,RECBUF ;MOVE A SPACE INTO THE FIRST BYTE OF RECBUF INC F.NRBD(R0) 2$: MOV F.NRBD(R0),OUTREC+Q.IOPL+2 ;PLACE LENGTH OF RECORD IN QIO TSTB LCOUNT ;IS THIS THE FIRST LINE?? BEQ 6$ ;YES!! ;DISPLAY RECORD ON TERMINAL MOV #SS,OUTREC+Q.IOPL+4 ;PLACE VFC IN QIO 3$: DIR$ #OUTREC ;DISPLAY THAT RECORD ON TERMINAL TSTB IOSTBL ;SUCCESSFUL?? BMI 5$ ;NO!! ;TEST FOR ACKNOWLEDGE DFNMSG #0,#0,ENQ ;SEND ENQUIRE TO TERMINAL (^E) 35$: MOV #1,INREC+Q.IOPL+2 ;ASK FOR ONE CHARACTER DIR$ #INREC ;WAIT FOR REPLY TSTB IOSTBL ;ERROR?? BMI 5$ ;YES!! 37$: CMPB LF,RECBUF ;AUTO LINE FEED ON? BEQ 35$ ;YES!! CMPB #ACK,RECBUF ;TEST FOR ACKNOWLEDGE BMI 5$ ;ERROR ; ; INCB LCOUNT ;INCREMENT LINE COUNTER CMPB LCOUNT,NLVAL ;NUMBER OF LINES DISPLAYED = THAT SPECIFIED?? BNE 1$ ;NO!!! DFNMSG LF,RS,CR ;SEND A RS 4$: RETURN ;YES!!! ;ERROR 5$: TSTB IOSTBL BEQ 37$ INCB IOSTBL CALL QIOERR TYPE < ERROR OCCURED DURING QIO WRITE> TYPE < DISABLE BLOCK MODE AND AUTO LINE FEED> DELET$ #OUTFDB CLOSE$ #INFDB DIR$ #DETACH JMP SYSWT ; 6$: MOV #NOLF,OUTREC+Q.IOPL+4 ;PLACE VFC IN QIO JMP 3$ .DSABL LSB .PAGE .SBTTL COMPR --- PROCESS COMMANDS ;SUBROUTINE THAT ACCEPTS INPUT FROM TERMINAL, CHECKS ON THE VALIDITY ; OF THAT INPUT AND DETERMINES WHETHER AUTO LF IS ENABLED .ENABL LSB COMPR: CMPB F1FLAG,ON ;HAS ONLY ONE FILE BEEN SPECIFIED??? BNE 1$ ;NO!!! TYPE ; ;READ AND TEST COMMAND ; 1$: MOVB OFF,F4FLAG CALL READ1 ;READ A COMMAND MOV #CMDBUF,R4 ;USE R4 AS A POINTER CMPB (R4),LF ;FIRST BYTE LF?? BNE 2$ ;NO!! INC R4 ;INCREMENT POINTER 2$: CMPB (R4),ESC ;FIRST CHARACTER ESC?? BEQ 7$ ;YES!! CMPB (R4),ENTER ;FIRST CHARACTER ENTER (DC2)?? BEQ 4$ ;YES!! ; WRONG: TYPE INC COUNT ;INCREMENT MAXIMUM TRY COUNTER CMPB COUNT,MAXTRY ;COUNTER=3?? BEQ 3$ ;YES!!! PRINT NASTY MESSAGE BR 1$ ;NO!! WAIT FOR ANOTHER COMMAND 3$: DELET$ #OUTFDB ;DELETE NEWLY CREATED OUTPUT FILE CLOSE$ #INFDB JMP ABQUIT ;CHECK FOR AUTO LINE FEED 4$: DFNMSG ESC,ARROW,DC1 ;REQUEST TERMINAL STATUS DIR$ #STATUS CMPB TTSTAT,LF ;AUTO LF ON?? BEQ 5$ ;YES!!! MOVB OFF,LFFLAG ;SET LINE FEED FLAG APPROPRIATELY BR 65$ 5$: MOVB ON,LFFLAG 65$: RETURN ; ;DECIPHER ESCAPE SEQUENCES ; 7$: INC R4 ;INCREMENT POINTER CMPB (R4),PEE ;COMMAND ISSUED AN ESC P?? BEQ 8$ ;YES!!! CMPB (R4),QUEUE ;COMMAND ISSUED AN ESC Q?? BEQ 9$ ;YES!!! CMPB (R4),AAR ;COMMAND ISSUED AN ESC R??? BEQ 11$ ;YES!!! CMPB (R4),DOUBLU ;COMMAND ISSUED AN ESC W?? BEQ 10$ ;YES!!! CMPB (R4),T ;COMMAND ISSUED AN ESC T?? BEQ 13$ ;YES!! CMPB (R4),S ;COMMAND ISSUED AN ESC S?? BEQ 85$ ;YES!! JMP WRONG ;IF COMMAND ILLEGAL THEN WARN USER AND WAIT ;F1 8$: JMP STOP ; 85$: JMP 16$ ;F2 9$: MOVB ON,F2FLAG ;TURN "QIO SUPRESSING" FLAG ON BR 4$ ;F8 10$: DELET$ #OUTFDB ;DELETE NEWLY CREATED VERSION CLOSE$ #INFDB DFNMSG ESC,EEE,#0 ;RESET TERMINAL DFNMSG ESC,EMM,#0 ;TURN MEMORY LOCK OFF DFNMSG ESC,R,#0 ;TURN INSERT CHARACTER KEY OFF TYPE DIR$ #DETACH ;DETACH TERMINAL JMP SYSWT ;F3 11$: MOVB ON,F3FLAG BR 4$ ;ERROR 12$: CALL QIOERR TYPE < ERROR OCCURED DURING ATTACH> TYPE < DISABLE BLOCK MODE AND AUTO LINE FEED> DELET$ #OUTFDB CLOSE$ #INFDB DIR$ #DETACH JMP SYSWT ;F5 13$: MOVB ON,SEQFLG CALL SETUP ;SET TERMINAL FOR PROPER TRANSMITTAL DFNMSG ESC,ARROW,DC1 ;REQUEST TERMINAL STATUS DIR$ #STATUS CMPB TTSTAT,LF ;AUTO LINE FEED ON?? BEQ 14$ ;YES! MOVB OFF,LFFLAG CALL FIRSRD JMP 15$ ; 14$: MOVB ON,LFFLAG 15$: CALL PUTREC ;SEND DATA FROM SCREEN TO FILE DFNMSG ESC,H,#0 ;HOME CURSOR DFNMSG ESC,J,#0 ;CLEAR DISPLAY JMP 65$ ;F4 16$: CALL SETTER ;CLEAR DISPLAY AND SET TABS CLR LCOUNT ;INITIALIZE LINE COUNTER CALL GETREC ;GET RECORDS FROM INPUT FILE MOVB ON,F4FLAG JMP 65$ .DSABL LSB .PAGE .SBTTL PUTREC --- PUT RECORDS IN THE OUTPUT FILE ;SUBROUTINE TO SEND DATA FROM THE TERMINAL TO THE ; OUTPUT FILE .ENABL LSB PUTREC: DFNMSG ESC,DEE,DC1 ;ASK FOR ONE LINE OF DATA MOV #OUTFDB,R0 MOVB MAXLEN,INREC+Q.IOPL+2 DIR$ #INREC ;READ DATA INTO RECBUF TSTB IOSTBL ;SUCCESSFUL?? BMI 8$ ;NO!!! 10$: CMPB #2,IOSTBL ;DID QIO TIME OUT?? BNE 9$ ;NO!! DEC IOSTBL+2 ;YES!! MOV IOSTBL+2,R5 MOVB #45,RECBUF(R5) ;PLACE '%$' IN RECBUF AND CONTINUE WITH INC R5 ; DATA TRANSFER MOVB #44,RECBUF(R5) ; ---THIS WILL LET THE USER KNOW INC R5 ; THAT THE QIO READ TIMED OUT MOVB CR,RECBUF(R5) INC R5 MOV R5,IOSTBL+2 9$: CMPB LFFLAG,ON BEQ 1$ CMPB RECBUF,RS ;FIRST CHARACTER A RS?? BR 2$ 1$: CMPB RECBUF+1.,RS 2$: BNE 4$ ;NO! CONTINUE WITH THIS SUBROUTINE DFNMSG ESC,BEE,#0 ;ENABLE KEYBOARD RETURN ; 4$: DEC IOSTBL+2. ;STRIP OFF LAST CHARACTER (IE CR) CMPB LFFLAG,ON ;AUTO LINE FEED FLAG ON?? BEQ 5$ ;YES!! PUT$S R0,,IOSTBL+2.,ERRRTN ;PUT RECORD FROM RECBUF INTO FILE BR 6$ 5$: DEC IOSTBL+2. PUT$S R0,#RECBUF+1,IOSTBL+2.,ERRRTN 6$: CMPB LFFLAG,ON ;AUTO LINE FEED ON?? BEQ 7$ ;YES!! DFNMSG ESC,ESS,#0 ;NO!!! PUTREC MESSAGE TO ROLL UP DISPLAY 7$: JMP PUTREC ;LOOP UNTIL RS ;ERROR 8$: CALL QIOERR TYPE < ERROR OCCURED DURING QIO READ> JMP ABQUIT .DSABL LSB MARK: MRKT$ 5,3,2 WAIT5: WTSE$ 5 .PAGE .SBTTL SEARCH --- SEARCHING SUBROUTINE ;SUBROUTINE THAT SEARCHES FOR A USER SPECIFIED PHRASE .ENABL LSB SEARCH: TYPE ; ;READ PHRASE FROM TERMINAL INTO RECBUF ; 1$: CALL READ1 ;READ COMMAND MOV #CMDBUF,R4 ;R4 POINTER INTO CMDBUF CMPB (R4),LF ;AUTO LINE FEED ON?? BNE 2$ ;NO!! MOVB ON,LFFLAG ADD #1,R4 2$: CMPB (R4),ENTER ;COMMAND ENTERED DC2?? BEQ 3$ ;YES!! TYPE JMP 1$ 3$: DFNMSG ESC,H,#0 ;HOME CURSOR DFNMSG ESC,CEE,#0 ;DISABLE KEYBOARD DFNMSG ESC,DEE,DC1 ;ASK FOR ONE LINE OF DATA MOVB MAXLEN,INREC+Q.IOPL+2 DIR$ #INREC ;READ INTO RECBUF TSTB IOSTBL ;ERROR?? BMI 9$ ;YES!! MOV IOSTBL+2,PHRSIZ SUB #1,PHRSIZ TYPE ;TRANSFER CONTENTS OF RECBUF INTO PHRASE CLR R4 CMPB ON,LFFLAG BNE 4$ MOV #1,R5 SUB #1,PHRSIZ BR 5$ 4$: CLR R5 5$: MOVB RECBUF(R5),PHRASE(R4) INC R4 INC R5 CMP R5,PHRSIZ BLOS 5$ ; ;GET RECORDS FROM FILE AND LOOK FOR A MATCH ; 6$: MOV #INFDB,R0 MOV #RECBUF,R1 GET$S R0,,,ERRRTN ;GET RECORD AND PLACE IT IN RECBUF MOV F.NRBD(R0),RECSIZ CMP RECSIZ,PHRSIZ BLT 8$ BEQ 10$ ; ;EXECUTE ONLY IF SIZE OF PHRASE < SIZE OF RECBUF ; MOV RECSIZ,ENDCMP ;CALCULATE POINT IN RECBUF ADD #1,ENDCMP ;WHERE COMPARISONS NO LONGER SUB PHRSIZ,ENDCMP ;MAKE ANY SENSE CLR R4 ;POINTER INTO PHRASE CLR R5 ;POINTER INTO RECBUF 7$: CMPB PHRASE(R4),RECBUF(R5) ;COMPARE BYTE BY BYTE BEQ 13$ ;BRANCH IF A BYTE MATCHES ADD #1,R5 CMP R4,#0 ;BRANCH IF R4>0 IMPLIES BGT 14$ ; NO PHRASE MATCH CMP R5,ENDCMP ;CONTINUE UNTIL END OF RECBUF BLT 7$ ; ;EXECUTE IF SIZE OF PHRASE > SIZE OF RECBUF OR PHRASE IS ; NOT IN RECBUF ; 8$: MOV #OUTFDB,R2 PUT$S R2,#RECBUF,RECSIZ,ERRRTN ;PLACE RECORD BACK IN FILE JMP 6$ ; 9$: JMP 15$ ; ;EXECUTE IF SIZE OF PHRASE = SIZE OF RECBUF ; 10$: CLR R4 11$: CMPB PHRASE(R4),RECBUF(R4) ;COMPARE BYTE BY BYTE BNE 8$ ;NO MATCH ADD #1,R4 CMP R4,PHRSIZ ;CONTINUE UNTIL END OF PHRASE BLT 11$ ;* * * P H R A S E M A T C H * * * 12$: CALL SETTER ;RESET TERMINAL, SET TABS, HOME CURSOR MOV RECSIZ,OUTREC+Q.IOPL+2 MOV #NOLF,OUTREC+Q.IOPL+4 DIR$ #OUTREC ;DISPLAY THAT LINE TSTB IOSTBL ;ERROR?? BMI 15$ ;YES!! MOV #1,LCOUNT ;INITIALIZE LINE COUNTER MOVB OFF,SEQFLG DFNMSG ESC,BEE,#0 ;ENABLE TERMINAL CALL GETREC RETURN ; ;DETERMINE A PHRASE MATCH IN RECBUF ; 13$: ADD #1,R5 ADD #1,R4 CMP R4,PHRSIZ BLT 7$ JMP 12$ ;MATCH!!!! ; ; 14$: CLR R4 JMP 7$ 15$: CALL QIOERR TYPE < ERROR OCCURED DURING QIO > JMP SEARCH .DSABL LSB .PAGE .SBTTL ERROR SUBROUTINES ;THIS SUBROUTINE ; WILL PRINT THE IO.ERR CODE ON THE TERMINAL. (FOR MEANING ; OF CODE SEE I-O OPERATIONS MANUAL) QIOERR: MOV #IOERT,R0 MOVB IOSTBL,R1 CLR R2 ;SUPPRESS LEADING ZEROES CALL $CBDSG DIR$ #ERRREC RETURN ;SUBROUTINE TO TEST FOR EOF DURING GET OPERATION ; IF ERROR IS NOT EOF, THIS ROUTINE WILL TYPE ERROR CODE .ENABL LSB ERRRTN: CMPB F.ERR(R0),#-10. ;ERROR RETURNED=-10?? BEQ 1$ ;YES!!! MOVB F.ERR(R0),R1 MOV #IOERT,R0 CLR R2 CALL $CBDSG ;CONVERT TO SIGNED DECIMAL TYPE DIR$ #ERRREC JMP ABQUIT ; 1$: CMPB F2FLAG,ON BEQ 2$ CMPB ON,SEQFLG ;STILL SEARCHING? BEQ 3$ ;YES!! TSTB LCOUNT ;ARE WE AT THE TOP OF A NEW BLOCK?? BEQ 2$ ;YES!!! JMP RESUME ;NO!! ; 2$: JMP STOP ; 3$: DFNMSG ESC,EEE,#0 TYPE TYPE < DISABLE BLOCK MODE AND AUTO LINE FEED.> BITB #SRMSK,CSIBLK+C.MKW1 ;WAS SEARCH INVOKED BY SWITCH? BEQ 4$ ;NO!! DELET$ #OUTFDB ;YES!! CLOSE$ #INFDB JMP 5$ 4$: CLOSE$ #OUTFDB ;CLOSE INPUT AND OUTPUT FILES CLOSE$ #INFDB 5$: DIR$ #DETACH DFNMSG ESC,BEE,#0 ;ENABLE KEYBOARD JMP SYSWT .DSABL LSB .PAGE .SBTTL MISCELLANEOUS SUBROUTINES ;ABNORMAL QUIT ROUTINE ABQUIT: TYPE TYPE < DISABLE BLOCK MODE AND AUTO LINE FEED.> DFNMSG ESC,BEE,#0 ;ENABLE KEYBOARD QUIT: CLOSE$ #CMLBLK JMP QUIT1 ;SUBROUTINE TO SEND A MESSAGE TO THE TERMINAL SENMSG: DIR$ #MSGREC TSTB IOSTBL BMI 2$ 1$: RETURN 2$: CALL QIOERR JMP 1$ ;SUBROUTINE TO CHECK THE STATUS OF THE TERMINAL .ENABL LSB STATST: DIR$ #STATUS CMPB LF,TTSTAT ;AUTO LINE FEED ON?? BEQ 1$ ;YES!! BITB BIT2,TTSTAT+5. ;CHECK TO SEE IF BLOCK MODE KEY BR 2$ ; HAS BEEN TURNED ON 1$: BITB BIT2,TTSTAT+6. 2$: RETURN .DSABL LSB ;SUBROUTINE THAT CHECKS FOR THE TURNING ; OFF OF BLOCK MODE AND AUTO LF .ENABL LSB ENDST: DFNMSG ESC,ARROW,DC1 ;REQUEST TERMINAL STATUS DIR$ #STATUS ;READ STATUS CMPB LF,TTSTAT ;AUTO LINE FEED ON?? BEQ 1$ ;YES!! BITB BIT2,TTSTAT+5 ;BLOCK MODE STILL ON?? BNE ENDST ;YES!! BR 2$ ;NO!! 1$: BITB BIT2,TTSTAT+6 ;BLOCK MODE STILL ON?? BNE ENDST ;YES!! 2$: CMPB LF,TTSTAT ;AUTO LINE FEED STILL ON?? BEQ ENDST ;YES!! RETURN .DSABL LSB ;SUBROUTINE THAT TYPES MESSAGES ON THE TERMINAL .ENABL LSB TYPE: MOV #TYPDPB+Q.IOPL,R0 ;DPB PARMS MOV (R1)+,(R0)+ ;ADDRESS MOV (R1)+,(R0)+ ;LENGTH DIR$ #TYPDPB TSTB IOSTBL ;SUCCESSFUL? BMI 1$ ;NO!! RTS R1 1$: CALL QIOERR JMP QUIT TYPDPB: QIOW$ IO.WVB,TTY,WRTEFN,,IOSTBL,,<.-.,.-.,SS> ;SUBROUTINE THAT READS FROM A TERMINAL READ1: MOV #CMDBUF,R1 MOV #RDDPB+Q.IOPL,R0 ;DPB PARMS MOV R1,(R0)+ ;ADDRESS DIR$ #RDDPB TSTB IOSTBL ;SUCCESSFUL? BMI 2$ ;NO!! RETURN 2$: CALL QIOERR TYPE < ERROR OCCURED DURING READ> JMP STOP RDDPB: QIOW$ IO.RVB+NOECHO+PASALL,TTY,RDEFN,,IOSTBL,,<.-.,10.> .DSABL LSB ;SUBROUTINE TO READ THE FIRST LINE, IF TERMINAL ; HAS AUTO LINE FEED OFF .ENABL LSB FIRSRD: DFNMSG ESC,DEE,DC1 ;ASK FOR LINE OF DATA MOV #OUTFDB,R0 MOVB MAXLEN,INREC+Q.IOPL+2 DIR$ #INREC ;READ FIRST LINE INTO RECBUF TSTB IOSTBL ;SUCCESSFUL?? BMI 2$ ;NO!! DEC IOSTBL+2 ;STRIP OFF LAST CHARACTER (IE CR) PUT$S R0,,IOSTBL+2 ;PUT FIRST LINE INTO THE FILE DFNMSG ESC,B,#0 ;MOVE CURSOR DOWN ONE LINE 1$: RETURN ;ERROR 2$: CALL QIOERR TYPE < ERROR OCCURED DURING QIO READ> TYPE < PROGRAM WILL CONTINUE> JMP 1$ .DSABL LSB ;SUBROUTINE THAT WILL SET THE TABS .ENABL LSB TABSET: CLR R2 ;TAB COUNT KEPT IN R2 DFNMSG ESC,H,#0 ;HOME CURSOR 1$: DFNMSG ESC,AMPER,LA ;MOVE CURSOR DFNMSG PLUS,NINE,C ;9 COLUMNS RIGHT DFNMSG ESC,TAB,#0 ;SET TAB INC R2 ;COUNT OF TABS SET CMP R2,#8. ;FINISHED? BLO 1$ ;CARRY ON IF NOT DFNMSG ESC,H,#0 ;YES: HOME CURSOR DFNMSG ESC,J,#0 ;CLEAR DISPLAY RETURN .DSABL LSB ;SUBROUTINE THAT SETS UP THE TERMINAL TO DISPLAY ; RECORDS SETTER: DFNMSG ESC,EEE,#0 ;RESET TERMINAL CALL TABSET ;SET TABS RETURN .ENABL LSB ;SUBROUTINE TO SET UP TERMINAL TO INSURE PROPER ; TRANSMITTAL OF DATA TO THE FILE SETUP: DFNMSG ESC,H,#0 ;HOME CURSOR DFNMSG ESC,R,#0 ;TURN INSERT CHARACTER KEY OFF DFNMSG ESC,EMM,#0 ;TURN MEMORY LOCK OFF DFNMSG ESC,CEE,#0 ;DISABLE KEYBOARD 1$: RETURN .DSABL LSB ;SUBROUTINE THAT WILL SUPPRESS QIO'S IF OPERATOR DESIRES .ENABL LSB NOQIO: DFNMSG ESC,EEE,#0 ;RESET TERMINAL TYPE 1$: MOV #INFDB,R0 MOV #RECBUF,R1 GET$S R0,,,ERRRTN ;GET A RECORD FROM THE INPUT FILE MOV #OUTFDB,R2 MOV R0,R4 PUT$S R2,#RECBUF,F.NRBD(R4),ERRRTN ;PUT RECORD IN OUTPUT FILE BR 1$ ;LOOP UNTIL EOF .DSABL LSB .PAGE .SBTTL FILE OPENING SUBROUTINES ;SUBROUTINE THAT SETS UP FILES FOR OPENING .ENABL LSB CSI1: CLOSE$ #INFDB CLOSE$ #OUTFDB MOVB OFF,F1FLAG READ: MOV #CSIBLK,R5 ;CSI CONTROL BLOCK GCML$ #CMLBLK ;GET A COMMAND LINE BCC 1$ ;OKAY??? JMP CMLERR ;NO!! COMMAND LINE ERROR 1$: CSI$1 R5,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD BCC 2$ ;OKAY??? TYPE JMP SYSWT 2$: MOV C.CMLD(R5),CMLBLK+G.CMLD ;SET LENGTH BEQ READ ;NULL LINE BITB #CS.EQU,C.STAT(R5) ;IS THERE AN EQUAL SIGN??? BNE 3$ ;YES!!! MOVB ON,F1FLAG ;NO!!! TURN "ONLY ONE FILE" FLAG ON 3$: MOV #FDBTBL,R4 MOVB #CS.OUT,C.TYPR(R5) ;SPECIFY THAT FILE IS FOR OUTPUT CALL PARSE ;PARSE FILE BNE 10$ ;BRANCH TO ERROR IF MORE OUTPUT FILES EXIST CMPB F1FLAG,ON ;HAS ONLY ONE FILE BEEN SPECIFIED?? BEQ 12$ ;YES!!! ; ;HANDLE FILE SPECIFIER WITH EQUAL SIGN ; MOVB #CS.INP,C.TYPR(R5) ;SPECIFY THAT THE NEXT FILE IS FOR INPUT CALL PARSE ;PARSE FILE BNE 11$ ;BRANCH TO ERROR IF MORE INPUT FILES EXIST 4$: MOV #INFDB,R0 OFNB$ ;OPEN INPUT FILE BCS 14$ ;BRANCH IF AN ERROR HAS OCCURED TSTB OUTFDB+F.FNB+N.FVER ;VERSION OF OUTPUT FILE = 0??? BNE 6$ ;NO!!! MOV #OUTFDB,R0 ;PREPARE FOR FIND MOV R0,R1 ADD #F.FNB,R1 CLR N.FVER+F.FNB(R0) ;SPECIFY THAT THE LATEST VERSION IS TO BE FOUND CALL .FIND ;INVOKE FIND BCC 5$ ;HAS IT BEEN FOUND?? MOVB #1,F.FNB+N.FVER(R0) ;NO!!! BR 6$ 5$: INC F.FNB+N.FVER(R0) ;YES!!! 6$: MOV #OUTFDB,R0 MOVB #FA.WRT!FA.EXT!FA.CRE,F.FACC(R0) ;SET FILE ACCESS BYTE TO CREATE-WRITE CLR F.FNB+N.FID(R0) ;ZERO FILE IDENTIFICATION -EXTEND CLR F.FNB+N.FID+2(R0) ; FIELD CLR F.FNB+N.FID+4(R0) MOV #INFDB+F.FNB,R1 BITB #NB.NAM,F.FNB+N.STAT(R0) ;HAS FILENAME BEEN SPECIFIED EXPLICITLY?? BNE 7$ ;YES!! ADD #F.FNB,R0 ;NO!! MOV N.FNAM(R1),N.FNAM(R0) ;MOVE INPUT FILENAME MOV N.FNAM+2(R1),N.FNAM+2(R0) ; TO OUTPUT FILENAME IN FDB MOV N.FNAM+4(R1),N.FNAM+4(R0) SUB #F.FNB,R0 7$: BITB #NB.TYP,F.FNB+N.STAT(R0) ;HAS TYPE BEEN EXPLICITLY SPECIFIED?? BNE 9$ ;YES!! ADD #F.FNB,R0 CMPB OFF,F1FLAG ;HAS ONE FILE BEEN SPECIFIED?? BNE 8$ ;YES!! MOV N.FTYP(R1),N.FTYP(R0) ;MOVE TYPE MOV N.FVER(R1),N.FVER(R0) ;MOVE VERSION NUMBER INCB N.FVER(R0) ;INC VERSION NUMBER 8$: SUB #F.FNB,R0 9$: OFNB$ ;OPEN OUTPUT FILE BCS 15$ ;BRANCH IF AN ERROR HAS OCCURED RETURN ;ELSE RETURN TO MAINLINE 10$: JMP CERR1 11$: JMP CERR2 ; ;HANDLE FILE SPECIFIER W/OUT EQUAL SIGN ; 12$: MOV #OUTFDB,R0 ;PREPARE FOR FIND MOV R0,R1 ADD #F.FNB,R1 BITB #NB.VER,F.FNB+N.STAT(R0) ;HAS VERSION BEEN SPECIFIED?? BNE 13$ ;YES!! CLR N.FVER+F.FNB(R0) ;SPECIFY THAT THE LATEST VERSION IS TO BE FOUND 13$: CALL .FIND ;INVOKE FIND BCC 16$ ;HAS FILE BEEN FOUND? [IF YES BRANCH TO 5$] JMP 6$ ;NO!! [CREATE NEW FILE] 14$: TYPE JMP SYSWT 15$: TYPE JMP SYSWT 16$: MOV #INFDB+F.FNB,R0 ;MOVE FILENAME BLOCK MOV #15.,R2 ;R2 - POINTER USED IN TRANSFERRING OUTPUT 17$: MOV (R1)+,(R0)+ ; FDB TO INPUT FDB SOB R2,17$ SUB #30.,R1 MOV #OUTFDB,R0 MOV R0,R1 ADD #F.FNB,R1 CLR N.FVER+F.FNB(R0) CALL .FIND INC N.FVER(R1) ;INCREMENT OUTPUT FILE VERSION NUMBER CLR N.FID(R1) ;ZERO OUTPUT FILE IDENTIFICATION CLR N.FID+2(R1) ; FIELD CLR N.FID+4(R1) MOVB OFF,F1FLAG JMP 4$ CERR1: TYPE JMP SYSWT CERR2: TYPE JMP SYSWT .DSABL LSB ;THIS SUBROUTINE WILL PARSE FILES .ENABL LSB PARSE: CSI$2 R5,,#SWTAB ;PROCESS OF FILE SPEC BCS 4$ ;ERROR!!!! BITB #NLMSK,CSIBLK+C.MKW1 ;HAS THE NL SWITCH BEEN SPECIFIED?? BNE 1$ ;YES!! MOVB MAXLIN,NLVAL ;NO!! 1$: BITB #SRMSK,CSIBLK+C.MKW1 ;SR SWITCH BEEN SPECIFIED? BEQ 2$ ;NO MOVB ON,SEQFLG ;YES 2$: BITB #CS.WLD,C.STAT(R5) ;WILD CARD SPEC ?? BNE 5$ ;YES!!! ERROR MOV -(R4),R0 ;PREPARE APPROPRIATE REGISTERS MOV -(R4),R3 ; FOR PARSE ROUTINE MOV R0,R1 ADD #F.FNB,R1 MOV R5,R2 ADD #C.DSDS,R2 CALL .PARSE BCC 3$ TYPE JMP SYSWT 3$: BITB #CS.MOR,C.STAT(R5) ;ANY MORE IN STRING RETURN 4$: TYPE JMP SYSWT 5$: TYPE JMP SYSWT .DSABL LSB ;SUBROUTINE THAT DETERMINES WHAT KIND OF ERROR ;EXISTS IN THE COMMAND LINE .ENABL LSB CMLERR: MOVB CMLBLK+G.ERR,R0 ;GET ERROR CODE CMPB #GE.EOF,R0 ;EOF ON COMMAND INPUT?? BEQ 3$ ;YES!!!EXIT CMPB #GE.IOR,R0 ;I-O ERROR??? BEQ 2$ ;YES!!! CMPB #GE.OPR,R0 ;OPEN FAIL??? BEQ 1$ ;YES!!! CMPB #GE.MDE,R0 ;DEPTH?? BEQ 2$ ;YES!!! 1$: TYPE JMP SYSWT 2$: TYPE JMP SYSWT 3$: JMP QUIT .DSABL LSB .PAGE .SBTTL SYMBOLIC DEFINITIONS ;BYTES SPACE: .BYTE 040 ENQ: .BYTE 005 DC1: .BYTE 21 RS: .BYTE 36 ;RECORD SEPARATOR ESC: .BYTE 33 ;ESCAPE ARROW: .BYTE 136 ;UP ARROW DEE: .BYTE 144 LF: .BYTE 12 ;LINE FEED EEE: .BYTE 105 ON: .BYTE 377 OFF: .BYTE 0 CEE: .BYTE 143 BEE: .BYTE 142 MAXLIN: .BYTE 39. ;MAX NUMBER OF LINES OUPUT TO THE TERMINAL ENTER: .BYTE 22 MAXTRY: .BYTE 3 ;MAX NUMBER OF TRIES TO SUBMIT AN ACCEPTABLE COMMAND MAXLEN: .BYTE 200. ;MAX NUMBER OF BYTES PER LINE CR: .BYTE 15 ;CARRIAGE RETURN ESS: .BYTE 123 A: .BYTE 101 H: .BYTE 110 R: .BYTE 122 L: .BYTE 114 M: .BYTE 115 B: .BYTE 102 J: .BYTE 112 S: .BYTE 163 T: .BYTE 164 PEE: .BYTE 160 QUEUE: .BYTE 161 DOUBLU: .BYTE 167 AAR: .BYTE 162 EMM: .BYTE 155 AMPER: .BYTE 46 LA: .BYTE 141 PLUS: .BYTE 53 NINE: .BYTE 71 C: .BYTE 103 BIT2: .BYTE 2 TAB: .BYTE 61 FA.WRT =2 FA.EXT =4 FA.CRE =10 NB.NAM =4 NB.TYP =2 ACK =6 DAO =-13 ;RESERVATION OF SPACE .EVEN RECBUF: .BLKB 200. COUNT: .BLKW 1. SENBUF: .BLKB 4. CMDBUF: .BLKW 5. SAVSP: .BLKW 1. IOSTBL: .BLKB 4. F1FLAG: .BLKW 1. IOEMSG: .ASCII /HPE -- IO.ERR CODE IS:/ IOERT: .BLKB 4. TTSTAT: .BLKW 6. LCOUNT: .BLKW 1. LFFLAG: .BLKW 1. F2FLAG: .BLKW 1. F3FLAG: .BLKW 1. F4FLAG: .BLKW 1. NLVAL: .BLKB 2. .EVEN PHRSIZ: .BLKW 1 ENDCMP: .BLKW 1 RECSIZ: .BLKW 1 SEQFLG: .BLKB 1 PHRASE: .BLKB 200. .END HPE