ASMB,R,L,C
*     NAME:   SM.SB 
*     SOURCE: 92067-18449 
*     RELOC:  92067-16125 
*     PGMR:   R.D.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
      NAM SM.SB,8 92067-16125 REV.2026 800304 
      ENT SM.SB 
      EXT .ENTR     PARAMETER FETCH ROUTINE 
      EXT $SMD#     OFFSET TO DIRECTORY ENTRY # IN SCB
      EXT $SMID     OFFSET TO USER ID WORD IN SCB 
      EXT APOSN     FMP FILE POSITION ROUTINE 
      EXT CLOS.     INTERNAL FMGR CLOSE ROUTINE 
      EXT CLOSE     FMP FILE CLOSE ROUTINE
      EXT CREAT     FMP FILE CREATE ROUTINE 
      EXT FTIME     FORTRAN'S TIME AND DAY ROUTINE
      EXT I.BUF     INTERNAL (FMGR) DCB 
      EXT IPRSN     PACK SESSION USER NAME (INVERSE PARSE)
      EXT ISMVE     MOVE WORDS FROM SESSION CONTROL BLOCK 
      EXT LOCF      FMP FILE LOCATION ROUTINE 
      EXT NAMR      NAMR PARSE ROUTINE
      EXT O.BUF     INTERNAL (FMGR) DCB 
      EXT OPEN      FMP FILE OPEN ROUTINE 
      EXT OPEN.     INTERNAL FMGR OPEN ROUTINE
      EXT OVRD.     SESSION OVERRIDE OPTION WORD
      EXT PARSN     ACCOUNT NAME PARSE ROUTINE
      EXT POSNT     FMP FILE POSITION ROUTINE 
      EXT PURGE     FMP FILE PURGE ROUTINE
      EXT READF     FMP FILE READ ROUTINE 
      EXT RNRQ      EXEC REQUEST FOR RESOURCE NO. 
      EXT SESSN     DETERMINES IF IN SESSION
      EXT WRITF     FMP FILE WRITE ROUTINE
