.PSECT MAIL .MCALL TINIT,TTYOUT,PSTR,PCRLF .MCALL GTIM$S,CALLR,CLOSE$,EXIT$S .MCALL FINIT$,GMCR$,GTSK$S,MRKT$ .MCALL OPEN$W,OPEN$A,OPEN$R,DELET$ .MCALL PUT$,GET$ .MCALL WTSE$S,QIOW$ .MCALL FDBDF$,FDAT$A,FDOP$A,FDRC$A,FDBF$A .MCALL FSRSZ$ .SBTTL THE PREAMBLE ; ;+ ; ; MAIL - PROGRAM TO ENTER MAIL INTO THE ; SPECIFIED ACCOUNT'S MAIL FILE. ; ; THE MAIL FILE IS ASSUMED TO BE UNDER ; [10,3] WITH A FILE NAME THE SAME ; AS THE ADDRESSIES UIC. ; ; THERE IS ONLY ONE FILE ACTIVE AT ANY TIME, ; EITHER THE ACCOUNT FILE, OR THE MAIL FILE, ; BUT NEVER BOTH. ; ; VERSION: 03 ; BY: W. KORENDYK ; DATE: 7/4/77 ; ;- ; .SBTTL THE MAIN PROGRAM ; ; THE MAIN PROGRAM ; MAIL: TINIT LUN1,EFN1 ;PREPARE OUTPUT ; ; THE FIRST THING WE SHOULD DO IS GET THE GUY ; TO WHOM THE MAIL IS DESTINED. GETGUY SHOULD ; BE TOTALLY SELF CONTAINED, AND SHOULD INITIALIZE ; THE LOCATIONS UIC, GROUP, MEM APPROPRIATELY. ; CALL GETGUY BCS OUT ;GUY NOT FOUND OR SOMETHING ; ; IF THE GUY WAS NOT FOUND, THEN ALL WE NEED ; DO NOW IS OPEN THE FILE. NOTE THAT THE FDB OF THE ; MAIL FILE HAS 'UIC' AS THE FILENAME IN THE DSDS, ; AND THIS SHOULD HAVE BEEN SET UP BY GETGUY. ; FINIT$ ;PREPARE THE FILES MOV #MAFILE,R0 ;WE HENCEFORTH KEEP R0 OPEN$A ;OPEN FOR APPEND BCC 1$ ;ALL IS OKAY CMPB #IE.NSF,F.ERR(R0) ;NO SUCH FILE?? BEQ 2$ ;THEN MAKE IT CALL IOERR ;SOMETHING ELSE. ; ; AT 2$ WE NEED TO CREATE THE FILE. BUT THE OWNER ; BETTER BE THE GUY, AND THE PROTECTION CODE SHOULD ; BE KOSHER. ; 2$: MOV #110000,R1 ;WORLD WITH WE ACCESS CALL .WDFFP ;FOR THE MAIL FILE ; CLR R1 MOVB GRP,R1 ;GET GROUP NUMBER SWAB R1 ; IN HIGH BYTE, BISB MEM,R1 ;AND MEM IN LOW. CALL .WFOWN ;MAKE GUY OWNER ; ; WE CAN NOW OPEN THE NEW FILE AND BEGIN WRITING ; OPEN$W ,,,,,,IOERR ; 1$: CALL OUTDTU ;OUTPUT DATE, TIME, UIC ; ; WE CAN NOW THE READ AND WRITE LOOP OF THE MAIL. ; 4$: TTYOUT #PROMPT,#LPROM ;ISSUE PROMPT DIR$ #READIT ;READ IN MOV IOSB+2,R4 ;GET LENGTH CALL OUTLIN ;OUTPUT LINE CMPB #IE.EOF,IOSB ;EOF ENCOUNTERED? BNE 4$ ;NO ; ; DIE:: CLOSE$ ;CLOSE THE MAIL FILE OUT: EXIT$S ; ERRPFX::PSTR ^*/MAIL - /* RETURN ; ; ; THE MAIL FILE FDB ; .SBTTL THE MAIL FILE FDB ; MAFILE: FDBDF$ FDAT$A R.VAR,FD.CR FDRC$A ,BUF,80. FDOP$A LUN2,DSD FDBF$A EFN1 ; DSD: .WORD LDEV,DEV .WORD LDIR,DIR .WORD LUIC,UIC ; ; THE DEVICE ; DEV: .ASCII /DM1:/ LDEV=.-DEV ; ; THE DIRECTORY ; DIR: .ASCII /[10,3]/ LDIR=.-DIR ; ; THE FILE NAME ; LUIC=12 ;000000.TXT .SBTTL OUTLIN - OUTPUT LINE ; ; THE FOLLWING IS THE ROUTINE USED TO ; OUTPUT THE LINE TO THE FILE. IT ASSUMES ; THAT R0 POINTS TO THE FILE'S FDB, R3 HOLDS ; THE ADDRESS OF THE BUFFER, AND THAT R4 HAS ; THE LENGTH OF THE LINE TO BE OUTPUT. ; OUTLIN: TST R4 BEQ 1$ ;NOTHING TO OUTPUT MOVB #TAB,@R3 ;TAB LINE IN INC R4 ;INCLUDE TAB TO LENGTH PUT$ ,,R4,IOERR 1$: RETURN .SBTTL OUTDTU - OUTPUT DATE & TIME ; ; THE FOLLOWING ROUTINE WILL OUTPUT THE TIME AND ; THE DATE INTO THE MAILFILE, ALONG WITH ; THE UIC OF THE CURRENT TASK, THAT IS, THE UIC OF ; THE TERMINAL, AND THEREFORE THE UIC OF THE SENDER. ; ; ; THE TIME CODE TM.COD DETERMINES THE TIME LENGTH. ; TM.COD=4 ; OUTDTU: MOV R0,-(SP) ;SAVE #FDB ; ; NOW PUT THE TIME AND DATE INTO THE FILE ; GTIM$S #TIME ;GET TIME INFO MOV #BUF,R0 ;GET BUFFER ADDR. MOV R0,R3 ;AND KEEP IN R3 MOVB #CR,(R0)+ ;SPACE ENTRIES. MOVB #LF,(R0)+ MOV #TIME,R1 ;START WITH DATE CALL $DAT ;AND CONVERT MOVB #40,(R0)+ ;SPACE THINGS MOV #TM.COD,R2 ;TIME LENGTH CODE CALL $TIM ;CONVERT TIME ; ; ALONG WITH THE TASKS (AND THEREFORE THE TERMINALS) ; DEFAULT UIC. ; MOVB #40,(R0)+ ;SPACE THINGS MOV R0,-(SP) ;REMEMBER THIS TO MOVE ; INTO OURUIC FOR OUR MAIL ; ; THIS GTSK$S IS USED SO THAT THE UIC PRINTED OUT ; IS COMPRESSED, IE. NO LEADING ZEROS. ; MOVB #'[,(R0)+ ;THE "[" GTSK$S #TIME ;RE-USE THE TIME BUFFER MOVB TIME+G.TSGC,R1 ;GET GROUP CODE BIC #177400,R1 ;CLEAR HIGH BYTE. CLR R2 ;SUPPRESS ZEROS CALL $CBOMG ;CONVERT TO OCTAL MOVB #',,(R0)+ ;THE "," MOVB TIME+G.TSPC,R1 ;GET MEMBER CODE BIC #177400,R1 ;CLEAR HIGH BYTE. CLR R2 ;SUPPRESS ZEROS CALL $CBOMG ;CONVERT IT TO OCTAL MOVB #'],(R0)+ ;FINAL "]" ; ; THE FOLLOWING LINES ARE INCLUDED SO THAT THE ; SENDER'S UIC IS KEEP AROUND. ; MOV (SP)+,R2 ;GET WHERE IT STARTED MOV R0,R4 ;A WORK REG SUB R2,R4 ;IT'S LENGTH MOV R4,LOUIC ;SAVE THE LENGTH FOR NEWFILE MOV #OURUIC,R1 ;WHERE TO 1$: MOVB (R2)+,(R1)+ ;MOVE IT SOB R4,1$ ; ; WE NOW MOVE IN THE ACCOUNT NAME AS WAS KEPT BEFORE ; WHEN WE DETERMINED THE SENDER AND THE SENDEE. ; MOVB #40,(R0)+ ;SPACE THINGS MOV #14.,R2 ;LENGTH OF ACCOUNT NAME. MOV #OURNAM,R1 ;WHERE WE KEPT IT. 12$: MOVB (R1)+,(R0)+ ;MOVE IT IN. SOB R2,12$ ; SUB R3,R0 ;GET LENGTH OF THE RECORD MOV R0,R4 ;USE REG THAT PUT$ DOESN'T MOV (SP)+,R0 ;GET #FDB BACK PUT$ ,R3,R4,IOERR ;OUTPUT LINE RETURN TIME: .BLKW 16. ; ; CONSTANTS ; LUN1 = 1 ; TI LUN LUN2 = 2 ; ACCOUNT FILE LUN EFN1 = 1 ; EVENT FLAG FOR ALL I/O DELIM=32 ;THE DELIMETER (CTRL/Z) TAB=11 ; ; ; LOCAL DATA ; .NLIST BEX ; ACCT: .ASCIZ /TO WHO? / LACCT=.-ACCT ; ERROR MESSAGES ; PROMPT: .ASCII /MAIL>/ LPROM=.-PROMPT ER1: .ASCIZ /MAIL - SYNTAX ERROR/ LER1=.-ER1 ER2: .ASCIZ /MAIL - INVALID ACCOUNT/ LER2=.-ER2 ER4: .ASCIZ /MAIL - COMMAND INPUT ERROR/ LER4=.-ER4 ER6: .ASCIZ /MAIL - ACCOUNT FILE OPEN FAILURE/ LER6=.-ER6 .LIST BEX .EVEN GRP: .WORD 0 ; GROUP CODE MEM: .WORD 0 ; MEMBER CODE .BLKB 4 ; UIC: .ASCII /000000.TXT/ ; UIC NAME: .BLKB 14. ; LAST NAME AREA IF NAME SPECIFIED VS ACCOUNT .EVEN ODPB: QIO$ IO.WVB,LUN1,EFN1,,,, ; OUTPUT DPB IDPB: QIO$ IO.RVB,LUN1,EFN1,,IOSB,, ; INPUT DPB FDPB: QIO$ IO.RVB,LUN2,EFN1,,IOSB,,<$ACTBF,$BFLEN,,,1> READIT: QIOW$ IO.RVB,LUN1,EFN1,,IOSB,, IOSB: .BLKW 2 ; I/O STATUS BLOCK FILOPN: .WORD 0 ; FILE OPEN FLAG 0-NO, 1-YES ENTRY: .WORD 0 ; ADDRESS OF ACCOUNT ENTRY OPNERR: .WORD 0 ; ACCOUNT FILE OPEN ERROR FLAG NAMFLG: .WORD 0 ; NAME FLAG 0-ACCOUNT, 1-NAME GMCR: GMCR$ BUF = GMCR+2 ; BUFFER FOR TI I/O MKT: MRKT$ 1,60.,1 ; WAIT FOR ONE SECOND ; EB033 .SBTTL MAIL COMMAND PROCESSOR ;+ ; GETGUY - MAIL COMMAND PROCESSOR ; ; FORMAT OF COMMAND ; ; MAIL [GRP,MEM] ; MAIL [GRP/MEM] ; MAIL GRP,MEM ; MAIL GRP/MEM ; MAIL NAME ; ; ; WHERE: ; [GRP,MEM] IS UIC TYPE OF ACCOUNT ; NAME - USER NAME ;- ; ; GET COMMAND LINE ; GETGUY: DIR$ #GMCR ;GET MCR COMMAND LINE BCC 3$ ;IF CC, OK TTYOUT #ER4,#LER4 ;ERROR, NONE THERE BR ERR ; ; ATTACH TO TI: ; 3$: MOV #ODPB,R4 ; GET OUTPUT DPB ADDRESS MOV #IO.ATT,2(R4) ; ATTACH CALL QIO ; TO TI: MOV #IO.WVB,2(R4) ; RESET FUNCTION CODE MOV #44,Q.IOPL+4(R4) ; NO, SET TO PROMPT MODE ; ; GET ACCOUNT ; CLR FILOPN ; SET FILE OPEN CLR ENTRY ; ZERO ENTRY MOV #BUF,R0 ;GET BUFFER ADDRS. 10$: CALL $GNBLK ; GET NEXT NON-BLANK BCS 20$ ; EOL TST R1 ; ANY BLANKS SEEN? BEQ 10$ ; NO, CONTINUE SCAN BR 30$ ; YES, GET ACCOUNT NUMBER 20$: TTYOUT #ACCT,#LACCT ; MUST PROMPT FOR ACCOUNT NUMBER MOV #BUF,R0 ; POINT TO INPUT BUFFER MOV #20.,R1 ; SET COUNT OF CHARACTERS CALL READ ; READ IN ACCOUNT NUMBER BR 40$ ; 30$: DEC R0 ; BACK UP BUFFER POINTER TO FIRST DIGIT 40$: CALL PERSON ;MAIL TO SOMEONE ELSE? BCS ERR ;NO, TO OURSELVES. CALL ACCNT ; GET ACCOUNT NUMBER BCC 46$ ; OKAY TTYOUT #ER1,#LER1 ; NO, SYNTAX ERROR BR ERR ; ; OPEN ACCOUNT FILE ; 46$: CALL OPNACT ; OPEN ACCOUNT FILE ; ; SEARCH FOR ACCOUNT IN FILE ; 48$: CALL SEARCH ; SEARCH FOR ACCOUNT NUMBER BCC EXIT ; OKAY TTYOUT #ER2,#LER2 ; ACCOUNT NOT FOUND BR ERR ; ; THE FOLLOWING LINES OF CODE WERE FOUND TO BE ; REUSE ELSEWHERE AND SO WERE EXTRACTED AND MADE ; INTO A MINI-ROUTINE. IT'S PURPOSE IS TO SEE ; THAT THE ACCOUNT FILE IS OPENED. ; OPNACT: CLR OPNERR ; SET NO OPEN ERROR 47$: CALL OPEN ; OPEN ACCOUNT FILE BCC 48$ ; OPEN SUCCESSFUL CMP OPNERR,#5 ; FIVE FAILURES? BLT 472$ ; NO 471$: TTYOUT #ER6,#LER6 ; YES TST -(SP) ;TIDY THE STACK BR ERR 472$: DIR$ #MKT ; NO, WAIT ONE SECONDS BCS 471$ ; ERROR WTSE$S #1 ; WAIT FOR TIME INC OPNERR ; INCREMENT TIME TRIED BR 47$ ; TRY AGAIN 48$: RETURN .SBTTL ERROR PROCESSING EXIT: TST FILOPN ; IS ACCOUNT FILE OPEN? BEQ 10$ ; NO CLOSE$ #$ACTFL ; YES, CLOSE IT 10$: RETURN ; AND EXIT ; ; ERR: CALL EXIT SEC RETURN .SBTTL SUBROUTINES ; ; THE FOLLOWING SUBROUTINES WERE EXTRACTED ; WITH ONLY MINOR MODIFICATION FROM 'HELLO', ; VERSION 01, BY H. LEV, 7/15/75. ; .SBTTL >> READ - READ A LINE FROM TERMINAL ;+ ; *** - READ - READ A LINE FROM TERMINAL ; ; INPUT: ; R0 - BUFFER ADDRESS ; R1 - LENGTH TO READ ; ; OUTPUT: ; R0 - BUFFER ADDRESS ;- READ: MOV #IDPB,R4 ; GET INPUT DPB ADDRESS MOV #IO.RVB,2(R4) ; SET READ VIRTUAL MOV R0,Q.IOPL(R4) ; SET BUFFER ADDRESS MOV R1,Q.IOPL+2(R4) ; SET BUFFER LENGTH CALL QIO ; READ MOV R0,R1 ; GET BUFFER ADDRESS ADD IOSB+2,R1 ; ADD NUMBER OF CHARACTERS READ MOVB IOSB+1,(R1) ; STORE TERMINATOR RETURN ; .SBTTL >> ACCNT -GET ACCOUNT NUMBER OR USER NAME ;+ ; *** - ACCNT - GET ACCOUNT NUMBER OR USER NAME ; ; INPUT: ; R0 - BUFFER POINTER ; ; OUTPUT: ; R0 - UPDATED ; GRP - GROUP CODE ; MEM - MEMBER CODE ; UIC - 6 DIGIT ASCII UIC CODE ; OR IF NAME SPECIFIED ; NAME - 14 CHARACATER NAME OF USER ; CARRY SET - SYNTAX ERROR ; CARRY CLEAR - OKAY ;- ACCNT: CLR NAMFLG ; SET NO NAME SPECIFIED CALL $GNBLK ; GET NEXT NON-BLANK BCS 40$ ; EOL IS ERROR CMPB R2,#'[ ; BRACKET IS OPTIONAL BNE 1$ ; NOT BRACKET MOV R0,-(SP) ; SAVE BUFFER ADDREES DEC (SP) ; BACK IT UP TO BRACKET BR 101$ ; SKIP 1$: DEC R0 ; NO, BACKUP TO FIRST CHARACTER MOV R0,-(SP) ; SAVE BUFFER ADDRESS 101$: CALL $GTNUM ; GET GROUP CODE MOV R1,GRP ; STORE IT BNE 2$ ; NON-ZERO IS GOOD MOV (SP)+,R0 ; RESTORE BUFFER POINTER BR 10$ ; TRY IT AS NAME 2$: TST (SP)+ ; POP OFF OLD BUFFER ADDRESS CMP R1,#377 ; VALID GROUP CODE? BHI 40$ ; NO CMPB R2,#', ; TERMINATOR? BEQ 3$ ; YES CMPB R2,#'/ ; SLASH - DON'T PRINT LOGIN.TXT? BNE 40$ ; NO, SYNTAX ERROR 3$: CALL $GTNUM ; GET MEMBER CODE MOV R1,MEM ; STORE IT CMP R1,#377 ; VALID MEMBER CODE? BHI 40$ ; NO CALL $NNBLK ; GET TERMINATOR BCS 5$ ; EOL IS OKAY CMPB R2,#'] ; IS IT BRACKET? BNE 4$ ; NO, ERROR CALL $GNBLK ; YES, GET NEXT BCS 5$ ; EOL, GOOD 4$: BNE 40$ ; NO, ERROR 5$: MOV R0,-(SP) ; SAVE BUFFER ADDRESS MOV PC,R2 ; SET TO GENERATE LEADING ZEROES MOV #UIC,R0 ; POINT TO AREA FOR MEMBER MOV MEM,R1 ; RETRIEVE MEMBER CODE CALL $CBOMG ; CONVERT MEMBER TO ASCII MOV #UIC-3,R0 ; POINT TO AREA FOR GROUP CODE MOV GRP,R1 ; GET GROUP CODE CALL $CBOMG ; CONVERT GROUP TO ASCII MOV (SP)+,R0 ; RESTORE BUFFER ADDRESS BR 45$ ; 10$: MOV #NAME,R3 ; GET ADDRESS OF NAME AREA MOV #14.,R4 ; SET LENGTH OF NAME 20$: MOVB #40,(R3)+ ; BLANK IT OUT DEC R4 ; DONE? BGT 20$ ; NO, LOOP INC NAMFLG ; YES, SET NAME IS SPECIFIED MOV #14.,R4 ; SET LENGTH OF NAME MOV #NAME,R5 ; SET ADDRESS 30$: CALL $GNBLK ; GET NEXT NON-BLANK CHARACTER BCS 45$ ; EOL, END TST R1 ; ANY BLANKS? BNE 35$ ; YES, ONLY SLASH IS VALID CALL TSTCHR ; IS IT A VALID CHARACTER? BCC 37$ ; YES 35$: BEQ 50$ ; YES BR 40$ ; NO 37$: MOVB R2,(R5)+ ; STORE CHARACTER DEC R4 ; ROOM FOR MORE? BGT 30$ ; YES, TRY TO STORE IT 40$: SEC ; ERROR BR 50$ ; 45$: CLC ; SET SUCCESS 50$: RETURN ; .SBTTL >> OPEN - OPEN FILE ;+ ; *** - OPEN - OPEN FILE ; ;- ; A MINOR MODIFICATION WAS REQUIRED ; IN THIS ROUTINE TO ENABLE THE GENERAL ; USER, WHOSE SY: IS NOT NEC. ; DK0:, TO STILL ACCESS THE ACCOUNT FILE. ; OPEN: MOV $ACTFL+F.DSPT,R0 ;GET DSD POINTER. WK MOV #LACTDV,(R0)+ ;MOVE IN LENGTH. WK MOV #ACTDV,@R0 ;AND ADDRESS. WK ; OPEN$R #$ACTFL,,,#FD.RWM ; OPEN FILE BCS 10$ ; ERROR INC FILOPN ; SET FILE IS OPEN 10$: RETURN ; ; ; WK ; ACTDV: .ASCII /DK0:/ LACTDV=.-ACTDV .SBTTL >> QIO - ISSUE QIO ;+ ; *** - QIO - ISSUE QIO ; ; INPUT: ; R4 - DPB ADDRESS ;- QIO: DIR$ R4 ; ISSUE QIO BCS 10$ ; ERROR MOVB Q.IOEF(R4),R5 ; GET EVENT FLAG TO WAIT ON WTSE$S R5 ; AND WAIT 10$: RETURN ; .SBTTL >> TSTCHR - TEST CHARACTER FOR VALID SYMBOL ;+ ; *** - TSTCHR - TEST CHARACTER FOR VALID SYMBOL IN NAME. ; VALID CAHARCTERS ARE A-Z, 0-9, $, ', !, AND . ; ; INPUT: ; R2 - CHARACTER TO BE CHECKED ; OUTPUT: ; R2 - UNCHANGED ; CARRY CLEAR - GOOD ; CARRY SET - ERROR ;- TSTCHR: CMPB R2,#'A ; ALPHABETIC? BLO 10$ ; NO CMPB R2,#'Z ; MAYBE BLOS 40$ ; YES 10$: CMPB R2,#'0 ; NUMERIC? BLO 20$ ; NO CMPB R2,#'9 ; MAYBE BLOS 40$ ; YES 20$: CMPB R2,#'$ ; NO, DOLLAR? BEQ 40$ ; YES CMPB R2,#'' ; NO, APOSTROPHE? BEQ 40$ ; YES CMPB R2,#'! ; NO, EXCLAMATION BEQ 40$ ; YES CMPB R2,#'. ; NO, PERIOD? BEQ 40$ ; YES 30$: SEC ; NO, SET ERROR BR 50$ ; 40$: CLC ; SET SUCCESS 50$: RETURN ; .SBTTL >> SEARCH - SEARCH FILE FOR ACCOUNT NUMBER ;+ ; *** - SEARCH - SEARCH FILE FOR ACCOUNT NUMBER ; OUTPUT: ; R0 - ADDRESS OF ACCOUNT ENTRY ; CARRY CLEAR - ACCOUNT FOUND ; CARRY SET - ACCOUNT NOT FOUND ;- SEARCH: MOV #FDPB,R4 ; GET FILE DPB ADDRESS MOV #1,Q.IOPL+10(R4) ; SET TO START AT VBN 1 CLR Q.IOPL+6(R4) ; 5$: CALL QIO ; READ NEXT BLOCK MOV IOSB+2,R2 ; GET COUNT OF WORDS READ BEQ 25$ ; ZERO, NO WORDS READ MOV #$ACTBF,R0 ; GET BUFFER ADDRESS 10$: TST NAMFLG ; IS NAME SPECIFIED? BEQ 15$ ; NO MOV R0,ENTRY ; YES, SAVE ENTRY ADDRESS MOV R1,-(SP) ; SAVE BYTES LEFT MOV R2,-(SP) ; ADD #A.LNM,R0 ; GET ADDRESS OF LAST NAME MOV #NAME,R1 ; GET ADDRESS OF NAME ENTERED MOV #14.,R2 ; SET LENGTH OF NAME 12$: CMPB (R0)+,(R1)+ ; NAMES THE SAME? BEQ 14$ ; YES SEC ; NO BR 18$ ; 14$: DEC R2 ; SO FAR BGT 12$ ; CONTINUE TILL END MOV ENTRY,R0 ; RESTORE ENTRY ADDRESS CALL NAMNUM ; GET NUMBERS FROM NAME BR 18$ ; NAME IS THE SAME 15$: CMP UIC,A.GRP(R0) ; GROUP CODES MATCH BNE 20$ ; NO CMP UIC+2,A.GRP+2(R0) ; MAYBE BNE 20$ ; NO CMP UIC+4,A.MBR+1(R0) ; YES, MEMBER CODES MATCH? BNE 20$ ; NO MOV R0,ENTRY ; SAVE ENTRY POINTER MOV R1,-(SP) ; SAVE R1 AND R2 MOV R2,-(SP) ; 18$: MOV (SP)+,R2 ; RESTORE R1 AND R2 MOV (SP)+,R1 ; MOV ENTRY,R0 ; RESTORE ENTRY POINTER BCC 40$ ; PASSWORD CHECKS OUT 20$: ADD #A.LEN,R0 ; POINT TO NEXT ENTRY SUB #A.LEN,R2 ; COMPUTE WORDS LEFT IN BUFFER BHI 10$ ; LOOP, MORE LEFT 25$: CMPB #IE.EOF,IOSB ; END OF FILE? BEQ 30$ ; YES TSTB IOSB ; ANY ERRORS? BMI 30$ ; YES ADD #$BFLEN/512.,Q.IOPL+10(R4) ; NO, POINT TO NEXT VBN ADC Q.IOPL+6(R4) ; BR 5$ ; READ IN NEXT BUFFER 30$: SEC ; ERROR, ACCOUNT NOT FOUND 40$: RETURN ; .SBTTL >> NAMNUM - CHANGE ACCOUNT NAME TO NUMBER ; ; THE FOLLOWING TWO ROUTINES WERE INCLUDE TO ENABLE ; MORE GENERAL USE OF THE MAIL PROGRAM. ; ;+ ; NAMNUM - CHANGE ACCOUNT NAME TO NUMBER ; ; INPUTS: R0=ADDRESS OF ACCOUNT ENTRY ; ; OUTPUTS: REGISTERS NOT AFFECTED ; LOCATIONS UIC, GRP, MEM ARE SET ; ;- ; .MCALL ENTER,LEAVE NAMNUM: ENTER R1,R2 ;SAVE REGS FOR WORK MOV R0,-(SP) ;AND PLAY MOV #6,R2 ;LOOP COUNT MOV #UIC,R1 ;AND WHERE TO 1$: MOVB (R0)+,(R1)+ ; DO IT SOB R2,1$ ; ; NOW FILL IN GRP AND MEM, GRP FIRST ; MOV (SP),R0 ;GET BACK POINTER MOV #3,R1 ;DO 3 DIGITS AT ATIME CALL NUMB ;DO IT MOV R2,GRP CALL NUMB MOV R2,MEM MOV (SP)+,R0 ;RESTORE REGISTERS LEAVE RETURN .SBTTL >> NUMB - CONVERSION FROM OCTAL TO BINARY ; ;+ ; NUMB - CONVERSION FROM OCTAL TO BINARY ; ; INPUTS: R0 = ADDRESS OF STRING TO CONVERT ; R1 = NUMBER OF DIGITS ; ; OUTPUTS: R0 = UPDATED ; R1 = UNCHANGED ; R2 = CONVERTED NUMBER ; ; NOTE: THE NUMBER IS ASSUMED TO BE OCTAL, NO ; CHECKING IS DONE IN THIS ROUTINE. ; ;- ; NUMB: ENTER R1,R3 ;WORK REGISTERS CLR R2 ;PREPARE R2 1$: ASH #3,R2 ;SHIFT FOR NEXT DIGIT MOVB (R0)+,R3 ;GET IT SUB #60,R3 ;MAKE INTO A NUMBER BISB R3,R2 ;INCLUDE IT SOB R1,1$ ;GET THE NEXT LEAVE ;DONE RETURN ; .SBTTL >> PERSON - MAIL TO YOURSELF?? ; ;+ ; PERSON - MAIL TO YOURSELF??? ; ; ROUTINE TO ENABLE THE USER TO READ HIS OWN MAIL FILE ; ; INPUTS: R0 = ADDRESS OF THE LINE JUST READ IN. ; IF 'ME' IS READ, THEN READ OUR MAIL, ; IF NOT CONTINUE ON THE MAIN-LINE CODE. ; ; OUTPUTS: IF WE READ OUR OWN MAIL, THEN EVERYTHING ; IS UNRELIABLE, THE INTENTION IS THAT ; WE ARE DONE. IF NOT, THEN NOTHING HAS ; CHANGED, AND THE C-BIT IS CLEARED. ; ;- ; PERSON: ENTER R0,R1,R2 ; SAVE FROM GTSK STUFF GTSK$S #TIME ;GET TASK INFO MOVB TIME+G.TSPC,R1 ;GET MEMBER NUMBER BIC #177400,R1 ;CLEAR HIGH BYTE. MOV #1,R2 ;DON'T SUPPRESS ZEROS MOV #MEMB-3,R0 ;START WITH MEMBER CALL $CBOMG ;CONVERTING TO OCTAL MOV #GROUP-3,R0 ;THEN DO GROUP NUMBER MOVB TIME+G.TSGC,R1 BIC #177400,R1 ;CLEAR HIGH BYTE. CALL $CBOMG ; ; WE NOW OPEN THE ACCOUNT FILE, AND GET THE NAME OF THE ; PERSON WHO IS SENDING THE MAIL. ; CALL OPNACT ;OPEN ACCOUNT FILE CLR NAMFLG ;FAKE A UIC MOV #6,R0 ; BY MOVING THE MOV #UIC,R2 ; UIC WE JUST BUILT MOV #GROUP,R1 ; INTO THE SEARCH UIC. 31$: MOVB (R1)+,(R2)+ ; CHAR BY CHAR SOB R0,31$ ; CALL SEARCH ;FIND ACCOUNT ENTRY BCS 33$ ;NOT FOUND ; MOV #14.,R1 ;LENGTH OF NAME ADD #A.LNM,R0 ;POSITION OF NAME MOV #OURNAM,R2 ;MOVE TO OURNAM 32$: MOVB (R0)+,(R2)+ ; SOB R1,32$ ; 33$: CALL EXIT ;CLOSE ACT FILE LEAVE ; RESTORE BUFFER POINTER ; CALL ME ;DID HE TYPE 'ME' BCC 100$ ;YEP CLC ;INDICATE CONTINUATION RETURN ; ; 100$: MOV MAFILE+F.DSPT,R0 ;GET ADDRESS OF DSDS MOV #GROUP,12(R0) ;FAKE THIS FILE NAME ; FINIT$ ;WHY?? OPEN$R #MAFILE ;OPEN THE FILE BCC 11$ ;ALL'S OKAY CMPB #IE.NSF,F.ERR(R0) ;NO SUCH FILE? BEQ 12$ ;THAT'S IT CALL IOERR ;SOMETHING ELSE 12$: TTYOUT #NOFILE,#LNFL ;ISSUE NO FILE MESS. BR PRSRTS ;RETURN 11$: GET$ ;GET THE RECORD BCC 1$ ;ALL'S COOL CMPB #IE.EOF,F.ERR(R0) ;AN EOF? BEQ 5$ ;GOOD, IT WAS CALL IOERR ;SOMETHING ELSE. ; ; NOW WRITE OUT THE MAIL ; 1$: TTYOUT F.NRBD+2(R0),F.NRBD(R0) PCRLF BR 11$ ; 5$: TTYOUT #SAVE,#LSAVE ;SAVE MAIL?? DIR$ #ANSW ;READ REPLY MOV IOSB+2,R1 ;LENGHT OF REPLY BEQ PRSEND ;NOTHING THERE, DELETE. CMPB #'Y,BUF ;A "Y"??(upper case) beq 25$ ;is, so save cmpb #171,BUF ;a "y"?? (lower case) BNE PRSEND ;NOT "Y", DELETE. 25$: MOV #NEWFIL,R1 ;NEW FILE NAME CALL .RENAM PSTR ^*/MAIL FILE SAVED AS /* MOV R1,R0 ;PUT FDB IN RIGHT REG. CALL PFLNAM ;PRINT FILE NAME BR PRSRTS ;LEAVE ; PRSEND: DELET$ ;DELET THE MAIL FILE PRSRTS: SEC ;INDICATE DONE RETURN ; ; .SBTTL >> PFLNAM - PRINT FILE NAME ; ;+ ; PFLNAM - PRINT FILE NAME ; ; INPUTS: R0 = ADDRESS OF THE FDB OF THE FILE. ; ; OUTPUTS: NO CHANGE, THE FILE NAME IS PRINTED ON THE ; TTY DEVICE. ; ;- ; .MCALL POCT,PRAD5S,PRAD50 .MCALL PSTR,TTYOUT,PCRLF PFLNAM: ENTER R1 ;A WORK REGISTER MOV R0,R1 ADD #N.DVNM+F.FNB,R1 ;COMPUTE ADDR. OF DEV NAME TTYOUT R1,#2 ;DEVICE NAME POCT N.UNIT+F.FNB(R0) ;AND UNIT NUMBER PSTR /:/ TST N.FNAM+F.FNB(R0) ;IS THERE A FILE BEQ 5$ ;NO, SKIP IT MOV R0,R1 ;COMPUTE ADDR. OF THE ADD #N.FNAM+F.FNB,R1 ; FILE NAME PRAD5S R1,#3 PSTR /./ PRAD50 N.FTYP+F.FNB(R0) PSTR ^*/;/* POCT N.FVER+F.FNB(R0) 5$: PCRLF LEAVE RETURN .SBTTL >> ME - DETERMINE THE PERSON ; ;+ ; ME - ROUTINE TO DETERMINE IF "ME" WAS TYPED. ; ; INPUT: R0=INPUT BUFFER ; ;- ; ME: CMPB #'M,(R0) ;AN "M"? BNE NO$ ;NO CMPB #'E,1(R0) ;AN "E"? BNE NO$ CMPB #CR,2(R0) ;A CR?? (TERMINATOR) BNE NO$ CLC RETURN NO$: SEC RETURN ; ; NOTE THAT ME RELIES ON THE BUFFER BEING TERMINATED WITH ; THE INPUT TERMINATOR (HERE A CR). ; IN "MAIL" THIS IS WHAT "READ" DOES. ; .SBTTL ADDED STORE AND STUFF ; ; ALL THE STORAGE AND STUFF FOR THE LAST TWO ROUITINES. ; .NLIST BEX .BLKB 3 ;A BUFFER ZONE .EVEN GROUP: .BLKB 3 ;000 MEMB: .BLKB 3 ;000 .ASCII /.TXT/ ;.TXT ; NOFILE: .ASCII /THERE IS NO MAIL/ LNFL=.-NOFILE ; ; ; THE FOLLOWING IS AVAILABLE FOR FUTURE ENHANCMENTS. ; IT IS SIMPLY A COPY OF THE CURRENT UIC. ; OURUIC: .BLKB 11 ;[000,000] ; OURNAM: .ASCII /MYSTERY MAILER/ ; .EVEN ; ; SAVE: .ASCII @SAVE THIS FILE? [Y/N] @ LSAVE=.-SAVE .EVEN .LIST BEX ; ; ANSW: QIOW$ IO.RVB,LUN1,EFN1,,IOSB,, ; ; THE NEW FILE FDB ; NEWFIL: FDBDF$ FDAT$A R.VAR,FD.CR FDOP$A LUN2,NEWDSD FDBF$A EFN1 ; NEWDSD: .WORD LODEV,OURDEV LOUIC: .WORD 0,OURUIC .WORD LOFIL,OURFIL ; OURDEV: .ASCII /DM1:/ LODEV=.-OURDEV ; OURFIL: .ASCII /MAIL.TXT/ LOFIL=.-OURFIL FSRSZ$ 1 .END MAIL