.TITLE ALT .IDENT /V7.11/ ;******************************************************************* ; ; ALT.TSK ; ; TASK ALT... IS RESPONSIBLE FOR THE AUXILIARY LOGGING OF TASKS ; THAT THE NORMAL LOGGING TASK LOG... CANNOT LOG. ; ANY TASK THAT FINISHES WHEN THE INITIATING USER IS NOT LOGGED ; ON RESULTS IN LOG... QUEUEING THE DATA PACKET TO ALT..., WHICH THEN ; CALCULATES THE CHARGE, MAKES A NOTE OF IT IN THE ACCOUNTING SYSTEM DATA ; FILE, AND UPDATES THE ACCOUNT BALANCE. THE ACCOUNT TO WHICH THE TASK IS ; CHARGED IS THE FIRST ONE FOUND WITH THE CORRECT UIC, UNLESS IT HAPPENS ; TO BE CHAINED, WHEN THE MASTER ACCOUNT IS CHARGED. ; ALSO, PAGE PRINT REQUESTS THAT ARE RECEIVED BY THE LOGGING TASK ARE ; QUEUED HERE IF THE USER WAS NOT LOGGED ON. ; IF THE ACCOUNT TO WHICH CHARGES ARE TO BE MADE CAN'T BE FOUND IN THE ; ACCOUNT FILE, THEN THE SYSTEM ACCOUNT (SET /SYSUIC) IS CHARGED. ; ; VERSION: V6 FEBRUARY 1980 ; VERSION: V7 JANUARY 1981 ; ; STEVE THOMPSON SCHOOL OF CHEMICAL ENGINEERING ; OLIN HALL ; CORNELL UNIVERSITY ; ITHACA NY 14853 ; ; REVISION HISTORY ; ---------------- ; ; SMT718 20-JUL-81 ADDED PRINTED PAGE COUNT LOGIC ; ; SMT726 28-JUL-81 ADDED ERROR MESSAGE TEXT IN PLACE OF ; MESSAGE NUMBERS ; ; SMT727 28-JUL-81 ADDED LOGIC TO CHARGE FOR PAGE PRINT ; REQUESTS AND RECORD THEM IN THE ; TRANSACTIONS FILE. SOME RESTRUCTURING ; OF THE CODE ACCOMPANIED THIS CHANGE. ; ; SMT752 29-SEP-81 NAME OF DESPOOLER TASK IS WRITTEN TO ; THE TRANSACTIONS FILE FOR A PAGE ; PRINT REQUEST. ; ; SMT753 7-OCT-81 CHANGED NAMES OF CONDITIONAL ASSEMBLY ; PARAMETERS; SEE THE FILES MODIFY.TXT AND ; CONDEF.MAC FOR DETAILS. ; ; SMT774 24-OCT-81 ADDED SUPPORT FOR CHARGING AND LOGGING OF ; MEMORY USAGE. ; ; SMT796 3-DEC-81 FIX AN ERROR IN THE MEMORY HANDLING CODE ; WHERE AN INCORRECT OFFSET WAS USED IN ; ROUTINE "TASK". ALSO MAKE SURE MEMORY ; CHARGES ARE CORRECTLY DEBITED TO THE ; ACCOUNT. ; ; SMT808 17-MAR-82 CHARGE SYSTEM ACCOUNT IF USER ACCOUNT ; CAN'T BE FOUND (MOST USEFUL FOR SYSTEM ; ACCOUNTS THAT DO NOT HAVE AN ACCOUNT FILE ; ENTRY) ; ; SMT821 23-APR-82 CHANGED ENTRY POINT NAMES OF ACCOUNTING ; SUPPORT ROUTINES (SEE MODIFY.TXT) ; ; SMT851 22-JUL-83 ADDED RSX-11M V4.1 SUPPORT ; ;****************************************************************** .MCALL DIR$,GTIM$S,QIOW$,EXIT$S,FINIT$ .MCALL EXST$ ACCDF$ <:>,<=> ; DEFINE ACCOUNTING PACKET OFFSETS ACTDF$ ; DEFINE ADDITIONAL A/C FILE OFFSETS FILDF$ ; DEFINE A/C DATA FILE OFFSETS LF=12 ; LINEFEED CR=15 ; CARRIAGE RETURN SPA=40 ; SPACE ; ; THE DEFINITION OF THE SYMBOL "ALTMSG" MAY BE REMOVED TO PREVENT ; THIS TASK FROM TYPING OUT ITS STARTUP MESSAGE "ALT...". ; ;ALTMSG=0 ; ; MACROS ; .MACRO PRINT MSG,MSGSZ MOV MSG,DPBOUT+Q.IOPL .IF B MSGSZ MOV MSG'SZ,DPBOUT+Q.IOPL+2 .IFF MOV MSGSZ,DPBOUT+Q.IOPL+2 .ENDC DIR$ #DPBOUT .ENDM .MACRO ERROR ERR PRINT ERR MOV #EX$ERR,STOP+E.XSTS .ENDM .IF DF AA$ALT ; ; ERROR MESSAGE TEXT ; .NLIST BEX .IIF DF AA$V40 ! AA$V41, .ENABL LC ERR1: .ASCII /ALT... -- Transactions file open error/ ERR1SZ=.-ERR1 ERR2: .ASCII /ALT... -- Account file open error/ ERR2SZ=.-ERR2 ERR3: .ASCII /ALT... -- (SYSTEM) Account not found/ ERR3SZ=.-ERR3 .IF DF ALTMSG MSG1: .ASCII /ALT.../ MSG1SZ=.-MSG1 .EVEN .ENDC ; DF ALTMSG .EVEN DPBOUT: QIOW$ IO.WBT,1,1,,,,<0,0,40> ; OUTPUT DPB .BLKB 4 ; WORKSPACE FOR SYSUIC FORMATTER SYSUIC: .BLKB 6. ; SYSTEM UIC FORMATTING BUFFER .BLKB 4 ; WORKSPACE FOR UIC FORMATTER UIC: .BLKB 6 ; UIC FORMATTING BUFFER PKTADR: .WORD 0 ; ADDRESS OF RECEIVED PACKET PAGFLG: .WORD 0 ; PAGE PRINT REQUEST 0=NO 1=YES STOP: EXST$ EX$SUC ; EXIT WITH STATUS DPB CPUBLK: .WORD $CPU1 ; CPU CHARGE CALC. ARGUMENT BLOCK .WORD $CPU2 ; .IF DF AA$QIO & AA$TCQ QIOBLK: .WORD $QIO1 ; I/O CHARGE CALC. ARGUMENT BLOCK .WORD $QIO2 ; .ENDC ; DF AA$QIO & AA$TCQ .IF DF AA$MEM MEMBLK: .WORD $MEM1 ; .WORD $MEM2 ; .ENDC ; DF AA$MEM .PAGE .IFTF $ALTEP: ; PROGRAM ENTRY POINT .IFT .IF DF ALTMSG PRINT #MSG1 ; SAY THAT WE'RE OPERATING .ENDC ; ALTMSG FINIT$ ; INITIALISE FSR MOV #SYSUIC,R0 ; GET ADDRESS FOR SYSTEM MEMBER CODE CLR R1 ; GET SYSTEM MEMBER CODE BISB $SYUIC,R1 ; MOV PC,R2 ; INCLUDE LEADING ZEROES CALL $CBOMG ; FORMAT SYSTEM MEMBER CODE, 6 OCTAL DIGITS MOV #SYSUIC-3,R0 ; GET ADDRESS FOR SYSTEM GROUP CODE CLR R1 ; GET SYSTEM GROUP CODE BISB $SYUIC+1,R1 ; CALL $CBOMG ; FORMAT SYSTEM GROUP CODE ; ; EXAMINE THE RECEIVE QUEUE FOR SOME WORK TO DO. ; CURRENTLY, ALT... HANDLES THE FOLLOWING: ; (1) EXITING TASKS, WHERE OFFSET B.MASK OF THE RECEIVED PACKET ; CONTAINS THE TCB ADDRESS OF THE TASK, AND IS THEREFORE EVEN. ; (2) PAGE PRINT REQUESTS FOR USERS THAT ARE NOT LOGGED IN. OFFSET ; B.MASK CONTAINS AND IS THEREFORE ODD ; ALT: MOV $TKTCB,R0 ; GET OUR TCB ADDRESS ADD #T.RCVL,R0 ; POINT TO OUR RECEIVE QUEUE CLR PKTADR ; ZERO ADDRESS OF RECEIVE PACKET CALL $SWSTK,5$ ; SWITCH STACKS CALL $QRMVF ;; REMOVE PACKET FROM QUEUE BCS 6$ ;; IF CARRY SET, NONE THERE MOV R1,PKTADR ;; STORE PACKET ADDRESS 6$: RETURN ;; BACK TO USER STATE 5$: MOV PKTADR,R5 ; COPY PACKET ADDRESS TO R5 BNE 10$ ; NON-ZERO IS GOOD JMP EXIT ; EXIT IF NO WORK TO DO ; ; DETERMINE REQUEST TYPE ; 10$: CLR PAGFLG ; ASSUME THAT IT'S A TASK EXITING BIT #1,B.MASK(R5) ; IS IT A TASK? BEQ 11$ ; IF EQ YES INC PAGFLG ; NO, IT'S A PAGE PRINT COMMAND ; ; CONVERT UIC FROM PACKET TO 6 ASCII CHARACTERS FOR ACCOUNT FILE SEARCH ; 11$: MOV #UIC,R0 ; GET ADDR FOR MEMBER CODE CLR R1 ; CLEAR R1 READY FOR MEMBER CODE BISB B.UIC(R5),R1 ; GET MEMBER CODE MOV PC,R2 ; INCLUDE LEADING ZEROES CALL $CBOMG ; FORMAT MEMBER CODE MOV #UIC-3,R0 ; GET ADDR FOR GROUP CODE CLR R1 ; CLEAR R1 READY FOR GROUP CODE BISB B.UIC+1(R5),R1 ; GET GROUP CODE CALL $CBOMG ; FORMAT GROUP CODE ; ; OPEN TRANSACTIONS RECORDING FILE. THIS IS DONE AT THIS STAGE SINCE $RFOPN ; ZEROES THE DATA BUFFER AT $RFREC. ; CALL $RFOPN ; OPEN THE ACCOUNTING DATA FILE BCC 15$ ; IF CC OK ERROR #ERR1 ; ISSUE THE APPROPRIATE ERROR MESSAGE JMP ALT1 ; AND TERMINATE THIS REQUEST ; ; LOG THE DETAILS AND CALCULATE THE RELEVANT CHARGE ; 15$: TST PAGFLG ; PAGE PRINT REQUEST? BEQ 16$ ; IF EQ NO CALL PAGE ; YES, PROCESS IT BR 140$ ; 16$: CALL TASK ; PROCESS INFO. FOR EXITING TASK ; ; LOCATE THE ACCOUNT IN THE ACCOUNT FILE. IF IT IS NOT FOUND, WE LOOK FOR ; THE SYSTEM ACCOUNT AND CHARGE TO THAT. IF THE SYSTEM ACCOUNT CANNOT ; BE FOUND, NOTHING IS ENTERED INTO THE TRANSACTIONS FILE SINCE NO ; CHARGES WERE MADE. ; 140$: CLR $ACTFL+F.FNB+N.FID ; DON'T TRY TO OPEN BY FILE ID CALL $AFOPN ; OPEN ACCOUNT FILE BCC 150$ ; IF CC, OPEN SUCCESSFUL CALL $RFCLS ; MAKE SURE TRANSACTION FILE IS CLOSED ERROR #ERR2 ; ISSUE ACCOUNT FILE OPEN ERROR JMP ALT1 ; GO AGAIN 150$: MOV #ACCPT1,$ASUBR ; SET ADDRESS OF ACCEPTANCE ROUTINE CALL $ASCAN ; LOCATE THE ACCOUNT BCC 155$ ; IF CC FOUND IT MOV #ACCPT3,$ASUBR ; SET TO SEARCH FOR SYSTEM ACCOUNT CALL $ASCAN ; LOCATE SYSTEM ACCOUNT BCC 155$ ; IF CC, FOUND IT CALL $AFCLS ; CLOSE THE ACCOUNT FILE CALL $RFCLS ; AND THE TRANSACTION FILE ERROR #ERR3 ; ACCOUNT NOT FOUND BR ALT1 ; TRY NEXT ONE 155$: MOV A.ACNO(R0),R1 ; GET ACCOUNT NUMBER MOV R1,$RFREC+F.ACNO ; SAVE ACCOUNT NUMBER MOV A.CHWD(R0),$RFREC+F.CHWD ; SAVE ACCOUNT CHAIN WORD BEQ 156$ ; IF EQ IT'S NOT CHAINED MOV #ACCPT2,$ASUBR ; SET ADDRESS OF MASTER A/C ACCEPTANCE ROUTINE CALL $ASCAN ; SEARCH FOR THE MASTER ACCOUNT BCS 157$ ; IF CS CAN'T FIND IT MOV A.ACNO(R0),R1 ; GET MASTER A/C NUMBER BIC #100000,R1 ; CLEAR MASTER FLAG BIT ; ; UPDATE ACCOUNT BALANCE USING CALCULATED CHARGES ; 156$: MOV R1,$RFREC+F.MSTR ; SAVE MASTER A/C NUMBER IN BUFFER TST PAGFLG ; PAGE PRINT REQUEST? BEQ 1561$ ; IF EQ NO ADD B.PAGE(R5),A.PAGE(R0) ; YES, UPDATE OFFLINE PAGE COUNT SUB $RFREC+F.PAGE+6,A.CASH+2(R0) ; SUBTRACT PAGE CHARGE SBC A.CASH(R0) ; SUB $RFREC+F.PAGE+4,A.CASH(R0) ; BR 1562$ ; REWRITE ACCOUNT FILE 1561$: SUB $RFREC+F.CPU+6,A.CASH+2(R0) ; SUBTRACT THE CPU CHARGE SBC A.CASH(R0) ; SUB $RFREC+F.CPU+4,A.CASH(R0) ; .IF DF AA$QIO & AA$TCQ SUB $RFREC+F.QIO+6,A.CASH+2(R0) ; SUBTRACT THE I/O CHARGE SBC A.CASH(R0) ; SUB $RFREC+F.QIO+4,A.CASH(R0) ; .ENDC ; DF AA$QIO & AA$TCQ .IF DF AA$MEM SUB $RFREC+F.CORE+6,A.CASH+2(R0) ; SUBTRACT THE MEMORY CHARGE SBC A.CASH(R0) ; SUB $RFREC+F.CORE+4,A.CASH(R0) ; .ENDC ; DF AA$MEM 1562$: ; REF. LABEL ; ; CLOSE ACCOUNT AND TRANSACTIONS FILES AND LOOK FOR MORE WORK ; CALL $AFPUT ; RE-WRITE ACCOUNT FILE CALL $RFPUT ; LOG THIS TRANSACTION 157$: CALL $AFCLS ; CLOSE THE ACCOUNT FILE CALL $RFCLS ; CLOSE THE TRANSACTION FILE ALT1: CALL $SWSTK,ALT ; SWITCH STACKS MOV R5,R0 ;; COPY PACKET ADDRESS TO R0 MOV #B.LGTH,R1 ;; GET PACKET LENGTH TST PAGFLG ;; PAGE PRINT REQUEST? BEQ 200$ ;; IF EQ NO MOV #B.LPAG,R1 ;; YES, SET RIGHT LENGTH TO DEALLOCATE 200$: CALLR $DEACB ;; DEALLOCATE THE PACKET AND GET MORE WORK .IFTF EXIT: DIR$ #STOP ; EXIT WITH STATUS .IFT ;+ ; *** TASK ; ; THIS ROUTINE IS CALLED TO PROCESS THE DATA FOR AN EXITING ; TASK. CHARGES ARE CALCULATED AND THE TRANSACTIONS BUFFER ; IS FILLED IN. ; THE MEMORY USAGE HAS ALREADY BEEN CALCULATED BY LOG... AND ; ENTERS AS B.ELPT(R5) AND B.ELPT+2(R5). ; ;- TASK: MOV #FF.ALT,$RFREC ; INSERT TRANSACTION CODE MOV #F.LBYE,$RFLEN ; SET LENGTH OF TRANSACTION RECORD MOV B.UIC(R5),$RFREC+F.UIC ; INSERT TASK UIC MOV B.UCB(R5),R0 ; GET TASK'S TI: UCB ADDRESS MOV U.DCB(R0),R2 ; GET DCB ADDRESS MOV D.NAM(R2),$RFREC+F.DEVN ; RECORD THE DEVICE NAME SUB D.UCB(R2),R0 ; CALCULATE THE UNIT NUMBER MOV D.UCBL(R2),R1 ; CALL $DIV ; ADD D.UNIT(R2),R0 ; BIC #177400,R0 ; ZAP THE EXTRANEOUS BITS MOV R0,$RFREC+F.DEVU ; AND SAVE IN THE DATA BUFFER MOV B.TNAM(R5),$RFREC+F.CONN ; SAVE TASK NAME MOV B.TNAM+2(R5),$RFREC+F.CONN+2 ; MOV #<$RFREC+F.CPU>,R3 ; GET BUFFER ADDRESS FOR CPU DATA MOV B.CPU(R5),(R3)+ ; SAVE THE CPU TIME MOV B.CPU+2(R5),(R3)+ ; .IF DF AA$FPR MOV R3,-(SP) ; SAVE DATA BUFFER POINTER (TE.FF CHANGES R3) CALL TE.FF ; CALCULATE PRIO ADJUSTED CPU TIME MOV (SP)+,R3 ; RESTORE DATA BUFFER POINTER MOV R1,B.CPU(R5) ; OVERWRITE CPU TIME WITH RESULT MOV R2,B.CPU+2(R5) ; .ENDC ; DF AA$FPR MOV R5,-(SP) ; SAVE DSR PACKET ADDRESS MOV R3,-(SP) ; SAVE DATA BUFFER POINTER ADD #B.CPU,R5 ; POINT R5 TO CPU TIME MOV #CPUBLK,R4 ; GET ML.DV ARGUMENT BLOCK ADDRESS CALL ML.DV ; CALCULATE CPU CHARGE MOV (SP)+,R3 ; RESTORE DATA BUFFER POINTER MOV R1,(R3)+ ; SAVE THE CPU CHARGE MOV R2,(R3)+ ; .IF DF AA$QIO & AA$TCQ MOV (R5),(R3)+ ; SAVE I/O REQUEST COUNT IN BUFFER MOV 2(R5),(R3)+ ; (R5 SET UP ALREADY BY ML.DV CALL) MOV R3,-(SP) ; SAVE DATA BUFFER POINTER MOV #QIOBLK,R4 ; GET ML.DV ARGUMENT BLOCK ADDRESS CALL ML.DV ; CALCULATE I/O CHARGE MOV (SP)+,R3 ; RESTORE DATA BUFFER POINTER MOV R1,(R3)+ ; INSERT THE I/O CHARGE MOV R2,(R3)+ ; .ENDC ; DF AA$QIO & AA$TCQ .IF DF AA$MEM MOV (SP),R5 ; RESTORE DSR PACKET ADDRESS ADD #B.ELPT,R5 ; POINT R5 TO CORE-TIME USAGE MOV (R5),$RFREC+F.CORE ; SAVE MEMORY USAGE MOV 2(R5),$RFREC+F.CORE+2 ; MOV #MEMBLK,R4 ; GET ML.DV ARGUMENT BLOCK ADDRESS CALL ML.DV ; CALCULATE CORE-TIME CHARGE MOV R1,$RFREC+F.CORE+4 ; SAVE THE CORE-TIME CHARGE MOV R2,$RFREC+F.CORE+6 ; .ENDC ; DF AA$MEM MOV (SP)+,R5 ; RESTORE DSR PACKET ADDRESS RETURN ; RETURN TO CALLER ;+ ; *** PAGE ; ; THIS ROUTINE IS CALLED TO PROCESS A PAGE PRINT REQUEST FOR A ; USER THAT IS NOT LOGGED ON. THE CHARGE IS CALCULATED AND THE ; INFORMATION IS LOGGED IN THE TRANSACTIONS FILE. NOTE THAT WE ; CANNOT SUPPLY A DEVICE NAME AND NUMBER FOR THIS TYPE OF ; TRANSACTION, ALTHOUGH THE DESPOOLER TASK NAME IS KNOWN AND ; THE DEVICE CAN BE DEDUCED FROM THIS. ; ;- PAGE: MOV #FF.PAG,$RFREC ; SET TRANSACTION CODE MOV #F.LBYE,$RFLEN ; SET RECORD LENGTH MOV B.UIC(R5),$RFREC+F.UIC ; INSERT UIC FOR PRINT MOV B.SPNM(R5),$RFREC+F.CONN ; INSERT DESPOOLER TASK NAME MOV B.SPNM+2(R5),$RFREC+F.CONN+2 ; MOV B.PAGE(R5),R0 ; GET PAGE COUNT MOV R0,$RFREC+F.PAGE+2 ; INSERT IN DATA BUFFER MOV #$PAG1,R1 ; GET CHARGE PER PAGE CALL $MUL ; CALCULATE TOTAL CHARGE MOV R0,$RFREC+F.PAGE+4 ; SAVE IN TRANSACTIONS BUFFER MOV R1,$RFREC+F.PAGE+6 ; RETURN ; THAT'S IT ;+ ; *** ACCPT1 ACCEPTANCE ROUTINE FOR TASK UIC ; ; INPUT: ; R0 ADDRESS OF ACCOUNT ENTRY ; ; OUTPUT: ; CARRY CLEAR ACCOUNT FOUND ; CARRY SET ACCOUNT NOT FOUND ;- ACCPT1: TST A.ACNO(R0) ; ACCOUNT INITIALISED? BEQ 10$ ; IF EQ NO CMP UIC,A.GRP(R0) ; GROUP CODES MATCH? BNE 10$ ; IF NE NO CMP UIC+2,A.GRP+2(R0) ; MAYBE BNE 10$ ; IF NE NO CMP UIC+4,A.MBR+1(R0) ; YES, MEMBER CODES MATCH? BEQ 20$ ; IF EQ YES, RETURN WITH THIS ENTRY 10$: SEC ; ERROR, ACCOUNT NOT FOUND 20$: RETURN ; ;+ ; *** ACCPT2 ACCEPTANCE ROUTINE FOR MASTER A/C ; ; INPUT: ; R0 ADDRESS OF ACCOUNT ENTRY ; ; OUTPUT: ; CARRY CLEAR ACCOUNT FOUND ; CARRY SET ACCOUNT NOT FOUND ;- ACCPT2: MOV A.ACNO(R0),R1 ; GET ACCOUNT NUMBER BEQ 10$ ; IF EQ A/C NOT ENABLED BIC #100000,R1 ; CLEAR MASTER A/C FLAG CMP R1,$RFREC+F.CHWD ; THIS ACCOUNT? BEQ 20$ ; IF EQ YES 10$: SEC ; ERROR, ACCOUNT NOT FOUND 20$: RETURN ; ;+ ; *** ACCPT3 ACCEPTANCE ROUTINE FOR SYSTEM UIC ; ; INPUT: ; R0 ADDRESS OF ACCOUNT ENTRY ; ; OUTPUT: ; CARRY CLEAR SYSTEM ACCOUNT FOUND ; CARRY SET SYSTEM ACCOUNT NOT FOUND ;- ACCPT3: TST A.ACNO(R0) ; ACCOUNT INITIALISED? BEQ 10$ ; IF EQ NO CMP SYSUIC,A.GRP(R0) ; GROUP CODES MATCH? BNE 10$ ; IF NE NO CMP SYSUIC+2,A.GRP+2(R0) ; MAYBE BNE 10$ ; IF NE NO CMP SYSUIC+4,A.MBR+1(R0) ; YES, MEMBER CODES MATCH? BEQ 20$ ; IF EQ YES, RETURN WITH THIS ENTRY 10$: SEC ; ERROR, ACCOUNT NOT FOUND 20$: RETURN ; .ENDC ; DF AA$ALT .END $ALTEP