* 
A     EQU 0 
B     EQU 1 
* 
*  PICK UP PARAMETERS 
* 
IBUFR NOP           USER.GROUP,NAMR,MESSAGE 
ILEN  NOP           LENGTH OF BUFFER (POSITIVE # WORDS) 
IERR  NOP           ERROR RETURN WORD 
SM.SB NOP           SM.SB ENTRY POINT 
      JSB .ENTR     GET PARAMETERS
      DEF IBUFR 
* 
      CLA           INITIALIZE
      STA TEXT      TEXT=1 IF TEXT (STRING) SUPPLIED
      STA FILE      FILE=1 IF NAMR SUPPLIED 
      STA EMPTY     EMPTY=1 IF MSG FILE WAS CREATED BY THIS INVOCATION
      STA RWERR 
      STA TEMP1 
      INA 
      STA ICHAR     INITIALIZE ICHAR=1 FOR PARSN
* 
      JSB SESSN     IN SESSION? 
      DEF *+2 
      DEF XEQT      CURRENT PROGRAM 
      SEZ           SKIP IF IN SESSION (E=0)
      JMP ER45      NOT IN SESSION
      STB ADSCB     SAVE SESSION WORD (IDSEG WD 33) 
* 
      JSB ISMVE     MOVE USER ID FROM SESSION CONTROL BLOCK 
      DEF RTN1
      DEF ADSCB     SCB ADDRESS 
      DEF $SMID     OFFSET TO USER ID IN SCB
      DEF USRID     USER ID RETURNED HERE 
      DEF D1        1 WORD TO BE MOVED
RTN1  EQU * 
* 
      LDA ILEN,I    LENGTH OF COMMAND BUFFER
      ALS           CONVERT WORDS TO CHARACTERS 
      STA LENTH     SAVE NBR OF CHARACTERS IN COMMAND STRING
      JSB PARSN     PARSE USER.GROUP NAME 
      DEF RTN2
      DEF DRTIM     PARSE OUTPUT BUFFER 
      DEF IBUFR,I   INPUT BUFFER
      DEF LENTH     LENGTH OF BUFFER (POSITIVE # OF CHARS)
      DEF ICHAR     NEXT CHAR POSITION TO PARSE 
      DEF JERR      ERROR RETURN WORD 
RTN2  EQU * 
* 
      LDB ADRTM     ADDRESS OF FIRST WORD OF DRTIM BUFFER 
      LDA B,I       GET 1ST WORD OF USER.GROUP PARSE (#CHARS) 
      SZA,RSS       CHECK IF NO USER.GROUP NAME SUPPLIED
      JMP ER55      ERROR - NO USER.GROUP NAME
      AND M377      CHECK FOR GROUP 
      SZA           IS GROUP SPECIFIED? 
      JMP LABL1     YES (NON-ZERO GROUP NAME LENGTH)
      LDA B,I       PUT "7" FOR # OF CHARS.IN GROUP NAME
      IOR D7
      STA B,I 
      ADB D6
      LDA DM4 
      STA CNTR1     SET COUNTER TO MOVE 4 WORDS 
LABL2 LDA ADGNL,I   GET "GENERAL" 
      STA B,I       STORE INTO BUFFER LOCATION
      ISZ ADGNL     GET NEXT WORD 
      INB 
      ISZ CNTR1     FINISHED? 
      JMP LABL2     NO, STORE ANOTHER WORD AWAY 
* 
LABL1 JSB NAMR      PARSE NAMR PARAMETER
      DEF *+5 
      DEF INAM      PARSE OUTPUT BUFFER (10 WORDS)
      DEF IBUFR,I   INPUT BUFFER
      DEF LENTH     TOTAL LENGTH OF IBUFR (POSITIVE# CHARS) 
      DEF ICHAR     STARTING CHARACTER NUMBER IN IBUFR
* 
      LDA INAM      CHECK TO SEE IF NAMR WAS SUPPLIED 
      SZA,RSS       WAS NAMR GIVEN? 
      JMP LABL3     NO,DON'T BOTHER TO OPEN ANY FILES 
* 
      ISZ FILE      SET FLAG INDICATING NAMR WAS SUPPLIED 
* 
      LDA INAM+4    SET UP SECURITY CODE
      STA NOPL
      LDA INAM+5    SET UP CARTRIDGE NUMBER 
      STA NOPL+1
* 
      JSB OPEN.     OPEN NAMR TO BE SENT
      DEF RTN3
      DEF O.BUF     NAMR DCB
      DEF INAM      FILE NAMR OR LU 
      DEF NOPL      SECURITY CODE, CRN
      DEF IOPTN 
RTN3  EQU * 
* 
LABL3 LDA ICHAR     CURRENT CHARACTER POSITION
      CLE,ERA       CONVERT CHARACTERS TO WORDS 
      SEZ           TEST IF ODD NUMBER OF CHARACTERS
      ISZ TEMP1     YES, SET BYTE FLAG
      SEZ,RSS       TEST IF ODD NUMBER OF CHARACTERS
      ADA DM1       NO, SUBTRACT ONE
      STA ISTRW     SAVE CURRENT WORD POSITION
      ADA IBUFR 
      STA TEMP
      STA LBUFR 
* 
      JSB NAMR      CHECK FOR TEXT (STRING) 
      DEF *+5 
      DEF INAM2     OUTPUT BUFFER 
      DEF IBUFR,I   INPUT BUFFER
      DEF LENTH     TOTAL LENGTH OF IBUFR (POSITIVE# CHARS) 
      DEF ICHAR     NEXT CHARACTER POSITION TO PARSE
* 
      LDA INAM2     GET FIRST WORD OF OUTPUT BUFFER 
      SZA,RSS       IS THERE ANY TEXT?
      JMP LABL5     NO
      ISZ TEXT      SET FLAG=1 INDICATING TEXT WAS GIVEN
      LDA TEMP1     YES CHECK BYTE POSTION
      SZA           IS THERE ANY REMAINDER
      JMP LABL6     NO
      LDA TEMP,I    1ST WORD OF TEXT (STRING) 
      AND M377      MASK OFF CHARACTER
      IOR M2000     MERGE BLANK IN LEFTMOST BYTE
      STA TEMP,I    STORE BACK IN BUFFER
LABL6 LDA ISTRW     COMPUTE LENGTH OF TEXT
      CMA,INA 
      ADA ILEN,I
      STA WRDCT     LENGTH OF TEXT IN WORDS 
      JMP LAB.5 
* 
*    CALCULATE STRING LENGTH
* 
LABL5 LDA FILE      CHECK TO SEE IF NAMR WAS SUPPLIED 
      SZA 
      JMP LAB.5     YES 
      LDA D50       NO, ERROR - NEITHER NAMR NOR TEXT SUPPLIED
      JMP EXIT      ERROR EXIT - NOT ENOUGH PARAMETERS
* 
LAB.5 LDA SECU
      STA NOPL      SET SECURITY CODE 
      CLA 
      STA NOPL+1    SET CRN 
* 
      LDA OVRD.     OVERRIDE FLAG TO ALLOW SYS DISC WRITE 
      STA TEMP      SAVE IT'S CURRENT STATE 
      IOR M2000     SET TO ALLOW SYS DISC WRITE 
      STA OVRD. 
      JSB OPEN      OPEN THE ACCOUNT FILE 
      DEF RTN4
      DEF I.BUF     DCB(ACCOUNT)
      DEF JERR      ERROR RETURN WORD 
      DEF ACCT      ACCOUNT NAME=+@CCT! 
      DEF D1        NON-EXCLUSIVE OPEN OPTION 
      DEF NOPL      SECURITY CODE 
      DEF NOPL+1    DISC
RTN4  EQU * 
      LDA TEMP      GET SAVED OVERRIDE FLAG 
      STA OVRD.     RESTORE PREVIOUS OVERRIDE VALUE 
      LDA JERR      GET ERROR CODE
      SSA           OPEN ERROR? 
      JMP EXIT      YES 
* 
*  READ ACCOUNT FILE HEADER 
* 
      JSB READF 
      DEF RTN5
      DEF I.BUF     DCB OF ACCOUNT FILE 
      DEF JERR      ERROR RETURN WORD 
      DEF IBUF      BUFFER LOCATION 
      DEF D128      ONE RECORD LENGTH 
      DEF LEN       NUMBER OF WORDS READ
RTN5  EQU * 
* 
      LDA DFIBF     GET LOCATION OF DIRECTORY 
      ADA D24       OFFSET TO RESOURCE NUMBER WORD
      LDA A,I       GET RESOURCE NUMBER TO USE
      STA RESNO 
      JSB RNRQ      LOCK RESOURCE NUMBER FOR ACCT FILE WRITE
      DEF RTN40 
      DEF D1
      DEF RESNO     RESOURCE NUMBER 
      DEF ISTAT     STATUS RETURN 
RTN40 EQU * 
* 
      JSB READF     RE-READ ACCOUNT FILE HEADER 
      DEF RTN7
      DEF I.BUF     ACCOUNT FILE DCB
      DEF JERR      ERROR RETURN WORD 
      DEF IBUF
      DEF D128      NUMBER OF WORDS TO READ 
      DEF LEN       NUMBER OF WORDS READ
      DEF D1        RECORD #1 
RTN7  EQU * 
      LDA DFIBF     START OF BUFFER IBUF
      STA B 
      ADA D4        BUMP TO DIRECTORY LOCATION WORD 
      LDA A,I 
      STA DIRNO     RECORD # OF START OF DIRECTORY
      STA DIR## 
      ADB D5
      LDA B,I 
      STA ADACT     LOCATION OF 1ST ACCOUNT ENTRY 
      ADB D20 
      LDA B,I       LU # OF MESSAGE FILES 
      STA MSGLU 
      SZA,RSS       IF NO LU # SPECIFIED FOR MSG FILES, 
      LDA DM2       DEFAULT TO LU 2 
      STA LUNO.     SAVE LU # OF MSG FILES
* 
*  FINDING USER'S ACCOUNT 
* 
LAB80 LDA DM8 
      STA CNTR1 
      JSB READF     READ IN ACCOUNT FILE DIRECTORY
      DEF RTN.5 
      DEF I.BUF     ACCOUNT FILE DCB
      DEF JERR      ERROR RETURN WORD 
      DEF IBUF
      DEF D128      NUMBER OF WORDS TO READ 
      DEF LEN       NUMBER OF WORDS READ
      DEF DIR##     RECORD NUMBER OF DIRECTORY
RTN.5 EQU * 
      LDA D73       SET UP ERROR: ACCOUNT NOT FOUND 
      STA JERR
      LDA DFIBF     KEEP POINTER TO DIRECTORY 
      STA TEMP2 
      STA TEMP      TEMP WILL POINT TO ENTRIES IN DIRECT. 
LABL9 LDA TEMP,I    GET # OF CHARACTERS IN NAME 
      SZA,RSS 
      JMP ERROR 
      CPA DRTIM     IS IT EQUAL TO # OF CHARS. IN PARM. IN NAME 
      JMP LAB85     YES, CHECK LETTER FOR LETTER
LABL8 LDA TEMP2     NO GET NEXT DIRECTORY ENTRY 
      ADA D16       16 WORDS PER DIRECTORY
      STA TEMP2     UPDATE PTR. 
      STA TEMP
      ISZ CNTR1     CNTR1 INITIALIZED TO -8 
      JMP LABL9 
      ISZ DIR## 
      JMP LAB80 
LAB85 LDA DM10
      STA CNTR
      LDA ADRTM     FIRST WORD OF DIR. ENTRY AND BUFFER CONTAINING
      STA TEMP1      NAME ARE = 
LAB95 ISZ TEMP1     INCREMENT BOTH BUFFERS TO THE 
      ISZ TEMP        NEXT WORDS
      LDA TEMP,I    ARE THEY THE SAME 
      CPA TEMP1,I 
      RSS           YES THEY ARE
      JMP LABL8     NO, FIND ANOTHER DIR ENTRY
      ISZ CNTR      DECREMENT COUNTER 
      JMP LAB95     CHECK ANOTHER WORD
* 
* 
*  YES FOUND ENTRY
* 
      LDA TEMP2 
      ADA D14       GET WORD 15(USER ACCT RECORD #) 
      LDA A,I       SEE IF BIT 15 IS SET
      CLB 
      SSA           IS IT SET 
      LDB D64       YES,ACCOUNT IS 2ND 64 WORDS 
      STB OFFST     NO ACCOUNT IS IN FIRST RECORD 
      AND M7777     REMOVE SIGN BIT 
      STA USACT     USER ACCOUNT RECORD # 
* 
* NOW READ IN USER ACCOUNT ENTRY
* 
      JSB READF     READ IN USER ACCOUNT FILE 
      DEF RTN12 
      DEF I.BUF 
      DEF JERR
      DEF UBUF      BUFFER FOR USER ACCOUNT 
      DEF D128      WHILE RECORD IS READ
      DEF LEN 
      DEF USACT 
RTN12 EQU * 
* 
*   GET USER MESSAGE FILE NAME THEN OPEN FILE 
* 
      LDA ADBUF 
      ADA D16       PICK UP ADDRESS OF NAME 
      ADA OFFST     ADD IN OFFSET 
      LDB A,I 
      STB NAME      STORE IN NAME IN 3 WORD ARRAY 
      INA 
      LDB A,I 
      STB NAME+1
      INA 
      LDB A,I 
      STB NAME+2    PUT 3RD CHAR. AWAY
      INA 
      INA 
      LDB A,I 
      SSB,RSS       CHECK IF MESSAGE FILE EXISTS
      JMP CREA1 
LAB10 LDA OVRD. 
      STA TEMP
      IOR M2000 
      STA OVRD. 
      JSB OPEN      OPEN USER MESSAGE FILE
      DEF RTN13 
      DEF FDCB      MESSAGE FILE DCB
      DEF JERR      ERROR RETURN WORD 
      DEF NAME      MESSAGE FILE NAME 
      DEF D1
      DEF SECU      SECURITY CODE 
RTN13 EQU * 
      LDA TEMP
      STA OVRD. 
* 
      LDA JERR
      SSA,RSS       CHECK FOR ERROR 
      JMP LAB11     NO
      CPA DM6       IF MESSAGE FILE NOT FOUND,
      JMP CREA1     CREATE IT 
      JMP ERROR     ELSE RETURN THE OPEN ERROR
* 
*   IF MESSAGE ISN'T CREATED THEN CREATE IT 
* 
CREA1 LDA OVRD. 
      STA TEMP
      IOR M2000 
      STA OVRD. 
      JSB CREAT     CREATE MESSAGE FILE 
      DEF RTN32 
      DEF FDCB      MESSAGE FILE DCB
      DEF JERR      ERROR RETURN WORD 
      DEF NAME      MESSAGE FILE NAME 
      DEF DM1       FILE SIZE TO CREATE 
      DEF D3        FILE TYPE 
      DEF SECU      SECURITY CODE 
      DEF LUNO.     LU OF MESSAGE FILES 
      DEF D0
      DEF D0
      DEF D0
      DEF M707      BYPASS LEGAL FILE NAME TEST 
RTN32 EQU * 
      LDA TEMP
      STA OVRD. 
* 
      LDA JERR
      SSA,RSS       CHECK FOR CREATE ERROR
      JMP LAB22     NO ERROR
      CPA DM2       IF FILE ALREADY EXISTS, 
      JMP LAB10     OPEN IT AND POSITION IT TO EOF
      CPA DM33      IF NO ROOM ON LU, 
      RSS           THEN TEST IF LU 2 
      JMP ERROR     ELSE JUST REPORT CREATE ERROR 
      LDA MSGLU     GET LU # OF MESSAGE FILES 
      SZA           SPECIFIED?
      JMP ERROR     YES, REPORT -33 ERROR 
      LDA SECT3     SECTORS/TRACK ON LU 3 
      SZA,RSS       IF 0, NO LU 3 
      JMP ERROR     NO LU 3, REPORT -33 ERROR 
      LDA LUNO. 
      CPA DM3       ALREADY TRIED LU 3? 
      JMP ERROR     YES, RETURN -33 ERROR 
      LDA DM3       LU 3 EXISTS, TRY CREATE ON LU 3 
      STA LUNO. 
      JMP CREA1 
* 
*  FIND EOF OF USER MESSAGE FILE
* 
LAB11 JSB READF     READ MESSAGE FILE UNTIL THE 
      DEF RTN14       IERR WORD HAS A -12 IN IT 
      DEF FDCB
      DEF JERR        OR THE LEN WORD IS -1 
      DEF UBUF      BUFFER FOR READ INPUT 
      DEF D128
      DEF LEN 
RTN14 EQU * 
* 
      LDA JERR      DOES IT =-12
      CPA DM12
      JMP LAB25     YES FOUND END OF FILE 
      LDA LEN 
      CPA DM1       LEN=-1? 
      JMP LAB25     YES, END OF FILE
      SSA,RSS 
      JMP LAB11 
      JMP ERROR     READ ERROR
* 
LAB25 JSB LOCF      FIND POSITION OF EOF
      DEF RTN16 
      DEF FDCB
      DEF JERR
      DEF FIREC     RECORD NUMBER 
      DEF FIRB      NEXT BLOCK
      DEF FIOFF     OFFSET WITHIN BLOCK 
RTN16 EQU * 
* 
      JSB WRITF     PUT ZERO-LENGTH RECD BETWEEN MESSAGES 
      DEF RTN15 
      DEF FDCB
      DEF JERR
      DEF IBUF
RTN15 EQU * 
* 
*  GET TIME OF DAY AND SENDER OF MESSAGE
* 
      RSS 
LAB22 ISZ EMPTY     SET FLAG TO INDICATE FILE WAS CREATED 
      LDA DM30
      STA CNTR
      LDB ADBUF 
      LDA BLNK
UP    STA B,I 
      INB 
      ISZ CNTR
      JMP UP
* 
      JSB FTIME     GET TIME OF DAY 
      DEF RTN18 
      DEF UBUF+15   BUFFER FOR TIME OF DAY
RTN18 EQU * 
* 
*     GET SENDER'S NAME 
* 
      LDA DIRNO     START OF DIRECTORY
      STA DIR## 
* 
      JSB ISMVE     GET DIRECTORY ENTRY # FROM SCB
      DEF RTN55 
      DEF ADSCB     ADDRESS OF SESSION CONTROL BLOCK
      DEF $SMD#     OFFSET TO DIRECTORY ENTRY # WORD IN SCB 
      DEF DNUM      DIRECTORY ENTRY # RETURN WORD 
      DEF D1        1 WORD TO BE MOVED
RTN55 EQU * 
* 
      LDA DNUM      DIRECTORY ENTRY # 
      CLB           COMPUTE ACCT FILE RECORD CONTAINING DIR. ENTRY
      DIV D8
      ADA DIRNO     ADD RECORD NUMBER OF START OF DIRECTORY 
      STA DNUM      SAVE RECORD NUMBER
      BLF           COMPUTE OFFSET INTO RECORD IN WORDS 
      STB TEMP      TEMPORARY SAVE
* 
      JSB READF     READ RECORD CONTAINING DIRECTORY ENTRY
      DEF RTN56 
      DEF I.BUF     ACCOUNT FILE DCB
      DEF IERR,I    ERROR RETURN
      DEF IBUF
      DEF D128      NUMBER OF WORDS TO READ 
      DEF LEN       NUMBER OF WORDS READ
      DEF DNUM      RECORD NUMBER TO READ 
RTN56 EQU * 
* 
      LDA DFIBF     ADDRESS OF 1ST WORD OF IBUF 
      ADA TEMP      OFFSET TO DIRECTORY ENTRY 
      STA TEMP
* 
      JSB IPRSN     INVERSE PARSE TO BUILD SENDER NAME STRING 
      DEF *+4 
      DEF TEMP,I
      DEF UBUF
      DEF D1
* 
*  READ USER ACCOUNT AND SET MESSAGES WAITING BIT 
* 
      JSB READF     READ USER'S ACCOUNT 
      DEF RTN34 
      DEF I.BUF     ACCOUNT FILE DCB
      DEF JERR      ERROR RETURN WORD 
      DEF IBUF      BUFFER FOR 128-WORD ACCOUNT FILE RECORD 
      DEF D128      128 WORDS TO BE READ
      DEF LEN       NUMBER OF WORDS ACTUALLY READ 
      DEF USACT     ACCOUNT FILE RECORD NUMBER
RTN34 EQU * 
* 
      LDB DFIBF     ADDRESS OF IBUF 
      ADB OFFST     ADD OFFSET (0 OR 64)
      ADB D20       OFFSET TO "MESSAGE FILE EXISTS" WORD
      LDA B,I 
      IOR M1000     SET MESSAGE WAITING BIT 
      STA B,I       SAVE IT 
* 
      JSB POSNT     RE-POSITION TO USER RECORD NUMBER 
      DEF RTN35 
      DEF I.BUF     ACCOUNT FILE DCB
      DEF JERR      ERROR RETURN WORD 
      DEF USACT     ACCOUNT FILE RECORD NUMBER
      DEF D1        FLAG TO POSNT 
RTN35 EQU * 
* 
      JSB WRITF     WRITE NEW USER ACCOUNT
      DEF RTN41 
      DEF I.BUF     ACCOUNT FILE DCB
      DEF JERR      ERROR RETURN WORD 
      DEF IBUF      BUFFER WITH NEW ACCOUNT 
      DEF D128
RTN41 EQU * 
* 
      JSB RNRQ      RELEASE THE RN LOCK 
      DEF RTN42 
      DEF D4
      DEF RESNO     RESOURCE NUMBER 
      DEF ISTAT     STATUS RETURN 
RTN42 EQU * 
* 
      JSB WRITF     WRITE HEADER TO MESSAGE FILE
      DEF RTN19 
      DEF FDCB      MESSAGE FILE DCB
      DEF JERR      ERROR RETURN WORD 
      DEF UBUF      HEADER BUFFER (SENDER NAME, DATE) 
      DEF D30 
RTN19 EQU * 
* 
      LDA JERR
      CPA DM33      CHECK IF NO ROOM FOR WRITE
      JMP BKUP      NO ROOM, SO PURGE CURRENT MESSAGE 
      CPA DM46      CHECK IF GREATER THAN 255 EXTENTS 
      JMP BKUP      YES, SO PURGE CURRENT MESSAGE 
      LDA TEXT      IF TEXT WAS SUPPLIED (TEXT=1), THEN 
      SZA,RSS       WRITE IT TO MESSAGE FILE
      JMP LAB15     TEXT NOT SUPPLIED 
* 
      JSB WRITF     WRITE TEXT (STRING) TO MESSAGE FILE 
      DEF RTN30 
      DEF FDCB      MESSAGE FILE DCB
      DEF JERR      ERROR RETURN WORD 
      DEF LBUFR,I   BUFFER CONTAINING TEXT
      DEF WRDCT     LENGTH OF TEXT (WORDS)
RTN30 EQU * 
* 
      LDA JERR
      CPA DM33      CHECK IF NO ROOM FOR WRITE
      JMP BKUP      NO ROOM, SO PURGE CURRENT MESSAGE 
      CPA DM46      CHECK IF GREATER THAN 255 EXTENTS 
      JMP BKUP      YES, SO PURGE CURRENT MESSAGE 
* 
LAB15 LDA FILE      TEST IF NAMR SPECIFIED (FILE=1) 
      SZA,RSS 
      JMP LAB18     NOT SPECIFIED, SKIP NAMR READ-WRITE 
* 
      JSB READF     READF FROM USER SUPPLIED NAMR 
      DEF RTN20 
      DEF O.BUF     DCB 
      DEF KERR      ERROR RETURN WORD 
      DEF UBUF      BUFFER
      DEF D128
      DEF LEN 
RTN20 EQU * 
      LDA KERR
      STA RWERR 
* 
      JSB WRITF     NO, WRITE TO MESSAGE FILE 
      DEF RTN21 
      DEF FDCB      DCB OF MESSAGE FILE 
      DEF JERR
      DEF UBUF
      DEF LEN       NUMBER OF WORDS TO BE WRITTEN 
RTN21 EQU * 
* 
      LDA LEN       END OF FILE?
      CPA DM1 
      JMP LAB16     YES, CLOSE FILE 
* 
      LDA KERR
      CPA DM12      END OF FILE?
      JMP LAB16 
* 
      LDA JERR
      SSA 
      STA RWERR 
      CPA DM33      CHECK IF NO ROOM FOR WRITE
      JMP BKUP      NO ROOM, SO PURGE CURRENT MESSAGE 
      CPA DM46      CHECK IF GREATER THAN 255 EXTENTS 
      JMP BKUP      GREATER THAN 255 EXTENTS, SO PURGE
      LDA RWERR 
      SSA,RSS 
      JMP LAB15 
* 
*  BACK UP MESSAGE FILE TO PREVIOUS MESSAGE, OR PURGE FILE IF NONE
* 
BKUP  LDA EMPTY     EMPTY=1 IF FILE WAS CREATED BY THIS INVOCATION
      SZA,RSS       WAS FILE CREATED BY THIS INVOCATION?
      JMP BKUP2     NO, ALREADY EXISTED - BACK UP TO PREVIOUS MESSAGE 
* 
      LDA OVRD.     OVERRIDE FLAG TO ALLOW SYS DISC WRITE 
      STA TEMP      SAVE IT'S CURRENT STATE 
      IOR M2000     SET TO ALLOW SYS DISC WRITE 
      STA OVRD. 
      JSB PURGE     YES, PURGE MESSAGE FILE 
      DEF RTN72 
      DEF FDCB      MESSAGE FILE DCB
      DEF IERR,I    ERROR RETURN WORD 
      DEF NAME      MESSAGE FILE NAME 
      DEF SECU      SECURITY CODE 
      DEF LUNO. 
RTN72 EQU * 
      LDA TEMP      GET SAVED OVERRIDE FLAG 
      STA OVRD.     RESTORE PREVIOUS OVERRIDE VALUE 
* 
      JSB RNRQ      GET THE RN LOCK AGAIN 
      DEF RTN49 
      DEF D1
      DEF RESNO     RESOURCE NUMBER 
      DEF ISTAT     STATUS RETURN 
RTN49 EQU * 
* 
      JSB READF     READ USER'S ACCT TO CLEAR MESSAGES WAITING BIT
      DEF RTN45 
      DEF I.BUF     ACCOUNT FILE DCB
      DEF JERR      ERROR RETURN WORD 
      DEF IBUF      BUFFER FOR 128-WORD ACCOUNT FILE RECORD 
      DEF D128      128 WORDS TO BE READ
      DEF LEN       NUMBER OF WORDS ACTUALLY READ 
      DEF USACT     ACCOUNT FILE RECORD NUMBER
RTN45 EQU * 
* 
      LDB DFIBF     ADDRESS OF IBUF 
      ADB OFFST     ADD OFFSET (0 OR 64 WORDS)
      ADB D20       OFFSET TO "MESSAGE FILE EXISTS" WORD
      CLA           CLEAR THE MESSAGES WAITING BIT
      STA B,I       SAVE IT 
* 
      JSB POSNT     RE-POSITION TO USER RECORD NUMBER 
      DEF RTN46 
      DEF I.BUF     ACCOUNT FILE DCB
      DEF JERR      ERROR RETURN WORD 
      DEF USACT     ACCOUNT FILE RECORD NUMBER
      DEF D1        FLAG TO POSNT 
RTN46 EQU * 
* 
      JSB WRITF     WRITE NEW USER ACCOUNT
      DEF RTN47 
      DEF I.BUF     ACCOUNT FILE DCB
      DEF JERR      ERROR RETURN WORD 
      DEF IBUF      BUFFER WITH NEW ACCOUNT 
      DEF D128
RTN47 EQU * 
* 
      JSB RNRQ      RELEASE THE RN LOCK 
      DEF RTN48 
      DEF D4
      DEF RESNO     RESOURCE NUMBER 
      DEF ISTAT     STATUS RETURN 
RTN48 EQU * 
      JMP ERROR 
* 
BKUP2 JSB APOSN     POSITION TO END OF PREVIOUS MESSAGE 
      DEF RTN73 
      DEF FDCB      MESSAGE FILE DCB
      DEF IERR,I    ERROR RETURN WORD 
      DEF FIREC 
      DEF FIRB
      DEF FIOFF 
RTN73 EQU * 
* 
      JSB WRITF     WRITE EOF 
      DEF RTN74 
      DEF FDCB      MESSAGE FILE DCB
      DEF IERR,I    ERROR RETURN WORD 
      DEF UBUF
      DEF DM1 
RTN74 EQU * 
      JMP ERROR 
* 
LAB16 JSB CLOS.     CLOSE OUT MESSAGE FILE TO CLEAR DCB 
      DEF RTN75 
      DEF O.BUF 
RTN75 EQU * 
* 
*     NOW CLOSE FILE WITH TRUNCATE
* 
LAB18 JSB LOCF      FIND POSITION OF EOF
      DEF RTN22 
      DEF FDCB
      DEF JERR
      DEF IREC      RECORD NUMBER 
      DEF IRB       NEXT BLOCK
      DEF IOFF      OFFSET WITHIN BLOCK 
      DEF JSEC      SECTOR
RTN22 EQU * 
* 
*  CALCULATE THE NUMBER OF BLOCKS TO TRUNCATE 
*  ITRUN=JSEC/2-IRB-1 
* 
      LDA JSEC      GET NUMBER OF SECTORS 
      CLB 
      DIV D2        DIVIDE BY 2  (2 SECTORS/BLOCK)
      LDB IRB       GET BLOCK 
      CMB,INB 
      ADA B         SUBTRACT
      ADA DM1       SUBTRACT 1
      STA ITRUN     NUMBER OF BLOCKS TO TRUNCATE
      CLA           CLEAR ERROR RETURN WORD 
      JMP EXIT
ERROR JSB RNRQ      RELEASE RESOURCE NUMBER 
      DEF RTN43 
      DEF D4        CODE FOR CLEARING RN
      DEF RESNO     RESOURCE NUMBER FOR ACCT FILE WRITE 
      DEF ISTAT     RETURN BUFFER FROM RNRQ 
RTN43 EQU * 
* 
      LDA RWERR 
      SSA,RSS 
      JMP EXITA 
      JMP EXIT
ER45  LDA D45       SESSION COMMAND ONLY
      RSS 
ER55  LDA D55       MISSING PARAMETER 
      RSS 
EXITA LDA JERR
EXIT  STA IERR,I
* 
*  NOW CLOSE WITH TRUNCATE
* 
      JSB CLOS.     CLOSE USER'S NAMR 
      DEF RTN23 
      DEF O.BUF 
RTN23 EQU * 
      JSB CLOSE     CLOSE MESSAGE FILE
      DEF RTN24 
      DEF FDCB
      DEF JERR
      DEF ITRUN 
RTN24 EQU * 
* 
*  CLOSE ACCOUNT FILE 
* 
      JSB CLOSE     CLOSE ACCOUNT 
      DEF RTN25 
      DEF I.BUF 
RTN25 EQU * 
* 
* 
* 
      JMP SM.SB,I 
* 
ACCT  ASC 3,+@CCT!
ADACT BSS 1 
ADBUF DEF UBUF
ADRTM DEF DRTIM 
ADSCB BSS 1 
BLNK  ASC 1,
CNTR  BSS 1 
CNTR1 BSS 1 
XEQT  EQU 1717B     ID SEG ADDR OF CURRENT PROGRAM
DRTIM BSS 11        DIRECTORY IMAGE CONTAINS USER.GROUP NAME
DFIBF DEF IBUF      ADDRESS OF IBUF 
DIR## BSS 1 
DIRNO BSS 1 
DNUM  BSS 1 
DM46  DEC -46 
DM33  DEC -33 
DM30  DEC -30 
DM12  DEC -12 
DM10  DEC -10 
DM8   DEC -8
DM6   DEC -6
DM4   DEC -4
DM3   DEC -3
DM2   DEC -2
DM1   DEC -1
D0    DEC 0 
D1    DEC 1 
D2    DEC 2 
D3    DEC 3 
D4    DEC 4 
D5    DEC 5 
D6    DEC 6 
D7    DEC 7 
D8    DEC 8 
D14   DEC 14
D16   DEC 16
D20   DEC 20
D24   DEC 24
D30   DEC 30
D45   DEC 45
D50   DEC 50
D55   DEC 55
D73   DEC 73
D64   DEC 64
D128  DEC 128 
M377  OCT 377 
M7777 OCT 77777 
M1000 OCT 100000
M2000 OCT 20000 
M707  OCT 70707 
EMPTY BSS 1         EMPTY=1 IF MESSAGE FILE CREATED BY THIS INVOCATION
FDCB  BSS 144 
FILE  BSS 1         FILE=1 IF NAMR SUPPLIED 
FIOFF BSS 1 
FIRB  BSS 1 
FIREC BSS 1 
ADGNL DEF GENRL     ADDRESS OF ASCII "GENERAL"
GENRL ASC 4,GENERAL 
IBUF  BSS 128 
ICHAR BSS 1 
INAM2 BSS 10
INAM  BSS 10        10 WRD OUTPUT BUFFER FOR NAMR ROUTINE 
IOPTN OCT 401       OPEN OPTION WORD
IRB   BSS 1         NEXT BLOCK
IREC  BSS 1         NEXT BLOCK
ISTAT BSS 1 
ISTRW BSS 1 
ITRUN BSS 1 
IOFF  BSS 1         OFFSET WITHIN BLOCK 
JERR  BSS 1 
JSEC  BSS 1         SECTOR WITHIN BLOCK 
KERR  BSS 1 
LBUFR BSS 1 
LEN   BSS 1         NUMBER OF WORDS READ FROM READ CALL 
LENTH BSS 1         LENGTH OF BUFFER TO BE PARSED 
LUNO. BSS 1 
MSGLU BSS 1         LU OF MESSAGE FILES FROM ACCT FILE
NAME  BSS 3 
NOPL  BSS 2         SECURITY CODE, CRN
OFFST BSS 1 
RESNO BSS 1         RESOURCE NO. FROM ACCOUNT FILE
RWERR BSS 1 
SECT3 EQU 1760B 
SECU  DEC -31178
TEMP  BSS 1 
TEMP1 BSS 1 
TEMP2 BSS 2 
TEXT  BSS 1         TEXT=1 IF TEXT (STRING) SUPPLIED
UBUF  BSS 128 
USACT BSS 1         USER ACCOUNT RECORD # 
USRID BSS 1         SENDER'S SESSION ID 
WRDCT BSS 1 
      END 
                                                                                                                                                                  