.TITLE REFORMAT - REFORMAT RSXNET LOG FILE .IDENT /3.2/ .ENABL LC ;+ ; ; Free software BY ; Project Software & Development, Inc. ; ; This software is furnished for free and may be used and copied as ; desired. This software or any other copies thereof may be provided ; or otherwise made available to any other person. No title to and ; ownership of the software is hereby transferred or allowed. ; ; The information in this software is subject to change without notice ; and should not be construed as a commitment by PROJECT SOFTWARE ; AND DEVELOPMENT, INC. ; ; PROJECT SOFTWARE assumes no responsibility for the use or reliability ; of this software on any equipment whatsoever. ; ; Project Software & Development, Inc. ; 14 Story St. ; Cambridge, Ma. 02138 ; 617-661-1444 ; ; ; Title: REFORMAT ; Author: Gary Larsen ; Date: April 23, 1982 ; ; Description: ; ; This module will reformat a log file created by RSXNET stripping ; nulls and deletes and correcting carriage control. ; ; Modification History: ; ;- .ENABL AMA .NLIST BEX .MCALL CLOSE$, DIR$, FINIT$, GET$, GMCR$, NMBLK$, PUT$ .MCALL FSRSZ$, FDBDF$, FDAT$A, FDOP$A, FDRC$A, FDBF$A .MCALL ALUN$S, EXIT$S, QIOW$S ; Local equates: BELL == 7 ; BELL BS == 10 ; BACK SPACE LF == 12 ; LINE FEED FF == 14 ; FORM FEED CR == 15 ; CARRIAGE RETURN ESC == 27. ; ESCAPE SPACE == 40 ; ASCII FOR SPACE DEL == 127. ; DELETE KEY FILSIZ == 512. ; LOGFILE RECORD SIZE INLUN == 2 ; INPUT FILE LUN INEFN == 2 ; INPUT FILE EFN REFLUN == 3 ; REFORMATTED FILE LUN REFEFN == 3 ; REFORMATTED FILE EFN TILUN == 4 ; TERMINAL LUN TIEFN == 4 ; TERMINAL EFN ; DPB for Get MCR command line GMCR:: GMCR$ ; GET COMMAND LINE DPB ; Messages: REFH: .ASCIZ "LOG_FILE REFORMAT" HEADER: .ASCII "REFORMAT Version 3.2" .BYTE , HEDLEN=.-HEADER BLANK:: .ASCIZ "" INNAM:: .ASCIZ "Enter the name of the input file: " REFNAM::.ASCII "Enter the name of the output file (" REFLEN=.-REFNAM REFD:: .BLKB 36. DONE:: .ASCII "Reformatting Done ....." DONLEN=.-DONE .EVEN FSRSZ$ 3 ; MAXIMUM OF 2 FILES FOR OPEN INFDB:: FDBDF$ ; FDB FOR INPUT FILE FDAT$A R.VAR,FD.CR,,, ; VARIABLE LENGTH RECORDS FDRC$A ,INBUFF,FILSIZ ; BUFFER ADDR / MAX SIZE FDOP$A INLUN,,LOGDNB,FO.RD!FA.SHR ; OPEN FOR SHARED READ FDBF$A INEFN,FILSIZ,, ; EFN / BUFFER SIZE REFFDB:: FDBDF$ ; FDB FOR REFORMATTED FILE FDAT$A R.VAR,FD.CR,,-10.,-10. ; VARIABLE LENGTH RECORDS FDRC$A ,REFBUF,FILSIZ ; LOCATE MODE FDOP$A REFLUN,,LOGDNB,FO.WRT!FA.NSP ; OPEN FOR WRITE FDBF$A REFEFN,FILSIZ,, ; INIT BLOCK BUFFER SECTION LOGDNB::NMBLK$ ,,,SY,0 ; DEFAULT EXTENSION AND DEVICE ; Storage area: FILNAM::.BLKB 50. ; STORAGE FOR ASCII FILE NAME FILLEN::.WORD 0 ; LENGTH OF FILE NAME IN BYTES SOFNAM::.WORD 0 ; POINTER TO START OF FILE NAME TIOSB:: .BLKW 2 ; TERMINAL I/O STATUS BLOCK REFBYT::.WORD 0 ; BYTE COUNT FOR REFORMATTED LOG FILE INBYT:: .WORD 0 ; BYTE COUNT FOR INPUT RECORD INFIL:: .BLKB 28. ; BUFFER FOR NAME OF FILE TO REFORMAT REFFIL::.BLKB 28. ; BUFFER NAME FOR OUTPUT FILE MCRFLG::.WORD 0 ; SHOW STARTED FROM AN MCR LINE CTRFLG::.WORD 0 ; FLAG FOR CARRIAGE CONTROL .PSECT $$ZZZZ,RW,D,REL,CON ; FORCE BUFFERS TO END OF TASK INBUFF::.BLKB FILSIZ ; INPUT BUFFER REFBUF::.BLKB FILSIZ ; OUTPUT BUFFER .EVEN .PSECT ; RETURN TO ORIGINAL PSECT .SBTTL REFORMAT - REFORMAT RSXNET LOG FILE ;+ ; ; REFORMAT - Reformat RSXNET log file. ; ; This module will reformat a log file created by RSXNET stripping ; nulls and deletes and correcting carriage control. ; ;- REFORM:: ALUN$S #TILUN,#"TI,#0 ; ASSIGN LUN TO TI0: MOV @#.FSRPT,R0 ; GET POINTER TO FSR TST A.DFUI(R0) ; HAS .FINIT BEEN DONE (DDT) BNE 10$ ; IF NE, YES (DO ONLY ONCE) FINIT$ ; DO THE FINIT ; Check to see if we were issued an MCR command line 10$: MOV #GMCR+G.MCRB,R0 ; POINT TO INPUT BUFFER MOV #INFIL,R1 ; ADDRESS OF BUFFER TO PUT MCR INPUT DIR$ #GMCR ; GET MCR COMMAND LINE BCS 50$ ; IF CC, GOT A COMMAND LINE ; Move the MCR commandline buffer into the filename to reformat 20$: CMPB (R0),#SPACE ; COMMANDLINE IN BUFFER ? BEQ 30$ ; IF EQ, YES CMPB (R0),#CR ; IS THE MCR BUFFER EMPTY ? BEQ 50$ ; IF EQ, YES CMPB (R0),#ESC ; IS THE MCR BUFFER EMPTY ? BEQ 50$ ; IF EQ, YES INC R0 ; ELSE POINT TO THE NEXT BYTE BR 20$ ; AND CHECK THE REST OF THE BUFFER 30$: MOV #-1,MCRFLG ; SHOW WE STARTED FROM AN MCR LINE INCB R0 ; AND POINT PAST THE SPACE 40$: CMPB (R0),#CR ; END OF THE INPUT BUFFER ? BEQ 70$ ; IF EQ, YES CMPB (R0),#ESC ; END OF THE INPUT BUFFER ? BEQ 70$ ; IF EQ, YES CMPB (R0),#SPACE ; START OF THE OUTPUT FILE NAME ? BEQ 44$ ; IF EQ, YES MOVB (R0)+,(R1)+ ; ELSE MOVE THE CHARACTER BR 40$ ; AND SEE IF WE'RE DONE 44$: MOV #REFFIL,R1 ; ADDRESS OF BUFFER FOR OUTPUT FILENAME INCB R0 ; POINT PAST THE SPACE 45$: CMPB (R0),#CR ; END OF THE INPUT BUFFER ? BEQ 70$ ; IF EQ, YES CMPB (R0),#ESC ; END OF THE INPUT BUFFER ? BEQ 70$ ; IF EQ, YES MOVB (R0)+,(R1)+ ; ELSE MOVE THE CHARACTER BR 45$ ; AND CHECK THE REST OF THE BUFFER 50$: QIOW$S #IO.WVB,#TILUN,#TIEFN,,#TIOSB,,<#HEADER,#HEDLEN,#40> ; Get the filename of the file to reformat 60$: MOV #INNAM,R0 ; ADDRESS OF FORMAT FILE PROMPT MOV #INFIL,R2 ; ADDRESS OF BUFFER TO STORE INPUT CALL PROMPT ; GET THE LOGFILE NAME ; Open the input file. 70$: TSTB INFIL ; WAS A FILE NAME ENTERED ? BEQ 60$ ; IF EQ, NO (REPROMPT) MOV #INFDB,R0 ; ADDRESS OF INPUT FILE FDB MOV #INFIL,R1 ; ADDRESS OF INPUT FILE NAME CALL OPENR ; GO OPEN THE FILE BCC 80$ ; IF CC, SUCCESS CALL FILERR ; ELSE REPORT THE ERROR TST MCRFLG ; STARTED BY MCR LINE ? BEQ 60$ ; IF EQ, NO (TRY AGAIN) JMP EXIT ; EXIT TO SYSTEM ; Expand the name and open the output file. 80$: TSTB REFFIL ; WAS AN OUTPUT FILE SPECIFIED ? BNE 85$ ; IF NE, YES MOV #INFIL,R0 ; ADDRESS OF INPUT FILE MOV #REFD,R1 ; ADDRESS OF DEFAULT OUTPUT FILE BUFFER 82$: MOVB (R0)+,(R1)+ ; MOVE THE INPUT TO THE DEFAULT CMPB #';,(R0) ; CHECK FOR VERSION NUMBER BEQ 83$ ; IF EQ, YES TSTB (R0) ; ARE WE AT THE END BNE 82$ ; IF NE, MORE 83$: MOVB #'),(R1)+ ; MOVE IN THE END PARENTHESIS MOVB #':,(R1)+ ; AND THE COLON MOVB #SPACE,(R1)+ ; LEAVE A SPACE FOR NEATNESS CLRB (R1) ; AND TERMINATE WITH A NULL MOV #REFNAM,R0 ; ADDRESS OF OUTPUT FILE NAME MOV #REFFIL,R2 ; ADDRESS OF BUFFER TO STORE INPUT CALL PROMPT ; GET THE OUTPUT FILE NAME 85$: MOV #INFDB,R0 ; ADDRESS OF INPUT FILE FDB MOV #INFIL,R1 ; ADDRESS OF INPUT FILE NAME CALL MAKNAM ; MAKE THE FILE NAME CLR CTRFLG ; PRESUME NO CARRIAGE CONTROL BITB #7,F.RATT(R0) ; IS THERE CARRIAGE CONTROL BEQ 90$ ; IF EQ, NO MOV #-1,CTRFLG ; SHOW CARRIAGE CONTROL 90$: MOV SOFNAM,R1 ; MOVE IN THE DEFAULT NAME OF OUTPUT TSTB REFFIL ; DID THEY ACCEPT THE DEFAULT ? BEQ 93$ ; IF EQ, YES MOV #REFFIL,R2 ; ADDESS OF THE OUTPUT FILE BUFFER CMPB (R2),#'* ; DID THEY TAKE THE DEFAULT ? BEQ 93$ ; IF EQ, YES MOV #REFFIL,R1 ; ADDRESS OF OUTPUT FILE NAME 93$: MOV #REFFDB,R0 ; ADDRESS OF REFORMATTED FILE FDB CALL OPENW ; GO OPEN THE FILE BCC 100$ ; IF CC, OK JMP ERREXI ; ELSE REPORT THE ERROR AND EXIT 100$: MOV #REFBUF,R3 ; ADDRESS OF OUTPUT BUFFER ; Get the record from the logfile until an error or end-of-file. LOOP:: MOV #INBUFF,R4 ; ADDRESS OF INPUT BUFFER MOV #INBUFF,INBYT ; SET UP THE CHECK FOR END OF RECORD GET$ #INFDB,#INBUFF,#FILSIZ ; GET THE NEXT RECORD BCC 10$ ; IF CC, OK CMPB F.ERR(R0),#IE.EOF ; ENCOUNTER END OF FILE ? BNE ERREXI ; IF NE, REPORT ERROR & EXIT JMP EXIT ; ELSE CLOSE THE FILES 10$: ADD F.NRBD(R0),INBYT ; POINTER TO END OF INPUT BUFFER ; Check for the end of the input record ; Register usage: ; R3 = address of output buffer. ; R4 = address of input buffer. 20$: CMP REFBYT,#FILSIZ ; IS THE OUTPUT BUFFER FULL ? BLT 25$ ; IF LT, NO (CONTINUE) CALL REFWRT ; YES, OUTPUT THE BUFFER ; TOO PREVENT RUN-AWAY 25$: CMP INBYT,R4 ; END OF THE INPUT BUFFER ? BGT 30$ ; IF GT, NO CONTINUE TST CTRFLG ; INPUT FILE HAVE CARRIAGE CONTROL ? BEQ LOOP ; IF EQ, NO (DON'T WRITE RECORD) CALL REFWRT ; ELSE FLUSH THE OUTPUT BUFFER BR LOOP ; AND CONTINUE ; Check the input record for nulls and strip them 30$: TSTB (R4) ; IS THIS CHARACTER A NULL BNE 40$ ; IF NE, NO INC R4 ; GO TO THE NEXT CHARACTER BR 20$ ; AND CHECK IT ; Check the input record for delete characters and strip them 40$: CMPB (R4),#DEL ; IS THIS THE DELETE CHARACTER ? BNE 50$ ; IF NE, NO INC R4 ; GO TO THE NEXT CHARACTER BR 20$ ; AND CHECK IT ; Check the input record for sequences and convert them to 50$: CALL CHKVFU ; CHECK FOR VFU CHARACTER BVS 20$ ; IF VS, VFU FOUND CMPB (R4),#LF ; IS THE CHARACTER A LINE FEED BNE 60$ ; IF NE, NO CMPB 1(R4),#CR ; IS THE NEXT CHARACTER A RETURN BEQ 90$ ; IF EQ, YES INC R4 ; ADJUST THE INPUT BUFFER POINTER BR 110$ ; ELSE PUT THE IN THE BUFFER ; Check the input to see if the character is a 60$: CMPB (R4),#CR ; IS THE CHARACTER A RETURN ? BNE 140$ ; IF NE, NO ; Check the input character to see if we have a sequence 70$: CMPB 1(R4),#CR ; IS IT A SEQUENCE ? BNE 80$ ; IF NE, NO INC R4 ; ELSE IGNORE THE FIRST BR 70$ ; AND SEE IF THERE IS ANOTHER ONE ; Check the input character to see if it is a 80$: CMPB 1(R4),#LF ; IS IT A SEQUENCE ? BEQ 90$ ; IF EQ, YES INC R4 ; ELSE POINT PAST THE BR 20$ ; AND CHECK THE NEXT CHARACTER ; Upon reaching a write the output record 90$: ADD #2,R4 ; POINT PAST THE CALL REFWRT ; WRITE THE RECORD BCS ERREXI ; IF CS, ERROR ENCOUNTERED CMP INBYT,R4 ; END OF THE INPUT BUFFER ? BLE LOOP ; IF LE, YES ; Check for a sequence 100$: CMPB (R4),#LF ; IS IT A SEQUENCE ? BNE 120$ ; IF NE, NO INC R4 ; ADUJUST THE INPUT BUFFER POINTER ; Convert a to write a blank record on second 110$: CALL REFWRT ; AND WRITE ANOTHER BLANK RECORD BCS ERREXI ; IF CS, REPORT ERROR & EXIT BR 20$ ; AND SEE IF THERE ARE MORE () ; Check the input string for a string 120$: CMPB (R4),#CR ; IS IT A SEQUENCE BEQ 130$ ; IF EQ, YES BR 20$ ; AND CHECK THE NEXT ONE ; Make sure it isn't a if not ignore the second 130$: CMPB 1(R4),#LF ; WAS IT BEQ 90$ ; IF EQ, YES INC R4 ; ELSE POINT PAST THE BR 20$ ; AND CONTINUE CHECKING ; Check for the delte a character string and strip it and the character(s) ; to delete from the input buffer. 140$: CMPB (R4),#BS ; IS THE CHARACTER A BACKSPACE ? BNE 150$ ; IF NE, NO MOVB (R4)+,(R3)+ ; MOVE IN THE BACKSPACE FOR NOW INC REFBYT ; ADJUST THE BYTE COUNT CMPB (R4),#SPACE ; IS THE NEXT CHARACTER A SPACE BNE 20$ ; IF NE, NO MOVB (R4)+,(R3)+ ; MOVE IN THE SPACE FOR NOW INC REFBYT ; ADJUST THE BYTE COUNT CMPB (R4),#BS ; IS THE NEXT CHARACTER A BACKSPACE BNE 20$ ; IF NE, NO INC R4 ; POINT INPUT POINTER PAST THE SUB #3,REFBYT ; DECREMENT THE BYTE COUNT SUB #3,R3 ; AND ADJUST THE BUFFER POINTER ; SEQUENCEIN OUTPUT BUFFER BR 20$ ; AND CHECK THE NEXT CHARACTER ; Move a character into the output buffer and go check the next one 150$: MOVB (R4)+,(R3)+ ; MOVE IN THE CHARACTER INC REFBYT ; ADJUST THE BYTE COUNT BR 20$ ; AND CONTINUE ; Flush the output buffer and close the files 160$: CALL REFWRT ; CLEAR THE OUTPUT BUFFER BCC EXIT ; IF CC, EXIT NORMALLY ; Report the error and close the files ERREXI: CALL FILERR ; REPORT THE ERROR EXIT: CLOSE$ #INFDB ; CLOSE THE INPUT FILE BCS 10$ ; IF CS, PRESUME NO OUTPUT FILE MOV #REFFDB,R0 ; FDB OF THE REFORMATTED FILE CALL .TRNCL ; TRUNCATE AND CLOSE THE OUTPUT FILE 10$: TST MCRFLG ; DID WE START FROM MCR ? BMI 20$ ; IF MI, YES (NO MESSAGE) QIOW$S #IO.WVB,#TILUN,#TIEFN,,#TIOSB,,<#DONE,#DONLEN,#40> 20$: EXIT$S ; AND EXIT .SBTTL CHKVFU - CHECK FOR A VFU BYTE ;+ ; ; CHKVFU - Check for a line printer VFU byte. ; ; This subroutine which checks for a VFU byte and converts them to ; the appropriate number of blank lines or a form feed. ; ; Inputs: ; R3 = address of the output buffer. ; R4 = contains the byte to check. ; ; Outputs: ; R4 updated if VFU byte encountered. ; V bit set/clear = found VFU / no VFU. ; ;- CHKVFU:: BITB #200,(R4) ; IS IT A VFU BYTE ? BEQ 40$ ; IF EQ, NO (V BIT CLEARED). BITB #100,(R4) ; SKIP FUNCTION (Data Printer) ? BEQ 20$ ; IF EQ, NO ; Change VFU skip function to a form feed. Put on next record. 10$: CALL REFWRT ; WRITE THE RECORD MOVB #FF,(R3)+ ; CHANGE IT TO FORM FEED INC R4 ; AND POINT PAST IT INC REFBYT ; ADJUST OUTPUT BYTE COUNT BR 30$ ; AND RETURN ; Data Printer skip to channel 1 = 301, space 1 = 201. ; Data Products skip to channel 1 = 200, space 1 = 221. 20$: BITB #37,(R4) ; SKIP CHANNEL 1 (Data Products) ? BEQ 10$ ; IF EQ, PRESUME YES ; Change VFU space function to 's. MOVB (R4)+,R5 ; GET THE SPACE BYTE BIC #^C17,R5 ; ISOLATE THE COUNT 25$: CALL REFWRT ; SPACE APPROPRIATE # OF LINES SOB R5,25$ ; LOOP UNTIL DONE 30$: SEV ; SHOW VFU BYTE FOUND 40$: RETURN .SBTTL MAKNAM - MAKE EXPANDED FILE NAME ;+ ; ; MAKNAM - Make expanded file name. ; ; This routine is called BEFORE openning a file to make a fully ; expanded file name in the FILNAM buffer. ; ; Inputs: ; R0 = The FDB address. ; ; Outputs: ; File name stored in FILNAM buffer. ; ;- MAKNAM:: CALL $SAVAL ; SAVE R0 - R5 MOV R0,R4 ; SAVE THE FDB ADDRESS ADD #F.FNB,R0 ; POINT TO THE FNB MOV R0,R5 ; COPY THE FNB ADDRESS MOV #FILNAM,R0 ; STORE FILE NAME HERE ; Device name and unit number. MOV N.DVNM(R5),(R0)+ ; COPY THE DEVICE NAME MOV N.UNIT(R5),R1 ; GET BINARY UNIT NUMBER CLR R2 ; SET FOR ZERO SUPRESSION CALL $CBTMG ; CONVERT IT TO OCTAL ASCII MOVB #':,(R0)+ ; MOVE IN A COLON ; Copy the UIC. MOV F.DSPT(R4),R3 ; THE DATASET DESCRIPTOR BEQ 20$ ; IF EQ, THERE IS NONE MOV 4(R3),R2 ; GET THE UIC BYTE COUNT BEQ 20$ ; IF EQ, THERE IS NONE MOV 6(R3),R3 ; COPY THE STRING ADDRESS 10$: MOVB (R3)+,(R0)+ ; MOVE UIC TO BUFFER SOB R2,10$ ; BR TILL DONE BR 40$ ; AND CONTINUE ; No UIC specified, so use the default UIC. 20$: CALL .RDFUI ; READ DEFAULT UIC 30$: MOV R0,R2 ; COPY OUTPUT ADDRESS MOV R1,R3 ; COPY BINARY UIC CLR R4 ; LEADING ZEROS/SEPARATORS CALL .PPASC ; CONVERT BINARY UIC TO ASCII MOV R2,R0 ; COPY NEW BUFFER POINTER ; File name, type, and version. 40$: MOV R0,SOFNAM ; SAVE POINT TO START OF NAME MOV N.FNAM(R5),R1 ; GET 1ST PART OF FILE NAME CALL $C5TA ; CONVERT RADIX-50 TO ASCII MOV N.FNAM+2(R5),R1 ; GET 2ND PART OF FILE NAME BEQ 50$ ; IF EQ, DONE CALL $C5TA ; CONVERT IT TO ASCII MOV N.FNAM+4(R5),R1 ; GET 3RD PART OF FILE NAME BEQ 50$ ; IF EQ, DONE CALL $C5TA ; CONVERT IT TO ASCII 50$: CMPB #SPACE,-(R0) ; LAST CHARACTER A SPACE ? BEQ 50$ ; IF EQ, YES INC R0 ; NO, ADJUST POINTER MOVB #'.,(R0)+ ; MOVE IN A PERIOD MOV N.FTYP(R5),R1 ; GET FILE TYPE BEQ 60$ ; IF EQ, NONE CALL $C5TA ; AND CONVERT TO ASCII 60$: CMPB #SPACE,-(R0) ; LAST CHARACTER A SPACE ? BEQ 60$ ; IF EQ, YES INC R0 ; NO, ADJUST POINTER ; MOV N.FVER(R5),R1 ; GET FILE VERSION ; BEQ 70$ ; IF EQ, NONE ; MOVB #';,(R0)+ ; MOVE IN A SEMI-COLON ; CLR R2 ; SUPPRESS 0'S ; CALL $CBOMG ; VERSION # IS OCTAL 70$: CLRB (R0) ; TERMINATE THE STRING SUB #FILNAM,R0 ; CALCULATE THE BYTE COUNT MOV R0,FILLEN ; AND STORE IT RETURN .SBTTL PROMPT - PROMPT USER FOR FILE SPECIFICATION ;+ ; ; PROMPT - Prompt user for file specification. ; ; Inputs: ; R0 = the prompt string (terminated by NULL). ; R2 = the address of the prompt answer ; ; Outputs: ; Exits if CTRL/Z or CTRL/C typed. ; ;- PROMPT:: CALL $SAVAL ; SAVE R0 - R5 MOV R0,R1 ; COPY THE PROMPT ADDRESS 10$: TSTB (R1)+ ; FIND THE END BNE 10$ ; BR UNTIL NULL DEC R1 ; ADJUST FOR THE NULL SUB R0,R1 ; CALCULATE BYTE COUNT 20$: QIOW$S #IO.RPR,#TILUN,#TIEFN,,#TIOSB,, CMP TIOSB,#IS.CC ; CTRL/C TYPED ? BEQ 30$ ; IF EQ, YES CMPB TIOSB,#IE.EOF ; CTRL/Z TYPED ? BNE 40$ ; IF NE, NO 30$: EXIT$S ; EXIT TO SYSTEM 40$: CMP TIOSB,#IS.ESC ; ESCAPE FOR HELP ? BNE 60$ ; IF NE, NO 50$: CALL TBLANK ; TYPE A BLANK LINE CALL REFHLP ; YES, GO TYPE IT BR 20$ ; AND PROMPT AGAIN 60$: CMPB (R2),#'? ; QUESTION MARK FOR HELP ? BEQ 50$ ; IF EQ, YES MOV R2,R1 ; COPY THE ADDRESS ADD TIOSB+2,R1 ; END OF STRING CLRB (R1) ; TERMINATE WITH NULL 70$: CALL CUPPER ; CONVERT TO UPPERCASE TSTB (R2)+ ; POINT TO NEXT BYTE BNE 70$ ; IF NE, MORE TO GO RETURN ; Subroutine to type a blank line. TBLANK: QIOW$S #IO.WVB,#TILUN,#TIEFN,,#TIOSB,,<#BLANK,#1,#40> RETURN .SBTTL CUPPER - CONVERT CHARACTER TO UPPER CASE ;+ ; ; CUPPER - Convert character to upper case. ; ; Inputs: ; (R2) = Character to convert. ; ;- CUPPER:: CMPB (R2),#'a ; POSSIBLE LOWERCASE ? BLO 10$ ; IF LO, NO CMPB (R2),#'z ; REALLY LOWERCASE ? BHI 10$ ; IF HI, NO BICB #40,(R2) ; CONVERT TO UPPERCASE 10$: RETURN .SBTTL REFWRT - WRITE THE REFORMATTED LOGFILE RECORD ;+ ; ; REFWRT - Write the reformatted logfile record. ; ; Outputs: ; R3 is reset to point to the beginning of the output buffer. ; ;- REFWRT:: CALL $SAVAL ; SAVE R0 - R5 PUT$ #REFFDB,#REFBUF,REFBYT ; WRITE THE REFORMATTED RECORD BCS 10$ ; IF CS, ERROR CLR REFBYT ; INITIALIZE THE BYTE COUNT MOV #REFBUF,10(SP) ; RESET THE OUTPUT BUFFER 10$: RETURN .END REFORM