;************************************************************************* ;************************************************************************* ; ; GRIPE ; ;************************************************************************* ;************************************************************************* .TITLE GRIPE .IDENT /JAX001/ ;IDENTIFY THE ROUTINE. .ENABL LC ; PROGRAMMER: HENRY TUMBLIN ; DATE: NOVEMBER 23,1977 ; MODULE NAME: GRIPE ; FOR: SYSTEMS -- USER FEEDBACK ; MACHINE/SYSTEM: PDP11/45-IAS V1.1 ; EDITS: DECEMBER 1,1977 MADE MODIFICATION FOR ROUTINE TO ; WRITE THE FILE PROTECTION WORD ; WHEN CREATING THE FILE. BY HRT. ; TYPE/LANGUAGE: MAIN/ASSEMBLER ; INDIRECT COMMAND FILE: GRIPE.CMD - BUILDS GRIPE UTILITY. ; ABSTRACT: GRIPE PROVIDES A MEANS OF THE GENERAL ; USER TO COMMENT ABOUT THE SYSTEM ANONIMOUSLY ; IF DESIRED, AND FOR THE INSTALLATION MANAGER ; TO MONITOR ANY TYPE OF FEEDBACK FROM THE ; USERS. THIS PROGRAM WILL USE A FILE THAT ; EXISTS OUT ON DB0:[1,1]GRIPE.LST. THIS FILE ; IS SET UP SO ALL THAT THE SYSTEM MANAGER NEED ; DO IS TO PRINT THE FILE ONCE WEEKLY, THEN ; DELETE THE FILE AND RUN GRIPE HIMSELF JUST ; TO RECREATE THE OUTPUT FILE. ; OTHER ROUTINES CALLED: NONE ; DESCRIPTION OF VARIABLES: ; FILES: 1)FDBGRP: FILE DESCRIPTOR BLOCK FOR OUTPUT ; FILE. ; 2) ALL OTHER I/O IS DONE USING QIO'S. ;******************************************************************************* .PAGE ;******************************************************************************* .SBTTL DEFINE LOGICAL UNIT NUMBERS. TLUN=5 ;TERMINAL LUN OUTLUN=1 ;DISK FILE LUN. ; DON'T FORGET TO TELL U KNOW WHO WHICH MACROS WE'RE GOING TO USE. ; .SBTTL DEFINE ALL LOCAL MACRO'S .MACRO PRINT,A,B ;TO WRITE TO THE SCREEN MOV A,WRITE+Q.IOPL ;GET ADDRESS OF OUTPUT BUFFER. MOV B,WRITE+Q.IOPL+2 ;GET LENGTH OF OUTPUT BUFFER. DIR$ #WRITE ;WRITE TO THE TERMINAL. .ENDM PRINT ; DEFINE A FEW CARRIAGE CONTROL CHARACTERS. .SBTTL DEFINE SOME CONTROL CHARACTERS. CR=15 ;CARRIAGE RETURN LF=12 ;LINE FEED HT=11 ;HORIZONTAL TAB BEL=7 ;THE BELL DS=44 ;DOLLAR SIGN .SBTTL CALL THE LIBRARY MACROS. .MCALL FDBDF$,FDAT$A,FDRC$A,FSRSZ$,FINIT$,DIR$ .MCALL QIOW$,PUSH,POP,FDOP$A,OPEN$A,CLOSE$,PUT$ .MCALL OPEN$W,EXIT$S,CVTA$,GTIM$ ;******************************************************************************* .PAGE ;******************************************************************************* .SBTTL TEL FCS HOW MANY FILES WE'RE GOING TO USE. FSRSZ$ 4 .SBTTL DEFINE THE FILE DESCRIPTOR BLOCK FDBGRP: FDBDF$ ;DECLARE SPACE FOR THE GRIPE FILE. FDAT$A R.VAR,FD.CR ;USE V-LENGTH RECORDS FDOP$A OUTLUN,OFNAM ;SET THE LUN FOR THIS FILE AND FILE DESCRIPTORS. OFNAM: .WORD DEVS,DEV ;DEVICE NAME AND NAME LENGTH .WORD DIRS,DIR ;DIRECTORY AND DIRECTORY LENGTH .WORD FNAMS,FNAM ;FILE NAME AND LENGTH OF STRING. DEV: .ASCII /DB1:/ ;DEVICE WHERE IT'S GOING DEVS=.-DEV DIR: .ASCII /[1,1]/ ;DIRECTORY WHERE IT'S GOING. DIRS=.-DIR FNAM: .ASCII /GRIPE.LST/ ;FILE NAME WHEN IT GETS THERE. FNAMS=.-FNAM ;******************************************************************************* .PAGE ;******************************************************************************* .SBTTL SET UP THE QIO'S FOR THE TERMINAL .EVEN READ: QIOW$ IO.RVB,TLUN,1,,IOSTAT,, ;READ QIO WRITE: QIOW$ IO.WVB,TLUN,1,,,,<0,0,DS> ;WRITE QIO ;******************************************************************************* .PAGE ;******************************************************************************* .SBTTL SET UP THE PROMPT BUFFER PR1: .ASCII /GRP> / ;SET PROMPT BUFFER. PR1SZ=.-PR1 .SBTTL SET UP THE I/O BUFFER. .EVEN INBUF: .BLKB 80. ;INPUT AND OUTPUT BUFFER, 80 BYTES LONG. INSZ=.-INBUF ; SET UP DATE AND TIME BUFFER. DTBUF: .BLKW 8. GTDI: GTIM$ DTBUF TIME: .ASCII /DATE = / DAY: .ASCII / / .ASCII / - / MONTH: .ASCII / / .ASCII / - / YEAR: .ASCII / / .ASCII /TIME = / HOUR: .ASCII / / .ASCII /:/ MINUTE: .ASCII / / .ASCII /:/ SECND: .ASCII / / TIMSZ=.-TIME ;******************************************************************************* .PAGE ;******************************************************************************** .SBTTL SET UP THE MONTHS BUFFER. .EVEN MTHS: .ASCII <1>/JAN/ ;JANUARY .ASCII <2>/FEB/ ;FEBRUARY .ASCII <3>/MAR/ ;MARCH .ASCII <4>/APR/ ;APRIL .ASCII <5>/MAY/ ;MAY .ASCII <6>/JUN/ ;JUNE .ASCII <7>/JUL/ ;JULY .ASCII <8.>/AUG/ ;AUGUST .ASCII <9.>/SEP/ ;SEPTEMBER .ASCII <10.>/OCT/ ;OCTOBER .ASCII <11.>/NOV/ ;NOVEMBER .ASCII <12.>/DEC/ ;DECEMBER, QUICK YEAR, WASN'T IT ;************************************************************************************ .PAGE ;********************************************************************************* .SBTTL SET UP INSTRUCTION AND IDENTIFIER BUFFER. PR2: .ASCII <033><110><033><112><033><110> ;CLEAR THE SCREEN. .ASCII /[ Gripe -- The users feedback forum. V1.0 ]/ .ASCII /[ Gripe -- Enter your comments or "Gripes" ]/ .ASCII /[ Gripe -- After the prompt below. There ]/ .ASCII /[ Gripe -- is no need to say who you are ]/ .ASCII /[ Gripe -- since the function of Gripe is ]/ .ASCII /[ Gripe -- for the user to comment about the ]/ .ASCII /[ Gripe -- System. All comments are reviewed ]/ .ASCII /[ Gripe -- once weekly by the system manager ]/ .ASCII /[ Gripe -- and any action and-or response to ]/ .ASCII /[ Gripe -- legitimate gripes will be posted in ]/ .ASCII /[ Gripe -- the computer center. Type "X" to ]/ .ASCII /[ Gripe -- exit this routine. ] / .ASCII PR2SZ=.-PR2 ;******************************************************************************* .PAGE ;******************************************************************************* ; SET UP DELIMITER FOR USE AS A SEPARATOR IN THE ; OUTPUT FILE. .SBTTL SET UP THE INTERNAL FILE DELIMITERS. DELIM: .ASCII /[GRIPE--START OF MESSAGE]/ DELIMS=.-DELIM .EVEN ; SET UP SECOND DELIMITER FOR USE TO END MESSAGE ; IN OUTPUT FILE. .EVEN DELIM1: .ASCII /[GRIPE--END OF MESSAGE]/ DELM1S=.-DELIM1 ;******************************************************************************* .PAGE ;******************************************************************************* ; SET UP MISCELLANEOUS STORAGE. .SBTTL MISCELLANEOUS STORAGE. .EVEN IOSTAT: .BLKW 2. ;I/O STATUS BLOCK. I LIKE IT. X: .ASCII /X / FPRO: .WORD ^B 0110111111111111 ;FILE PROTECTION WORD ; SET UP ERROR MESSAGES. .SBTTL ERROR MESSAGES. GR.ERR: .ASCII /[ Gripe -- Error, call system manager at X-226 ]/ .ASCII /[ Gripe -- Output file doesn't exist, or has ]/ .ASCII /[ Gripe -- wrong file protection. ]/ .ASCII /[ Gripe -- Exit ] / GR.ERS=.-GR.ERR GR.MNG: .ASCII /Attn. SYSTEM MANAGER:/ .ASCII /Please set the protection on DB1:[1,1]GRIPE.LST/ .ASCII /to WO:WE / .ASCII GR.MNS=.-GR.MNG ; LET'S START THE EXECUTABLE CODE ON A FRESH PAGE. ;******************************************************************************* .PAGE ;******************************************************************************* .SBTTL START MAIN PROCEDURE. .EVEN START: FINIT$ ; GET THE TIME AND DATE INFO. DIR$ #GTDI ;GET TIME AND DATE INFO. ; CONVERT IT TO A PRINTABLE GRAPHIC. CVTA$ DTBUF,#YEAR,#0 ;YEAR CVTA$ DTBUF+4,#DAY,#0 ;DAY ; NOW FOR THE TIME. CVTA$ DTBUF+6,#HOUR,#0 ;HOURS CVTA$ DTBUF+8.,#MINUTE,#0 ;MINUTES CVTA$ DTBUF+10.,#SECND,#0 ;SECONDS ; CHANGE THE MONTH TO A 3-CHARACTER STRING MOV #12.,R3 ;MONTH COUNT. MOV #MTHS,R4 ;GET POINTER. GR.MTH: CMPB (R4),DTBUF+2 ;USE LOW-ORDER BYTE OF MONTH WORD. BEQ GR.FLN ;YES, THEN FILL IN THE MONTH. ADD #4,R4 ;POINT TO NEXT MONTH. SOB R3,GR.MTH ;GO CHECK NEXT MONTH. ; IF THE MONTHS DON'T MATCH, THEN PRINT THE NUMERIC ; FOR THE SYSTEMS PROGRAMMER. CVTA$ DTBUF+2,#MONTH,#0 ;CONVERT THE MONTH TO PRINT GRAPHIC BR GR.INS ;CONTINUE. ; NOW FILL IN THE MONTH STRING. ; R4 POINTS TO THE BYTE PREVIOUS TO THE ; MONTH STRING THAT IS REQUIRED, SO ; POINT TO THE NEXT BYTE AND PLACE ; IN OUTPUT BUFFER. GR.FLN: INC R4 ;POINT TO STRING MOVB (R4),MONTH ;MOVE 1ST BYTE MOVB 1(R4),MONTH+1 ; MOV LAST TWO BYTES. MOVB 2(R4),MONTH+2 ;******************************************************************************* .PAGE ;******************************************************************************* .SBTTL NOW, PRINT INSTRUCTIONS TO THE USER, AND OPEN THE FILE ; NOW PRINT THE INSTRUCTIONS TO THE USER. GR.INS: PRINT #PR2,#PR2SZ ;OUTPUT TO TERMINAL .SBTTL OPEN THE OUTPUT FILE FOR APPEND. GR.OPN: OPEN$A #FDBGRP ;OPEN OUTPUT FILE IN APPEND MODE. ; SEE IF FILE WUS OPENED OK. ; IF NOT, TELL USER TO CALL MANAGER AND GRIPE!!!! BCC GR.DLM ;IF CARRY CLEAR THEN WE'RE ALL SET. ;******************************************************************************* .PAGE ;******************************************************************************* ; IF CARRY BIT IS SET THEN THE OUTPUT FILE IS EITHER LOCKED OR ; DELETED. THEREFORE I WILL CREATE THE FILE AND TRY TO REOPEN IT ; AGAIN. .SBTTL CREATE NEW FILE IF OLD IS NON-EXISTANT ; FIRST SET THE DEFAULT FILE PROTECTION WORD MOV FPRO,R1 ;GET PROTECTION WORD CALL .WDFFP ;SET IT TO WO:WE OPEN$W #FDBGRP ;CREATE THE OUTPUT FILE. BCC GR.OK ;IF CARRY WASN'T SET, THEN I GUESS WE'RE OK. ; REMEMBER, YOU CAN ONLY CREATE FROM [1,1]. SO PRINT A MESSAGE ; TO THE USER THAT GRIPE ISN'T WORKING AND TO CALL THE SYSTEM ; MANAGER AND GRIPE!!!!!. ; THEN THE SYSTEM MANAGER CAN LOGIN AND INVOKE ; THIS ROUTINE TO CREATE THE OUTPUT FILE. ; PRINT ERROR MESSAGE TO USERS TERMINAL. PRINT #GR.ERR,#GR.ERS ;WRITE TO THE TERMINAL. JMP GR.FIN ;WELL SAY GOODNIGHT DICK. GR.OK: CLOSE$ #FDBGRP ;DON'T FERGIT TO CLOSE IT TO CREATE IT. PRINT #GR.MNG,#GR.MNS ;REMIND THE MANAGER TO SET FILE PROTECT TO ;WO:WE JMP GR.OPN ;TRY TO REOPEN THE FILE. ;******************************************************************************* .PAGE ;******************************************************************************* ; NOW OUTPUT THE STARTING DELIMITER TO THE FILE. ; IT SHOWS THE MANAGER WHERE THE MESSAGES ARE SPLIT AT. .EVEN GR.DLM: PUT$ #FDBGRP,#DELIM,#DELIMS ;PRINT THE DELIMITER. ; ALSO PRINT THE TIME AND DATE OF THE MESSAGE. PUT$ #FDBGRP,#TIME,#TIMSZ ;PUT THIS IN THE OUTPUT FILE. ;******************************************************************************* .PAGE ;******************************************************************************* ; NOW PROMPT AND READ A RECORD. IF END OF FILE ; WAS ENCOUNTERED, THEN CLOSE UP SHOP AND EXIT. .SBTTL PROMPT AND READ A RECORD GR.AGN: PRINT #PR1,#PR1SZ ;PROMPT TO THE USER DIR$ #READ ;READ THE RECORD. BCS GR.FIN ;ON ENDFILE,(^Z) STOP AND EXIT. CMPB INBUF,X ;SEE IF DONE. BEQ GR.FIN ;YES, CLOSE AND EXIT ;CLOSE UP SHOP AND LEAVE. ;******************************************************************************* .PAGE ;******************************************************************************* ; WORD TWO OF THE I/O STATUS BLOCK CONTAINS THE ; NUMBER OF BYTES TRANSFERRED IN THE READ. SO ; SINCE WE ARE CREATING A V-LENGTH RECORD. ALL WE ; HAVE TO DO IS TO USE THIS LITTLE BIT OF INFORMATION ; IN THE PUT$ WHICH MAKES OUR JOB ALL THE EASIER. .SBTTL WRITE A RECORD PUT$ #FDBGRP,#INBUF,IOSTAT+2 ;WRITE A RECORD. BR GR.AGN ;GO BACK AND DO YET ANOTHER RECORD. ; ON END OF FILE, PLACE END OF MESSAGE DELIMITER TO ; SPLIT UP THE MESSAGES IN THE FILE AND CLOSE ALL THE ; FILES AND LEAVE. .SBTTL CLOSE UP SHOP AND EXIT. GR.FIN: PUT$ #FDBGRP,#DELIM1,#DELM1S ;WRITE THE DELIMITER. CLOSE$ #FDBGRP ;CLOSE THE OUTPUT FILE EXIT$S ;EXIT GRACEFULLY (ALWAYS) .END START ;GOODBYE. ;******************************************************************************* ;*******************************************************************************