.TITLE SCR - READ A TELERAY SCREEN AND CREATE A TEXT FILE .IDENT /V 1.3/ ;+ ; SCR.MAC ; SETS UP FOR A LINE-BY-LINE READ OF THE TELERAY-12 TERMINAL ; THEN READS TERMINAL LINE-AT-A-TIME, WRITING TO A DISC FILE. ; ; WRITTEN 2-MARCH-81 BY M.D.LAMPI DAC CAT ; ; MODIFIED ; 5-MARCH-81 M.D.LAMPI ; INSERT CODE TO READ MCR COMMAND LINE, PARSE LINE ; AND WRITE USER-SPECIFIED OUTPUT FILE, AND REMOVE ; ALL FORTRAN REFERENCES ; ; 6-MARCH-81 M.D.LAMPI ; INSERT CODE TO PARSE SWITCHES, INCLUDING /SPOOL, ; /HELP AND /APPEND ;- .NLIST BEX ; .MCALL EXIT$S,DSCP$S,QIO$,DIR$,WTLO$,MRKT$,QIOW$,GTIM$ .MCALL GMCR$,CSI$,CSI$1,CSI$2,CSI$SW,CSI$SV,CSI$ND .MCALL FCSMC$,PUT$S ; BUFLN=255. ;TERMINAL INPUT/DISC OUTPUT BUFFER SIZE FCSMC$ ;CALL IN FCS MACRO DEFINITIONS ; FSRSZ$ 1 ;ONE RECORD I/O BUFFER FDB: FDBDF$ ;DISC FILE FDB (OUTPUT) FDAT$A R.VAR,FD.CR,,-5,-1 FDRC$A ,BUF,BUFLN ;USE MOVE MODE (BY DEFAULT) FDOP$A 1,CSIBLK+C.DSDS,DEFALT,FO.WRT FDBF$A 17 DEFALT: NMBLK$ LP,LST,,SY,0 ; CSI$ ;DEFINE CSI OFFSETS CSIBLK: .BLKB C.SIZE ; SPLMSK=1 ;/SPOOL APPMSK=2 ;/APPEND HLPMSK=4 ;/HELP TIMMSK=10 ;/TIMESTAMP ; SWTAB: CSI$SW SPOOL,SPLMSK,,SET,NEG CSI$SW APPEND,APPMSK,,SET,NEG CSI$SW HELP,HLPMSK,,SET,NEG CSI$SW TIME,TIMMSK,,SET,NEG CSI$ND ; QIO: QIO$ IO.RPR!TF.RAL!TF.RNE,5,1,,,, KILL: QIOW$ IO.KIL,5,1 ;KILL I/O MRKT: MRKT$ 2,7,1 ;MARK TIME FOR 7 TICS (>96 CHARACTERS @ 9600) WTLO: WTLO$ 0,3 ;WAIT FOR EVENT FLAGS 1 & 2 HOME: QIOW$ IO.WVB,5,1,,,, DOWNLN: QIOW$ IO.WVB,5,1,,,, LAST: QIOW$ IO.WVB,5,1,,,, ERRIN1: QIOW$ IO.WVB,5,1,,,, ERRIN2: QIOW$ IO.WVB,5,1,,,, ERROPN: QIOW$ IO.WVB,5,1,,,, ERROPA: QIOW$ IO.WVB,5,1,,,, HELPER: QIOW$ IO.WVB,5,1,,,, ERRWRT: QIOW$ IO.WVB,5,1,,,, GETIME: GTIM$ TIMBUF ;GETS SYSTEM DATE & TIME ; .ENABL LC PROMPT: .ASCII <33>/i/ ;TRANSMIT LINE FUNCTION FOR TELERAY-12 PRMPTL=.-PROMPT ; HOM: .ASCII <33>/h/<33>/s/ ;CURSOR FULL HOME HOML=.-HOM ; LFB: .BYTE 12 ;LINE-FEED (DOWN A LINE) ; .BYTE 15 ;PRECEDE LAST CHARS W/CARRIAGE-RETURN LSTCHR: .ASCII /SCR V1.3 / ;LAST CHARACTERS TO BOTHER WITH DATE: .ASCII /dd-mmm-y / ;DATE FIELD TIME: .ASCII /hh:mm:ss.t/ ;TIME FIELD LSTLN=.-LSTCHR .BYTE 33,'K ;CLEAR TO END OF LINE LSTLEN=.-LSTCHR ; ; ERROR MESSAGES ; ERR1: .ASCII <15>/SCR - Illegal characters in command line/ ERR1L=.-ERR1 ERR2: .ASCII <15>"SCR - Illegal filename/switch syntax" ERR2L=.-ERR2 ERROP: .ASCII <15>/SCR - Unable to open output file/ ERROPL=.-ERROP ERROA: .ASCII <15>/SCR - Unable to append to file/ ERROAL=.-ERROA HELP: .ASCII <15>/SCR is a program designed to copy the screen/ .ASCII / memory of a Teleray terminals/<15><12> .ASCII /to a disk file. Format of the SCR command line is:/<15><12><12> .ASCII " SCR [filename][/sw[/sw]]"<15><12><12> .ASCII " where filename is the name of the (optional) output file" .ASCII <15><12> .ASCII " /sw is one or more of the following switches:"<15><12> .ASCII " /AP - Append to an existing file"<15><12> .ASCII " /HE - Help - prints this text"<15><12> .ASCII " /SP - Spool the output file to the printer" .ASCII <15><12> .ASCII " /TI - Include time stamp in output file"<15><12> .ASCII " The default filename is LP.LST (if no filename is specified), which" .ASCII <15><12>" is subsequently spooled to the system printer and deleted." .ASCII <15><12> .ASCII " If a filename is specified, the file is not automatically spooled." .ASCII <15><12>" If no filetype is specified, the default filetype is .LST." .ASCII <15><12> HELPND=.-HELP ; WRT: .ASCII <15><12>/SCR - Unable to write to output file/ WRTL=.-WRT ; .EVEN TIMBUF: .BLKW 8. ;BUFFER TO RECEIVE SYSTEM TIME & DATE GETMCR: GMCR$ ;GET MCR COMMAND LINE BUF=GETMCR+G.MCRB ;INPUT BUFFER .BLKB 200. ;(PADDED BY AN APPROPRIATE AMOUNT) ; LENGTH: .WORD 0 ; LINCNT: .WORD 48. ;MAX # LINES TO READ .PAGE ; ; CODE BEGINS HERE ; SCREEN: DIR$ #GETIME ;GET SYSTEM TIME MOV #DATE,R0 ;CONVERT TO ASCII MOV #TIMBUF,R1 ;SET UP PARAMETERS CALL $DAT ; TO CONVERT TO ASCII DATE MOV #TIME,R0 ; AS WELL AS MOV #5,R2 ; TO CALL $TIM ; CONVERT THE TIME TO ASCII DIR$ #GETMCR ;NOW GET INPUT COMMAND LINE (IF ANY) TST $DSW ;ANY COMMAND LINE? BPL 5$ ;IF PL, YES CLR C.CMLD+CSIBLK ;ZAP COMMAND LENGTH BR 6$ 5$: MOV $DSW,C.CMLD+CSIBLK ;INITIALIZE COMMAND LENGTH SUB #3,C.CMLD+CSIBLK ;SUBTRACT LENGTH OF 'XXX ' 6$: CSI$1 #CSIBLK,#BUF+3 ;INITIALIZE CSI CONTROL BLOCK BCC 10$ ;IF CC, NO ERRORS DIR$ #ERRIN1 ;'ILLEGAL CHARACTERS IN INPUT' EXIT$S 10$: FINIT$ ;INITIALIZE FSR CSI$2 #CSIBLK,OUTPUT,#SWTAB ;TRY TO GET A FILENAME BCC 20$ ;IF CC, NO ERRORS IN SYNTAX DIR$ #ERRIN2 ;'ILLEGAL FILENAME SYNTAX' EXIT$S 20$: BITB #CS.NMF,C.STAT+CSIBLK ;FILENAME SPECIFIED IN INPUT STRING? BNE 21$ ;IF NE, YES BIT #SPLMSK,C.MKW1+CSIBLK ;/SP SWITCH IN COMMAND LINE? BNE 21$ ;IF NE, YES - DO WHAT USER WANTS BIS #SPLMSK,C.MKW2+CSIBLK ;ELSE FORCE NO SPOOLING (/-SP) 21$: BIT #HLPMSK,C.MKW1+CSIBLK ;/HELP SPECIFIED? BEQ 22$ ;IF EQ, NO BIT #HLPMSK,C.MKW2+CSIBLK ;/-HELP?? BEQ 22$ ;IF EQ, YES DIR$ #HELPER ;PRINT HELP MESSAGE EXIT$S ;THEN QUIT 22$: BIT #APPMSK,C.MKW1+CSIBLK ;/APPEND SPECIFIED? BEQ 24$ ;IF EQ, NO BIT #APPMSK,C.MKW2+CSIBLK ;/APPEND?? BNE 25$ ;IF NE, YES 24$: OPEN$W #FDB ;OPEN THE DISC FILE BCC INPUT ;IF CC, NO ERRORS IN OPEN DIR$ #ERROPN ;'UNABLE TO OPEN FILE' EXIT$S ; ; /APPEND SWITCH PROCESSING ; MUST CHANGE FDB TO OPEN FOR APPEND ; 25$: FDOP$R #FDB,#1,#CSIBLK+C.DSDS,#DEFALT,#FO.APD OPEN$A #FDB ;OPEN FOR APPEND BCC INPUT ;IF CC, NO ERRORS IN OPEN DIR$ #ERROPA ;'UNABLE TO APPEND TO FILE' EXIT$S ; INPUT: DIR$ #LAST ;PRINT OUT LAST LINE OF TEXT DIR$ #HOME ;NOW HOME UP & START READING SCREEN DSCP$S ;DISABLE CHECKPOINTING BIT #TIMMSK,C.MKW1+CSIBLK ;/TI SWITCH IN INPUT? BEQ 5$ ;IF EQ, NO BIT #TIMMSK,C.MKW2+CSIBLK ;/-TI OR /TI?? BEQ 5$ ;IF EQ, /-TI PUT$S #FDB,#LSTCHR,#LSTLN ;/TI - WRITE OUT TIMESTAMP ; ; NECESSARY FOR QIO W/O WAIT 5$: MOV #BUF,R0 ;GET ADDRESS OF LINE BUFFER MOV #BUFLN/2,R1 ;GET ITS LENGTH IN WORDS 10$: CLR (R0)+ ;BLANK OUT BUFFER SOB R1,10$ ;LOOP ; DIR$ #QIO ;START I/O DIR$ #MRKT ;START MARK TIME DIR$ #WTLO ;WAIT FOR EITHER DIR$ #KILL ;KILL THE I/O (DEFAULTS) ; MOV #BUF,R0 ;REMOVE GARBAGE PARITY BITS MOV #BUFLN,R1 ;SCANNING FORWARDS 15$: BICB #200,(R0)+ ;KNOCK OFF ANY PARITY BITS SOB R1,15$ ;LOOP-DE-LOOP MOV #BUF,R0 ;NOW FIND LAST CHARACTER INPUT ADD #BUFLN,R0 ; BY SCANNING BACKWARDS 20$: TSTB -(R0) ;SCAN BYTE BY BYTE BEQ 20$ CMPB #12,(R0) ;IS THIS A TRAILING ? BNE 21$ ;IF NE, NO CMPB #15,-(R0) ;HOW ABOUT A TRAILING ? BNE 21$ ;IF NE, NO TSTB -(R0) ;ADJUST TO BYPASS TRAILING 21$: SUB #BUF,R0 ;CALCULATE DIFFERENCE INC R0 BPL 22$ ;IF PL, WE GOT SOME CHARACTERS CLR R0 ;ELSE FORCE 0 CHARACTERS READ 22$: MOV R0,LENGTH CMP #LSTLN,LENGTH ;SEE IF LINE LENGTH SAME AS LAST LINE BNE 24$ ;IF NE, NO IGNORE FURTHER CHECKING MOV #LSTLN,R0 ;SEE IF WE FOUND LAST LINE 23$: CMPB BUF-1(R0),LSTCHR-1(R0) ;SCAN CHARACTER-BY-CHARACTER BNE 24$ ;IF NE, NOT LAST LINE - STOP CHECKING SOB R0,23$ ;LOOP UNTIL CHECKED OUT BR 25$ ;IF WE GET HERE, FOUND LAST LINE ; 24$: PUT$S #FDB,#BUF,LENGTH ;WRITE DATA LINE TO FILE BCS 40$ ;IF CS, ERROR IN WRITING DEC LINCNT ;SEE IF 48 LINES READ FROM TERMINAL BNE 30$ ;IF NE NO, LOOP ; 25$: MOV #FDB,R0 ;ALL DONE - BIT #SPLMSK,C.MKW2+CSIBLK ; SEE IF FILE SHOULD BE SPOOLED BNE 27$ ;IF NE, YES ; CALL .TRNCL ; USE TRUNCATE & CLOSE TO CLEAN UP CLOSE$ #FDB ;ALL DONE - CLOSE UP SHOP EXIT$S 27$: CALL .PRINT ;SPOOL FOR PRINTING EXIT$S ;THEN QUIT ; 30$: DIR$ #DOWNLN ;MOVE DOWN A LINE BR 5$ ;LOOP ; 40$: DIR$ #ERRWRT ;'UNABLE TO WRITE TO OUPUT FILE' EXIT$S ; .END SCREEN