.PSECT ME .TITLE ME - GET MY MAIL .IDENT /811116/ ; ; THIS CODE HAS BEEN DEVELOPED BY THE COMPUTING ; GROUP OF THE ATMOSPHERIC SCIENCES DIVISION, ; ALBERTA RESEARCH. THIS WORK FUNDED BY THE ; ALBERTA WEATHER MODIFICATION BOARD. ; ; THERE IS EXPLICITLY NO COPYRIGHT ON THIS SOFTWARE, ; AND ITS DISTRIBUTION IS ENCOURAGED. NO RESPONSIBILITY ; NOR GUARANTEE IS MADE OR ASSUMED BY THE AUTHOR, OR ; BY ALBERTA RESEARCH. ; ; SUGGESTIONS OR CHANGES ARE INVITED, AND WILL BE ; DISTRIBUTED TO OTHER USERS OF THIS SOFTWARE THROUGH ; THE DECUS IAS/RSX SPECIAL INTEREST GROUP. ; ; ; VERSION: 781020 ; WRITTEN BY: MARK JOHNSON ; DATE WRITTEN: 23-OCT-78 ; ; RELATED DOCUMENTATION: ; NONE ; ; ; ROUTINES USED: ; OPNMAI ; TERM ; MAIL ; RDPMPT ; CSPARS ; FN2FDB ; ; ; MODIFICATIONS: ; ; CODE NAME DATE ; JGD20 J. DOWNWARD 06-MAY-80 USER MAY NOT WRITE TO MAILBAG ; NOT ON HIS/HER UIC. ; JGD21 J. DOWNWARD 15-Nov-81 Make first TAB a space for ; display. ;+ ; *** - ME - GET MY MAIL ; ; INPUTS: ; NONE ; ; OUTPUTS: ; NONE ; ; SIDE EFFECTS: ; MAIL FILE FOR THIS USER IS OPENED. ; EACH MESSAGE IS COPIED TO THE TERMINAL, ; AND A REPLY IS SOLICITED. ; AFTER THE LAST MESSAGE, THE USER IS ASKED IF ; THE MAIL IS TO BE SAVED, DELETED, OR LEFT UNTOUCHED. ; ;- .MCALL TTYOUT,PSTR,ENTER,LEAVE .MCALL GET$,DELET$,CLOSE$,NMBLK$,OPEN$,PUT$ .MCALL FDOF$L,IOERR$,FCSBT$ FDOF$L ;DEFINE FDB OFFSETS FCSBT$ ;DEFINE FCS BITS IOERR$ ;DEFINE I/O ERROR CODES .MCALL MAIGBL,MAIHED MAIGBL ;DEFINE GLOBALS WITHIN MAIL MAIHED ;DEFINE HEADER OFFSETS .DSABL GBL .NLIST BEX ; ; NUMBER OF LINES TO USE IN REPLY REPLIN=2 ; ; STORAGE FOR LINES TO BE USED IN REPLY ; FORMAT: BYTECOUNT,LINE ; REPBUF: .BLKB REPLIN* ;THESE LINES ARE USED IN A REPLY REPEND: .BLKB MAXLIN+2 ;THIS IS USED FOR LINES THAT AREN'T ; .ENABLE LC ; PROMPTS USED WHEN ASKING FOR A REPLY DESFLG: .BYTE 0 ;FLAG SO REPLY DESCR. IS GIVEN ONLY ONCE DESREP: .ASCII <12>/Enter your reply, followed by CTRL-Z./<15> DSRL=.-DESREP ; REPPMT: .BYTE RPL .ASCII <12>/ Reply>/ RPL=.- ; ; LABEL USED IN A REPLY HEADER REPLAB: .ASCII />REPLY< / ; ; PROMPTS USED WHEN ASKING IF MAIL SHOULD BE SAVED SAVPMT: .BYTE SVL .ASCII <12>/Save this mail? / SVL=.- ; SAVERR: .ASCII <12>/***ERROR*** - Proper responses are:/<15> .ASCII <12>/ - Leave mail in box/<15> .ASCII <12>/ NO - Delete mail/<15> .ASCII <12>/ YES - Save mail/<15> SVEL=.-SAVERR .EVEN NOUIC: .ASCII <12>/MAIL -- UIC may not be specified/<15> ; JGD20 NOUICL=.-NOUIC ; JGD20 ; BAGPMT: .BYTE BGL .ASCII <12>/Where is your mailbag? / BGL=.- .EVEN ; ; DEFAULT MAILBAG BAGDEF: NMBLK$ MAILBAG,TXT,,SY,0 ; .ENABLE LC MTBOX: .ASCII <12>/Your mailbox is empty./<15> MTLEN=.-MTBOX ; CONFRM: .ASCII <12><12>/MAIL saved in file: / SAVFIL: .BLKB 30. ; ; SPECIAL CHARACTERS HT=11 ;A TAB AT THE FRONT OF EVERY LETTER LINE ; ; ; ; EXTERNAL GLOBALS .GLOBL UICFLG ; ; OPEN MAIL FILE ; ME: CALL OPNMAI BCC 1$ ;CC => THERE IS MAIL, GO AND READ IT. RETURN ;NO MAIL, NOTHING FOR US TO DO 1$: ENTER R0,R1,R2,R3 CLRB DESFLG ;ALLOW REPLY DESCRIPTION PROMPT ; ; READ FIRST HEADER (MUST BE ONE IF THERE IS A FILE) ; MOV #REPBUF+1,R1 ;ADDRESS OF SPACE TO STORE REPLIES GET$ #INDFDB,R1,#MAXLIN+1,IOERR ; ; SAVE INFO FOR REPLY ; SAVREP: CMP R1,#REPEND BHIS WRTLIN ;DON'T NEED TO SAVE THIS ONE MOVB F.NRBD(R0),-(R1) ;SAVE THE LENGTH CMP F.NRBD(R0),#MAXLIN+1 ;IS THIS A LONG LINE? BLT 1$ ;NO, LEAVE IT ALONE DECB @R1 ;YES, DROP ONE CHARACTER 1$: ADD #MAXLIN+3,R1 ;MOVE TO NEXT FREE SPOT IN BUFFER ; ; WRITE LINE TO THE TERMINAL ; WRTLIN: PSTR ^*<12>* TTYOUT F.NRBD+2(R0),F.NRBD(R0) PSTR ^*<15>* ; ; READ NEXT LINE FROM FILE ; CLRB -1(R1) ;CLEAN OUT THE BYTECOUNT BYTE CLRB @R1 ;DON'T GET CONFUSED WITH THE PREV LINE GET$ R0,R1,#MAXLIN+1 ;GET THE NEXT LINE BCC 5$ ;EVERYTHING IS KOSHER CMPB F.ERR(R0),#IE.EOF ;ONLY AN END-OF FILE? BEQ 51$ ;...THEY ARE OK. CALL IOERR ;COMPLAIN ABOUT OTHERS. 5$: CMPB @R1,#HT ;WAS THIS A LETTER LINE? ; BEQ SAVREP ;NOT A HEADER, JUST WRITE IT ;jgd21 BNE 51$ ; A header or EOF ;jgd21 MOVB #40,@R1 ; Convert HT to space ;JGD21 BR SAVREP ; And write it out ;JGD21 ; ; HEADER OR EOF ; ; DOES THIS MESSAGE NEED A REPLY? ; 51$: CMPB REPLAB,REPBUF+1+MA.LAB ;CHECK STORED LABEL BEQ 1$ ;EQ => REPLY ; ; SOLICIT AND SEND REPLY ; CALL SNDREP ; ; ANY MORE MESSAGES AFTER THIS ONE? ; 1$: CMPB F.ERR(R0),#IE.EOF ;AT EOF? BEQ FSAVE ;YES, ASK ABOUT SAVING THE FILE MOV #REPBUF+1,R2 ;MOVE THE LAST HEADER TO THE FIRST BUF MOV #MA.SIZ,R3 ;LENGTH OF A HEADER 15$: MOVB (R1)+,(R2)+ ;MOVE ONE BYTE SOB R3,15$ MOV #REPBUF+1,R1 ;RESTABLISH BUFFER POINTER MOV #MA.SIZ,F.NRBD(R0) ;IN CASE .POINT DOESN'T FILL IT IN! BR SAVREP ;AND WORK ON THE NEXT MESSAGE ; ; ASK IF FILE SHOULD BE SAVED ; (THERE ARE THREE POSSIBLE ANSWERS:) ; - LEAVE EVERYTHING AS IS ; N - DELETE MAIL FILE ; Y - ASK FOR FILE NAME TO BE APPENDED TO (OR CREATED) ; OTHER RESPONSES GENERATE AN ERROR MESSAGE, AND RETRY ; FSAVE: MOV #SAVPMT,R1 ;PREPARE PROMPT FOR SAVE CALL RDPMPT ;ASK THE QUESTION ; TST TTYSB+2 ;ANYTHING TYPED? BEQ 3$ ;EQ => NOTHING TYPED ; CMPB LINBUF,#'N ;NO, OR SOMETHING LIKE IT? BEQ 4$ .ENABL LC CMPB LINBUF,#'n BEQ 4$ ; CMPB LINBUF,#'Y ;YES, BY GOSH! BEQ 7$ CMPB LINBUF,#'y BEQ 7$ ; ; SOMETHING OTHER THAN CR, N OR Y WAS TYPED ; TTYOUT #SAVERR,#SVEL ;EXPLAIN CORRECT RESPONSE BR FSAVE ;AS FOR DISPOSAL INSTRUCTIONS AGAIN ; ; , DO NOTHING AT ALL 3$: CLOSE$ R0,IOERR ;JUST CLOSE THE FILE BR 6$ ;AND QUIT ; ; YES, WE SHOULD SAVE THE MAIL 7$: CLR R1 ;PREPARE TO REWIND FILE CLR R3 MOV #1,R2 CALL .POINT ;REWIND THE FILE ; 74$: MOV #BAGPMT,R1 ;PREPARE TO ASK FOR MAILBAG FILE CALL RDPMPT ;ASK MOV #OUTFDB,R2 ;READY TO OPEN OUTPUT FILE CLR F.DSPT(R2) ;NO DATASET DESCRIPTOR YET TST TTYSB+2 ;ANYTHING TYPED? BEQ 71$ ;NO, JUST USE DEFAULT MOV #LINBUF,R0 ;POINT AT RESPONSE CALL CSPARS ;TRY THIS ON AS A FILENAME BCS 74$ ;CLUMSY OAF! TST UICFLG ; WAS UIC SPECIFIED ; JGD20 BEQ 71$ ; IF EQ, NO, ALL OK ; JGD20 TTYOUT #NOUIC,#NOUICL ; WARN USER OF ERROR ; JGD20 BR 74$ ; AND ASK AGAIN ; JGD20 ; 71$: OPEN$ R2,#FO.APD,,,#BAGDEF ;READY TO OPEN THE MAILBAG BCC 72$ ;ALL OK => READY TO COPY CMPB F.ERR(R2),#IE.NSF ;NO BAG HERE? BEQ 73$ ;THAT'S NOT MUCH OF A PROBLEM CALL IOERR ;ANYTHING ELSE IS BIG TROUBLE 73$: OPEN$ R0,#FO.WRT,,,,,,,IOERR ;WE'LL MAKE A MAILBAG 72$: CALL COPY ;AND FILL IT. MOV #INDFDB,R0 ;POINT AT THE MAILBOX FILE ; ; NO, DELETE THE MAIL FILE 4$: DELET$ R0,IOERR ;DELETE THE MAIL FILE TTYOUT #MTBOX,#MTLEN ;TELL HIM NOTHING'S LEFT! ; 6$: LEAVE RETURN ; ; SOLICIT AND SEND REPLY ; ; R1 POINTS TO THE FIRST BYTE OF THE LAST RECORD READ ; SNDREP: ENTER R0,R1,R2,R3 CLRB -(R1) ;ZERO BYTECOUNT TO TERMINATE PREFIX ; ; CHECK TO SEE IF WE SHOULD REPLY ; ; IF IT'S FROM ME, I WON'T REPLY! ; MOV #REPBUF+1+MA.UIC+1,R0 ;POINT AT SENDER UIC MOV #OURUIC,R1 ;AND OUR UIC .REPT 3 CMPB (R0)+,(R1)+ ;CHECK THE GROUP NUMBER BNE 2$ ;IF DIFFERENT, AINT US. .ENDR INC R0 ;SKIP THE COMMA .REPT 3 CMPB (R0)+,(R1)+ ;CHECK THE MEMBER BNE 2$ .ENDR BR 3$ ;THIS IS US, NO REPLY! ; ; DON'T REPLY TO THE MYSTERY MAILER, EITHER! ; 2$: MOV #MYSTER,R0 MOV #REPBUF+1+MA.NAM,R1 22$: CMPB (R0)+,(R1)+ BNE 23$ TSTB @R0 BNE 22$ 3$: LEAVE RETURN ; ; SAVE THE POSITION OF THE FILE FOR RE-OPENING ; 23$: MOV #INDFDB,R0 ;POINT AT OUR FDB CALL .MARK ;WHERE ARE WE? MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) CLOSE$ R0,IOERR ;CLOSE IT UP ; TSTB DESFLG ;DESCRIBE REPLY? BNE 1$ ;NO, WE DID IT ONCE TTYOUT #DESREP,#DSRL ;YES, TELL HIM HOW TO REPLY DECB DESFLG ;AND REMEMBER WE DID IT. ; 1$: MOV #REPBUF,R2 ;POINT AT PREFIX LINES 13$: TSTB (R2)+ ;END OF PREFIX? BEQ 11$ ;YES CMPB @R2,#HT ;ORDINARY LINE? BNE 12$ ;NO, LEAVE IT ALONE MOVB #'*,@R2 ;YES, REPLACE TAB WITH * 12$: ADD #MAXLIN+1,R2 ;MOVE TO NEXT BYTECOUNT BR 13$ ; 11$: MOV #REPPMT,R1 ;SET UP PROMPT FOR TERM MOV #INPFDB,R0 ;USE THE INPUT FILE FDB FOR THE REPLY MOV #REPBUF,R2 ;POINT AT PREFIX LINES CALL TERM ;BUILD TEMPORARY FILE WITH REPLY MOV #REPBUF+1+MA.NAM-1,R1 ;ONE BYTE BEFORE NAME IN HEADER MOVB #14.,@R1 ;INSERT PROPER BYTECOUNT MOV #REPLAB,R2 ;SET UP LABEL FOR REPLY FILE HEADER CALL MAIL ;SEND THE REPLY CALL FN2FDB ;RESTORE THE FILENAME BLOCK DELET$ R0,IOERR ;DELETE THE TEMPORARY FILE ; ; REPOSITION THE FILE NOW ; CALL OPNMAI ;OPEN THE SUCKER MOV (SP)+,R3 ;GET THE POSITION BACK MOV (SP)+,R2 MOV (SP)+,R1 MOV #INDFDB,R0 CALL .POINT ;AND MOVE TO THE PROPER PLACE! LEAVE RETURN MYSTER: .ASCIZ /MYSTERY MAILER/ .EVEN ; ; COPY INDFDB TO OUTFDB AND BRAG ABOUT IT ; ; OUTFDB INDFDB ; ON ENTRY: OPEN OPEN(AT BEGINNING) ; ON EXIT: CLOSED OPEN ; ; COPY: ENTER R0,R1,R2 MOV #INDFDB,R1 ;INPUT FDB ADDRESS MOV #OUTFDB,R2 ;OUTPUT FDB ADDRESS MOV #LINBUF,F.URBD+2(R1) ;INPUT FDB BUFFER ADDRESS MOV #MAXLIN+1,F.URBD(R1) ;...AND LENGTH MOV #LINBUF,F.NRBD+2(R2) ;OUTPUT FDB BUFFER ADDRESS ; 1$: GET$ R1 ;READ A RECORD BCS 2$ ;A PROBLEM? CMPB LINBUF,#HT ; A leading tab? ;jgd21 BNE 101$ ; If no skip ;jgd21 MOVB #40,LINBUF ; If yes, make it a space ;JGD21 101$: PUT$ R2,,F.NRBD(R1),IOERR ;NO PROBLEM, WRITE THE LINE BR 1$ ;OVER AND OVER ; 2$: CMPB F.ERR(R1),#IE.EOF ;WAS IT JUST THE END? BEQ 3$ ;YES, NO PROBLEM CLOSE$ R2,IOERR MOV R1,R0 ;MAKE SURE THE ERRORS APPLY TO THE RIGHT FILE CALL IOERR ;NO, THAT IS A PROBLEM 3$: CLOSE$ R2,IOERR MOV #SAVFIL,R1 ;POINT AT ADDRESS OF FILENAME CALL FMTFNM ;FORMAT THE FILENAME MOVB #15,(R1)+ ;ADD A CARRIAGE RETURN SUB #CONFRM,R1 ;CALCULATE LENGTH TTYOUT #CONFRM,R1 ;ISSUE CONFIRMATION LEAVE RETURN ;+ ; *** - FMTFNM - FORMAT FILE NAME ; ; INPUTS: ; R0 - POINTS TO APPROPRIATE FDB ; R1 - POINTS TO OUTPUT AREA ; ; OUTPUTS: ; R1 - ADVANCED TO END OF FILENAME ;- FMTFNM: ENTER R0,R2,R5 MOV R0,R5 MOV R1,R0 ;MOVE TO A HANDIER REGISTER ; MOVB N.DVNM+F.FNB(R5),(R0)+ ;MOVE THE DEVICE MOVB N.DVNM+1+F.FNB(R5),(R0)+ ; MOV N.UNIT+F.FNB(R5),R1 ;GET UNIT CLR R2 ;ZERO SUPPRESS CALL $CBOMG ;CONVERT TO OCTAL MOVB #':,(R0)+ ;ADD THE COLON ; MOV N.FNAM+F.FNB(R5),R1 ;NOW THE FILENAME CALL $C5TA ;CONVERTING MOV N.FNAM+2+F.FNB(R5),R1 BEQ 1$ CALL $C5TA MOV N.FNAM+4+F.FNB(R5),R1 BEQ 1$ CALL $C5TA 1$: CMPB -(R0),#' ;REMOVE TRAILING BLANKS BEQ 1$ INC R0 MOVB #'.,(R0)+ ; MOV N.FTYP+F.FNB(R5),R1 CALL $C5TA MOVB #';,(R0)+ MOV N.FVER+F.FNB(R5),R1 CLR R2 CALL $CBOMG MOV R0,R1 LEAVE RETURN .END