;DAILY.MAC .IDENT /V1.401/ ; ; DAILY POINTER FILE UPDATE PROGRAM ; ; MARK C. WESTON - DECEMBER 1981 ; ; MODIFIED: ; ; 09-DEC-82 BY MCW - CHANGED DAILY.CMD TO GLADIS/CAD DEVICE ; 31-DEC-82 BY MCW - ADDED #^RALL TO MSCRN NEW YEAR MSG ; 03-JAN-83 BY MCW - ADDED LUN ASSIGNMENTS NEEDED FOR NEW YEAR ROUTINES ; 25-JAN-83 BY MCW - CHANGED DAILY RUNS TO BATCH ; 15-MAR-83 BY MCW - IMPROVED IOT CODE ; ; .MCALL MDSASG,MPNTR,OPNS$M,CLOSE$,READ$,WRITE$,WAIT$,ALUN$C,PUT$ .MCALL GTIM$S,FDBDF$,FSRSZ$,FDRC$A,FDBK$A,FDOP$A,EXIT$S,SPWN$S .MCALL FDAT$A,FDBF$A,OPEN$W,OPEN$M,WSIG$S,MSCRN,MASCII,MADM42,ALUN$S ; MDSASG ;DEVICE ASSIGNMENT AND PACKET OFFSETS MPNTR ;POINTER FILE OFFSETS MASCII ;ASCII SYMBOLICS MADM42 ;ADM42 SYMBOLICS FSRSZ$ 1 ;FSR ALLOCATION FOR RECORD I/O IOST: .BLKW 2 ;I/O STATUS BLOCK .EVEN ; ; POINTER FILE FDB ; POINTR: FDBDF$ ;ALLOCATE FDB FDRC$A FD.RWM ;INIT RECORD ACCESS FOR R/W BLOCK I/O FDBK$A BLKBUF,1000,,,IOST ;INIT BLOCK ACCESS SECTION ;BLOCK BUFFER POINTER BLOCK ;1 BLOCK IN LENGTH (OCTAL 1000) ;EVENT FLAG 32. IS USED FOR SYNCHRONIZATION ;IOST IS THE I/O STATUS BUFFER FDOP$A PTLUN,POIDSC,,,FA.ENB!FA.DLK ;LUN ,DATASET DESCRIPTOR POINTER ; POIDSC: .WORD POIL1,POIN ;DEVICE POINTER .WORD POIL2,POIDIR ;DIRECTORY POINTER .WORD POIL3,POIFIL ;FILENAME POINTER ; POIN: .ASCII /DV:/ ;FILE DEVICE POIL1 = .-POIN POIDIR: .ASCII /[260,6]/ ;FILE DIRECTORY POIL2 = .-POIDIR POIFIL: .ASCII /POINTR./ ;FILE NAME POIEXT: .ASCII /XXX/ ;FILE EXTENSION POIL3 = .-POIFIL .EVEN ; ; ; CASE FILE ; .EVEN ; CASENO: FDBDF$ ; ALLOCATE FDB FOR CASE NUMBER FILE FDAT$A R.FIX,FD.CR,16.,256.,256. ; INIT FILE ATTRIBUTES ; FIXED LENGTH RECORDS ; CR/LF FOR UNIT RECORD DEVICES ; 16 BYTES PER RECORD ; 50 BLOCKS ALLOC ON EXTENSION FDRC$A FD.RAN ; INIT RECORD ACCESS ; RANDOM ACCESS ; MOVE MODE FDOP$A CSLUN,CASEDS,,,FA.ENB!FA.DLK ; INIT FILE OPEN ; DISK LUN ; DATASET DESCRIPTOR CASEDS ; DISABLE LOCK ON ABORT FDBF$A ; INIT BLOCK BUFFER FOR RECORD ACCESS ; CASEDS: .WORD CASL1,CASD ; DATASET DESCRIPTOR POINTERS .WORD CASL2,CASU ; .WORD CASL3,CASN ; ; CASD: .ASCII /DV:/ ; DEVICE CASL1= . - CASD CASU: .ASCII /[260,6]/ ; DIRECTORY CASL2= . - CASU CASN: .ASCII /CASE/ ; FILENAME CASYR: .ASCII /XX/ .ASCII /./ CASEX: .ASCII /XXX/ CASL3= . - CASN ; ; CASE POINTER FILE FDB ; CASEPT: FDBDF$ ; ALLOCATE FDB FOR CASE POINTER FILE FOR OVFL FDAT$A R.FIX,FD.CR,8.,256.,256. ; INIT FILE ATTR ; FIXED LENGTH RECORDS ; CR/LF FOR UNIT RECORD DEVICES ; 8 BYTES PER RECORD ; 10 BLOCKS ALLOC ON EXTENSION FDRC$A FD.RAN ; INIT RECORD ACCESS ; RANDOM ACCESS ; MOVE MODE FDOP$A CPLUN,CPTDS,,,FA.ENB!FA.DLK ; INIT FILE OPEN ; LUN 2 ; DATASET DESCRIPTOR CASEDS ; DISABLE LOCK ON ABORT FDBF$A ; INIT BLOCK BUFFER FOR RECORD ACCESS ; CPTDS: .WORD CPTL1,CPTD ; DATASET DESCRIPTOR POINTERS .WORD CPTL2,CPTU ; .WORD CPTL3,CPTN ; ; CPTD: .ASCII /DV:/ ; DEVICE CPTL1= . - CPTD CPTU: .ASCII /[260,6]/ ; DIRECTORY CPTL2= . - CPTU CPTN: .ASCII /CPTR/ ; FILENAME CPTYR: .ASCII /XX/ .ASCII /./ CPTEX: .ASCII /XXX/ CPTL3= . - CPTN ERRADR:: BUFF:: .WORD 0 ;DUMMY SYMBOLICS FOR DISSTA PKTADR: .WORD 0 ;PACKET ADDRESS YRFLAG: .WORD 0 ;YEAR CHANGE FLAG BLKBUF: .BLKW 256. ;BLOCK BUFFER FOR BLOCK I/O TIMBUF: .BLKW 8. ;TIME BUFFER NEWCPT: .WORD 0 ;RECORD FOR CASE POINTER FILE .WORD 2 ;FIRST AVAILABLE RECORD IS RECORD 2 .WORD 0 ;DUMMY .WORD 0 ;DUMMY LNCPT= .-NEWCPT MCR: .RAD50 /MCR.../ ;MCR DISPATCHER DAILY: .ASCII /SUB DV0:[1,1]DAILY.BAT/ ;SPAWN DAILY.BAT LDAILY= . - DAILY MNTHLY: .ASCII /SUB DV0:[1,1]MONTHLY.BAT/ ;SPAWN MONTHLY.BAT LMNTHLY=. - MNTHLY YEARLY: .ASCII /SUB DV0:[1,1]YEARLY.BAT/ ;SPAWN YEARLY.BAT LYEARLY=. - YEARLY ; ; HAPPY NEW YEAR MESSAGE ; HAPNY: .ASCII /HAPPY NEW YEAR!!!!!!!!!!!!!!/ .ASCII / WHOOOOOOPPPEEEEEEEEEEEE/ .ASCII LHAPNY= .-HAPNY ; ; ;+ ; DAILY POINTER FILE UPDATE PROGRAM RUNS EVERY NIGHT AT MIDNIGHT ; ; UPDATES HISTORY POINTERS FOR EVENT NUMBER AND CASE NUMBER ; ALSO CLEARS OUT FILE-ID TABLE SO THAT FILES MAY BE REMOVED AS NECESSARY. ; ; IF THE YEAR CHANGES THEN YEARLY.CMD IS SPAWNED ; IF THE MONTH CHANGES THEN MONTHLY.CMD IS SPAWNED ; OTHERWISE DAILY.CMD IS SPAWNED ; ; YEARLY HANDLES MONTHLY, WEEKLY, AND DAILY COMMAND FILES ; MONTHLY HANDLES WEEKLY AND DAILY COMMAND FILES ; DAILY HANDLES WEEKLY COMMAND FILE ; ;- .EVEN DAY: ALUN$C TILUN,TI,0 ;ASSIGN LUN FOR TI ALUN$C COLUN,CO,0 ;ASSIGN LUN FOR CONSOLE ALUN$C PTLUN,DV,0 ;ASSIGN LUN FOR POINTER FILE ALUN$C CSLUN,DV,0 ;ASSIGN LUN FOR CASE FILE ALUN$C CPLUN,DV,0 ;ASSIGN LUN FOR CASE POINTER FILE ; ; ASSIGN LUNS TO ALL DEVICES ; MOV PTLTBL,R2 ;GET NUMBER OF TERMINAL PACKETS MOV #PTLTBL+2,R3 ;SET INDEX INTO PACKET POINTER TABLE ; 1$: MOV (R3)+,R1 ;GET ADDRESS OF PACKET ; ALUN$S PPLUN(R1),#"TT,PPTERM(R1) ;ASSIGN LUN FOR PRIMARY TERMINAL BCC 2$ ;ERROR? MOVB $DSW,R0 ;GET DSW IOT ;YES, DIE YOU GRAVY SUCKING PIGS ; 2$: TST PSTERM(R1) ;IS THERE A SECONDARY TERMINAL? BEQ 3$ ;NO - BRANCH ; ALUN$S PSLUN(R1),#"TT,PSTERM(R1) ;ASSIGN LUN NO. TO SECONDARY TERMINAL BCC 3$ ;ERROR? MOVB $DSW,R0 ;GET DSW IOT ;YES, IT'S TIME FOR THE MR. BILL SHOW. ; 3$: SOB R2,1$ ;NEXT PACKET AND LUN(S) ; ; RE-INITIALIZE FILE-ID TABLE ; SO THAT BACKUP MAY BE PERFORMED AS NECESSARY ; MOV #FIDTBL,R1 ;GET ADDR OF FILE ID TABLE MOV #FIDTL/2,R2 ;GET LENGTH OF FILE ID TABLE IN WORDS 4$: CLR (R1)+ ;INITIALIZE FILE ID TABLE SOB R2,4$ ;NEXT WORD? ; ; GET CURRENT TIME ; GTIM$S #TIMBUF ;GET CURRENT TIME ; ; PERFORM DAILY UPDATE FOR EACH AGENCY ; CLR YRFLAG ;ASSUME SAME YEAR MOV #LAGBLK,R5 ;GET NUMBER OF AGENCIES MOV #AGCBLK,R4 ;GET ADDR OF AGENCY BLOCK POINTERS RDEV: MOV #POIEXT,R0 ;GET ADDR OF POINTER FILE EXTENSION MOV (R4),R1 ;GET RAD50 AGENCY NAME CALL $C5TA ;CONVERT TO ASCII ; ; OPEN THE POINTER FILE JUST AS SOON AS POSSIBLE. OPNS$M WILL NOT OPEN ; THE FILE WHEN THERE ARE OTHER OPEN$ MACROS ACTIVE. ; RETRY: OPEN$M #POINTR ;OPEN POINTER FILE SHARED ACCESS BCC RDPT ;SUCCESSFUL? IF YES - BRANCH ; CMPB F.ERR(R0),#-27. ;SOMEBODY ELSE GOT IT OPEN? BEQ CONT ;YES, TRY AGAIN CMPB F.ERR(R0),#-29. ;SOMEBODY WRITING TO IT? BNE PFER ;NO! !@$^#&^! KAMIKAZIIIIIIIII!!!! ; CONT: WSIG$S ;WAIT A LITTLE BIT BR RETRY ; AND TRY AGAIN ; PFER: MOVB F.ERR(R0),R1 ;GET FCS ERROR CODE CLOSE$ #POINTR ;MAKE SURE FILE IS CLOSED IOT ;ABORT FOR ERROR IN OPEN OR READ ; RDPT: READ$ R0 ;READ POINTER FILE BLOCK BCS PFER ;ERROR? WAIT$ R0 ;WAIT ON READ BCS PFER ;ERROR? START: ; ; PERFORM DAILY UPDATE OF HISTORY POINTERS ; TST BLKBUF+HISDAT+2 ;FIRST TIME FOR POINTER FILE? BEQ 3$ ;YES, FIRST DAY OF OPERATIONS CMP TIMBUF+G.TIYR,BLKBUF+HISDAT ;SAME YEAR BEQ 3$ ; INC YRFLAG ;NO ; ; CHANGE OF YEAR ; ; CREATE NEW CASE FILE AND CASE POINTER FILE ; MOV #CASEX,R0 ;GET ADDR OF CASE FILE EXTENSION MOV (R4),R1 ;GET RAD50 AGENCY NAME CALL $C5TA ;CONVERT TO ASCII MOV #CPTEX,R0 ;GET ADDR OF CASE FILE EXTENSION MOV (R4),R1 ;GET RAD50 AGENCY NAME CALL $C5TA ;CONVERT TO ASCII MOV TIMBUF+G.TIYR,R1 ;GET YEAR MOV #CASYR,R0 ;GET ADDR OF CASE FILE YEAR MOV #11012,R2 ;CONVERSION PARAMETER CALL $CBTA ;CONVERT YEAR TO ASCII MOV TIMBUF+G.TIYR,R1 ;GET YEAR MOV #CPTYR,R0 ;GET ADDR OF CASE POINTER FILE YEAR MOV #11012,R2 ;CONVERSION PARAMETER CALL $CBTA ;CONVERT YEAR TO ASCII MOV #<260*400+6>,R1 ;FILE OWNER 260,6 CALL .WFOWN ;SET FILE OWNER OPEN$W #CASENO ;CREATE CASE FILE BCC 2$ 1$: MOVB F.ERR(R0),R1 ;ERROR IOT 2$: CLOSE$ R0 ;CLOSE CASE FILE OPEN$W #CASEPT ;CREATE CASE POINTER FILE BCS 1$ ;ERROR PUT$ R0,#NEWCPT,#LNCPT ;WRITE FIRST RECORD CLOSE$ R0 ;CLOSE CASE POINTER FILE 3$: MOV #LHIST-1,R1 ;GET LENGTH OF HISTORY POINTERS - 1 MOV #BLKBUF+DEHIST+<*4>,R2 ;POINT TO LAST ENTRY FOR EVENT MOV #BLKBUF+DCHIST+<*4>,R3 ;POINT TO LAST ENTRY FOR CASE 4$: MOV -4(R2),(R2) ;MOVE EVENT HISTORY POINTERS DOWN ON LIST MOV -2(R2),2(R2) ; MOV -4(R3),(R3) ;MOVE CASE HISTORY POINTERS DOWN ON LIST MOV -2(R3),2(R3) ; SUB #4,R2 ;NEXT ENTRY SUB #4,R3 ; SOB R1,4$ ;CONTINUE? MOV BLKBUF+EVENT,(R2) ;MOVE IN NEW EVENT POINTER MOV BLKBUF+EVENT+2,2(R2) MOV BLKBUF+CASE,(R3) ;MOVE IN NEW CASE POINTER MOV BLKBUF+CASE+2,2(R3) MOV TIMBUF,BLKBUF+HISDAT ;MOVE IN NEW DATE FOR HISTORY POINTERS MOV TIMBUF+2,BLKBUF+HISDAT+2 MOV TIMBUF+4,BLKBUF+HISDAT+4 ; ; HANDLE MONTHLY POINTERS ALSO ; CMP TIMBUF+G.TIDA,#1 ;FIRST OF THE MONTH? BNE 9$ ;NO MOV #11.,R1 ;YES, GET NUMBER OF MONTHLY POINTERS MOV #BLKBUF+MEHIST+<11.*4.>,R2 ;POINT TO END OF EVENT POINTERS MOV #BLKBUF+MCHIST+<11.*4.>,R3 ;POINT TO END OF CASE POINTERS 5$: MOV -4(R2),(R2) ;MOVE EVENT HISTORY POINTERS DOWN ON LIST MOV -2(R2),2(R2) ; MOV -4(R3),(R3) ;MOVE CASE HISTORY POINTERS DOWN ON LIST MOV -2(R3),2(R3) ; SUB #4,R2 ;NEXT ENTRY SUB #4,R3 ; SOB R1,5$ ;CONTINUE? MOV BLKBUF+EVENT,(R2) ;MOVE IN NEW EVENT POINTER MOV BLKBUF+EVENT+2,2(R2) MOV BLKBUF+CASE,(R3) ;MOVE IN NEW CASE POINTER MOV BLKBUF+CASE+2,2(R3) TST YRFLAG ;CHANGE OF YEAR? BEQ 9$ ;NO ; ; HANDLE CHANGE OF YEAR, RESET CASE AND EVENT NUMBERS TO ONE ; AND REDISPLAY ALL OF THE DISPATCHERS SECONDARY SCREEN EVENT ; AND CASE NUMBER DISPLAYS ; CLR BLKBUF+EVENT ;SET EVENT TO MOV #1,BLKBUF+EVENT+2 ; ONE CLR BLKBUF+CASE ;SET CASE NUMBER MOV #1,BLKBUF+CASE+2 ; TO ONE ; MOV #PTLTBL,R2 ;GET PACKET TABLE ADDR MOV (R2)+,R3 ;GET NUMBER OF PACKETS 6$: MOV (R2)+,R1 ;GET PACKET ADDR CMP PAGNCY(R1),(R4) ;SAME AGENCY? BNE 7$ ;NO, CONTINUE TST PSTERM(R1) ;DISPATCHER POSITION BNE 8$ ;NO 7$: SOB R3,6$ ;CHECK NEXT PACKET IOT ;DID NOT FIND ANY DISPATCHER FOR AGENCY 8$: MOV R1,PKTADR ;YES, SAVE PACKET ADDR MOV R4,R0 ;COPY AGENCY BLOCK POINTER ADD #2,R0 ;POINT TO AGENCY POINTER ; ; THE FOLLOWING INSTRUCTION WAS MISSING FROM THE VERISON OF DAILY ; THAT RAN ON JANUARY 1, 1982. THE LACK THEREOF CAUSED A HELL ; OF ALOT OF GODDAMN PROBLEMS. ; MOV (R0),R0 ;GET AGENCY POINTER ; ; THIS CAUSED THE AGENCY POINTER TO BE WIPED OUT ; AND EVERY PROGRAM THAT REFERENCED THE AGENCY BLOCK ; ABORTED. AND AFTER TALKING TO THE USERS WHO NEVER ; KNOW WHAT'S GOING ON ANYWAYS, AND SPENDING TWO HOURS ; LOOKING OVER MANY PMD LISTINGS, ETC., IT ALL BOILED ; DOWN TO ONE INCY ITTY BITTY LITTLE INSTRUCTION. ; CLR CCASE(R0) ;SET CURRENT CADPAR MOV #1,CCASE+2(R0) ; CASE NUMBER TO ONE CLR CEVENT(R0) ;SET CURRENT CADPAR MOV #1,CEVENT+2(R0) ; EVENT NUMBER TO ONE MOV R4,-(SP) ;SAVE AGENCY POINTER MOV R5,-(SP) ;SAVE AGENCY COUNTER MOV #^RDIS,R0 ;REDISPLAY ALL DISPATCHERS MOV PKTADR,R1 ;GET PACKET ADDR OF DISPATCHER FOR AGENCY CLR R4 ; SECONDARY LINE 25 (CURRENT CASE AND EVENT) CALL DISSTA ; TO SHOW NEW CASE AND EVENT NUMBERS MOV (SP)+,R5 ;RESTORE AGENCY COUNTER MOV (SP)+,R4 ;RESTORE AGENCY POINTER MSCRN #^RALL,,PKTADR,#HAPNY,#LHAPNY,,,,,#^RALL,#^RALL ;TELL EVERYBODY ;HAPPY NEW YEAR!!!! 9$: MOV #POINTR,R0 ;GET POINTER FILE FDB MOV #1,F.BKVB+2(R0) ;WRITE BLOCK NUMBER ONE WRITE$ R0 ;REWRITE POINTER BLOCK BCC 11$ ;ERROR? 10$: MOVB F.ERR(R0),R1 ; IOT ; 11$: WAIT$ R0 ;WAIT ON WRITE BCS 10$ ;ERROR? CLOSE$ #POINTR ;CLOSE POINTER FILE DEC R5 ;NEXT AGENCY? (SOB R5,RDEV) BEQ EXITD ;NO ADD #4,R4 ;YES, POINT TO NEXT AGENCY JMP RDEV ;NEXT AGENCY EXITD: TST YRFLAG ;SAME YEAR? BEQ 1$ ;YES ; ; CHANGE OF YEAR, SPAWN YEARLY.CMD ; SPWN$S #MCR,,,,,,,,#YEARLY,#LYEARLY,#0,#"TT ;SPAWN YEARLY BCC 3$ ;EXIT MOVB $DSW,R0 ;GET DSW IOT ;UH OH! 1$: CMP TIMBUF+G.TIDA,#1 ;FIRST OF THE MONTH? BNE 2$ ;NO ; ; BEGINNING OF THE MONTH, SPAWN MONTHLY.CMD ; SPWN$S #MCR,,,,,,,,#MNTHLY,#LMNTHLY,#0,#"TT ;SPAWN MONTHLY BCC 3$ ;EXIT MOVB $DSW,R0 ;GET DSW IOT ;UH OH! ; ; CHANGE OF DAY, SPAWN DAILY.CMD ; 2$: SPWN$S #MCR,,,,,,,,#DAILY,#LDAILY,#0,#"TT ;SPAWN DAILY BCC 3$ ;EXIT MOVB $DSW,R0 ;GET DSW IOT ;UH OH! 3$: EXIT$S ;EXIT .END DAY