.TITLE SRDINI .IDENT /V5.1/ ; UPDATE AUDIT CONTROL-14 NOV 1979 10:45:28 ;**V5.1 ; EDIT # 0046 24 Mar 1981 16:25:38 DR0:[300,57]SRDINI.MAC;70 ; PREVIOUS EDIT 20 Mar 1981 9:24:14 DR0:[300,57]SRDINI.MAC;67 ;****** MODIFIED BY RAY VAN TASSLE 6 DEC 1978 ;**-3 ; BEECAUSE IT WAS CALCULATING TOP WRONG IN D ;+ ; ;**SRD--SORT DIRECTORY ; ; TASK INITIALIZATION PHASE ; ; ; THIS TASK WILL SORT A RSX11 DIRECTORY ;THEN CREATE A LISTING WITH MANY SELECTION OPTIONS ; ;THIS IS THE MAIN ROUTINE, AND IS PURE. ; ; ;- ; ;SYSTEM MACRO CALLS ; .MCALL CSI$1,CSI$2,DIR$,EXIT$S,GCMLD$,GCML$,FHDOF$ .MCALL GPRT$S,GTIM$S,WTSE$S,CSI$SW,CSI$SV,CSI$ND,NMBLK$ .MCALL ALUN$S,GLUN$S,GTSK$S FHDOF$ DEF$L ;DEFINE FILE HEADER ; STRING: .ASCII /SY:/ .EVEN SWTABL: CSI$SW NA,NASW,SWMSK$,SET,NEG CSI$SW NE,NESW,SWMSK$,SET,NEG CSI$SW SP,SPSW,SWMSK$,SET,NEG CSI$SW BE,BESW,SWMSK$,SET,NEG,BEDVAL CSI$SW AF,AFSW,SWMSK$,SET,NEG,AFDVAL CSI$SW SE,SESW,SWMSK$,SET,,SEVAL CSI$SW SD,SDSW,SWMSK$,SET,NEG CSI$SW MI,MISW,SWMSK$,SET,NEG CSI$SW WB,WBSW,SWMSK$,SET,NEG CSI$SW SV,SVSW,SWMSK$,SET,NEG,SVVAL CSI$SW LI,LISW,SWMSK$,SET,NEG,FUVAL CSI$SW DE,DESW,SWMSK$,SET,NEG CSI$SW DA,DASW,SWMSK$,SET,NEG,DAVAL CSI$SW FU,FUSW,SWMSK$,SET,NEG,FUVAL CSI$SW RD,RDSW,SWMS1$,SET,NEG CSI$SW SR,SRSW,SWMS1$,SET,NEG CSI$SW SY,SYSW,SWMS1$,SET,NEG CSI$SW FO,FOSW,SWMS1$,SET,NEG,FOVAL CSI$SW NH,NHSW,SWMS1$,SET,NEG CSI$ND SEVAL: CSI$SV ASCII,SEBUF$,16. CSI$ND FUVAL: CSI$SV DECIMAL,LINSZ$,2 CSI$ND DAVAL: CSI$SV ASCII,DABUF$,9. CSI$ND BEDVAL: CSI$SV ASCII,BEBUF$,11. CSI$ND AFDVAL: CSI$SV ASCII,AFBUF$,11. CSI$ND SVVAL: CSI$SV OCTAL,SVNUM$,2 CSI$ND FOVAL: CSI$SV OCTAL,FOSGRP,1 CSI$SV OCTAL,FOSMEM,1 CSI$ND DFNB: NMBLK$ 200200,DIR,1,SY,0 PARBF$: .BLKW 16. .PAGE SRDINI:: MOV $XX1,DIRBF$ ; FIGURE OUT LOWEST AVAIL LOCATION CMP DIRBF$,$XX2 BHI 44$ MOV $XX2,DIRBF$ 44$: CMP DIRBF$,$XX3 BHI 45$ MOV $XX3,DIRBF$ 45$: ADD #3,DIRBF$ ; ROUND UP TO NEXT 4-BYTE BOUNDARY BIC #3,DIRBF$ GTSK$S #PARBF$ ;++001 GET TOP OF TASK MOV PARBF$+G.TSTS,R0 ;++001 CALC. LENGTH CMP PARBF$+G.TSSY,#1 ; 1 = M BNE 50$ ; SKIP OVER NEXT SECTION IF D OR IAS ;;; THIS SECTION IS FOR 11M ONLY GPRT$S ,#PARBF$ ;FIND SIZE OF PARTITION MOV PARBF$+2,R0 ;PICK UP SIZE OF PAR/100(OCTAL) SWAB R0 ;THIS ROUTINE ASRB R0 ;CONVERTS THAT SIZE ROR R0 ;INTO SIZE OF PARTITION ROR R0 ;IN BYTES ADD $DSW,R0 ;ADD IN BASE OF PARTITION ;;; THIS SECTION IS FOR 11M ONLY 50$: MOV R0,DIRBE$ ;SAVE END OF DIRECTORY BUFFER LOOP: CLR NUMFS ; TO COUNT # OF FILES CLR NUMFT CLR TBLKU ; CLEAR BLOCK COUNTS CLR TBLKU+2 CLR TBLKA CLR TBLKA+2 CLR GNUMFS ; CLEAR GRAND TOTALS CLR GNUMFT CLR GTBLKU CLR GTBLKU+2 CLR GTBLKA CLR GTBLKA+2 CLR FOSGRP CLR FOSMEM MOV #LISW,SWMSK$ ;INIT SWITCHES MOV #RDSW!SRSW,SWMS1$ CMPB #011,PARBF$+G.TSGC ; DEF GROUP < 11, ASSUME /SY BHIS 1$ BIS #SYSW,SWMS1$ 1$: CLR LINSZ$ ;ZERO LINE SIZE SW VALUE CLR NXUIC$ ; MOV #-1,BEVAL$ ;ZERO RESIDUAL DATE CLR AFVAL$ ;ZERO RESIDUAL DATE GCML$ #CMDBLK ;GET COMMAND LINE BCC CMDOK ;BR=AOK CMPB #GE.EOF,G.ERR(R0) ;LOOK FOR END-OF-FILE BEQ 5$ ;BR IF EXPECTED ERROR FERR GCME ;ELSE LOG ERR 5$: EXIT$S ;THEN LEAVE ; ; COMMAND ERROR ; CS1ERR: FERR CS1E CS2IER: FERR CS2I CS2OER: FERR CS2O PARSER: FERR PRSE ; ; CMDOK: MOV G.CMLD+2(R0),R1 ;COMMAND START MOV G.CMLD(R0),R2 ;AND LENGTH BNE 20$ ;BR IF COMMAND THERE MOV #STRING,R1 ;SET DEFAULT COMMAND MOV #3,R2 ;LENGTH 20$: CSI$1 #CSIBLK,R1,R2 ;CK SYNTAX BCS CS1ERR ;BR IF BAD MOV #SWTABL,C.SWAD(R0) ;SET SWITCH TABLE ADDRESS MOVB #CS.OUT,(R0) ;ASSUME THAT OUTPUT IS ALL THAT WAS GIVEN MOV #LSTDFN,R3 ;GET DEFAULT NAME BLOCK FOR LISTING CLR R2 ;ASSUME NO NAME FOR OUTPUT IN STRING MOV #"TI,N.DVNM(R3) ;ASSUME THAT THE "TI:" IS WHERE IT GOES BIT #CS.EQU*400,(R0) ;WAS AN "=" GIVEN? BEQ 30$ ;BR IF NO-ASSUMPTIONS WERE CORRECT MOV #"SY,N.DVNM(R3) ;NAME GIVEN-CHANGE DEFAULT TO "SY0:" CALL .CSI2 ;PARSE REAL OUTPUT NAME BCS CS2OER ;OUTPUT SPEC ERROR MOVB #CS.INP,(R0) ;SET UP TO DO INPUT NEXT MOV #,R2 ;GET DATA-SET-DESCRITOR ADDRESS BIS #OUTFSW,SWMS1$ ; SET FLAG 30$: MOV #LSTFDB,R0 ;SET FILE-DESCRIPTOR-BLOCK MOV #,R1 ;AND FILE-NAME-BLOCK FOR PARSE CALL .PARSE ;---AND PARSE IT! BCS PARSER ;BR IF FAILED CALL .OPFNB ;OPEN THE FILE BCC 40$ ;BR IF A-OK FERR OPNO ;FATAL OPEN ON OUTPUT FILE 40$: BITB #FD.REC,F.RCTL(R0) ;RECORD DEVICE? BEQ 50$ ;BR IF NO JSR R0,ATTDET ;TRY TO ATTACH .WORD IO.ATT 50$: MOV #CSIBLK,R0 ;SET CSI BLOCK CALL .CSI2 ;GET COMMAND FOR UFD TO SORT BCS CS2IER ;INPUT SPEC ERROR BITB #CS.MOR,C.STAT(R0) ;02 CHECK FOR INVALID SYNTAX ;**V5.1 BNE CS1ERR ;BR IF THERE ;**V5.1 BIT #SESW,SWMSK$ ;02 WAS SELECT SPECITIED ;**V5.1 BNE SETUP ;02 BR IF YES-NO IMPLIED SELECT ;**V5.1 BITB #CS.NMF,C.STAT(R0) ;02 WAS A NAME FIELD SPECFIED? ;**V5.1 BEQ SETUP ;02 BR IF NO-NO IMPLIED SELECT FIELD ;**V5.1 BIS #SESW,SWMSK$ ;02 YES-SE SELECT SW FLAG ;**V5.1 MOV C.FILD+2(R0),R1 ;02 GET STRING ADDRESS ;**V5.1 MOV C.FILD(R0),R0 ;02 NOW LENGTH ;**V5.1 CLR C.FILD+CSIBLK ;02 DONT LET PARSE SEE NAME ;**V5.1 MOV #SEBUF$,R2 ;02 STRING BUFFER ADDRESS ;**V5.1 60$: MOVB (R1)+,(R2)+ ;02 COPY A BYTE ;**V5.1 DEC R0 ;02 MOVE ENTIRE STRING? ;**V5.1 BLE 70$ ;02 BR IF YES ;**V5.1 CMP R2,#SEBUF$+19. ;02 RUN OUT OF SPACE? ;**V5.1 BLO 60$ ;02 IF NO-LOOP AGAIN ;**V5.1 70$: CLRB (R2) ;02 SET SENTENAL FOR STRING END ;**V5.1 SETUP: BIT #SESW,SWMSK$ ;DOING SELECTIVE SEARCH ? ;**V5.1 BEQ 2$ ;NO. ;**-4 MOV #SEBUF$,R0 ;GET ADDRESS OF BUFFER CONTAINING TEMPLATE 1$: TSTB (R0)+ ;FOUND TERMINATING NULL ? BNE 1$ ;NO - TRY NEXT BYTE MOVB #';,-(R0) ;YES - REPLACE WITH A SEMICOLON. CMP #SEBUF$,R0 ; SELECT NOTHING = SELECT EVERYTHING ; MATCH ALL TRAILING CHARACTERS MOVB #'*,(R0)+ MOVB #';,(R0) 2$: MOV #LINSZ$,R0 ;POINT AT LINE SIZE SW VALUE TST (R0) ;DID USER SPECIFY VALUE? BNE 5$ ;BR IF YES! MOV LSTFDB+F.BBFS,(R0) ;SET DEVICE BUFFER SIZE FOR LINE SIZE 5$: CMP (R0),#72. ;CK LINE SIZE AGAINST MIN BHIS 10$ ;BR IF SIZE OK MOV #72.,(R0) ;SET ACCEPTABLE VALUE 10$: CMP (R0),#132. ;NOW CK AGAINST MAX BLOS 20$ ;BR IF OK MOV #132.,(R0) ;SET ACCEPTABLE LINE SIZE 20$: LST1: MOV #DATIM$,R0 ;POINT AT DATE BUFFER MOV #HDBUF$,R1 ;SCRATCH AREA GTIM$S R1 ;FIND THE TIME CALL $DAT ;CONVERT DATE TO NORMAL FORM MOVB #40,(R0)+ ;SEPARATE DATE AND TIME MOV #3,R2 ;SET TO CONVERT HR,MIN,SEC CALL $TIM ;AND CONVERT THE TIME BIT #DASW,SWMSK$ ;DATE SELECT BEQ 30$ ;BR IF NO MOV #DABUF$,R1 ;SET TO POINT AT SW BUFFER TSTB (R1) ;ANY DATE SUPPLIED? BNE 20$ ;BR IF YES-USE USER SUPPLIED DATE MOV #DATIM$,R1 ;IF NON SUPPLIED-USE TODAY! CMPB (R1),#040 BNE 20$ INC R1 20$: CALL CNVDAT ;CHANGE TO INTEGER FORMAT MOV R2,BEVAL$ ;SAVE TARGET DATE MATCH MOV R2,AFVAL$ ;SAVE TARGET DATE MATCH BNE 40$ 22$: FERR BADD ; BAD DATE FORMAT ; ; CHECK FOR BEFORE & AFTER DATES 30$: BIT #BESW,SWMSK$ BEQ 35$ ; NO BEFORE DATE BIS #DASW,SWMSK$ ; SET DATE SELECT SWITCH MOV #BEBUF$,R1 ; CONVERT THE GIVEN DATE CALL CNVDAT MOV R2,BEVAL$ BEQ 22$ SUB R0,BEVAL$ 35$: BIT #AFSW,SWMSK$ BEQ 40$ ; NO AFTER DATE BIS #DASW,SWMSK$ ; SET DATE SELECT SWITCH MOV #AFBUF$,R1 ; CONVERT THE GIVEN DATE CALL CNVDAT MOV R2,AFVAL$ BEQ 22$ ADD R0,AFVAL$ 40$: MOV SWMSK$,R1 ; WE DON'T NEED TO SORT IF THESE ARE OFF BIC #^C,R1 BNE 42$ BIC #SRSW,SWMS1$ 42$: BITB #CS.WLD,C.STAT+CSIBLK ;ANY WILD CARDS AROUND HERE? BEQ OPN1 ;BR IF NO! MOV C.DIRD+2+CSIBLK,R3 ;02 GET ADDRESS OF DIRECTORY STRING ;**V5.1 MOV C.DIRD+CSIBLK,R0 ;02 NOW LENGTH ;**V5.1 BEQ OPN1 ;02 BR IF NO DIRECTORY STRING ;**V5.1 48$: DEC R0 ;02 COUNT DOWN NUMBER CHARS TO SCAN ;**V5.1 BMI OPN1 ;02 BR IF DIDN'T FIND WILD CARD FLAG ;**V5.1 CMPB (R3)+,#'* ;02 IS THAT A WILD CARD FLAG? ;**V5.1 BNE 48$ ;02 BR IF NO ;**V5.1 INC NXUIC$ ;SET UIC TO START AT 1 MOV C.DIRD+2+CSIBLK,R3 ;POINT AT DIRECTORY DESC. CLR WCGRP$ ;ASSUME WILD GROUP INC R3 ;SKIP [ CMPB #'*,(R3)+ ;IS IT WILD? BEQ 70$ ;BR IF YES 60$: CMPB #',,(R3)+ ;LOOK FOR END OF NUMBER BNE 60$ ;BR IF NOT FOUND MOV R3,R1 ;COPY START OF USER NUMBER DEC R1 ;BACK UP TO COMMA MOV #'[,R2 ;SET OTHER END OF FIELD CALL GETUIC ;CONVERT TO RAD50 MOV R1,WCGRP$ ;SAVE SELECTED GROUP CMP #011,R1 ; SELECTED GROUP < 011, ASSUME /SY BHIS 70$ BIS #SYSW,SWMS1$ 70$: CMPB #'],(R3)+ ;LOOK FOR END OF USER NUMBER BNE 70$ ;BR IF NOT FOUND CLR WCUSR$ ;ASSUME WILD CARD USER MOV R3,R1 ;COPY PLACE IN STRING CMPB -(R1),-(R1) ;BACK UP TO LAST DIGIT IN NUMBER CMPB #'*,(R1)+ ;IS IT WILD BEQ 80$ ;BR IF YES MOV #<',>,R2 ;SET END OF FIELD CALL GETUIC ;CONV TO RAD50 FORM MOV R1,WCUSR$ ;SAVE THAT CODE 80$: MOV #LSTNX$,(SP) ;SET RETURN ADDRESS OPN1: MOV #UFDFDB,R0 ;GET FDB MOV #,R1 ;FILE NAME BLOCK MOV #,R2 ;DATA SET DESCRIPTOR MOV #DFNB,R3 ;DEFAULT NAME BLOCK TST NXUIC$ ;WILD CARD OPERATION ? BEQ 10$ ;NO CALL .PRSDV ;YES, JUST PARSE DEVICE PART BCC INIEX ;EXIT IF OK FERR PRSE ;ELSE COMPLAIN 10$: CALL .PARSE ; BCC SRTDIR ;BR IF OK FERR DIRF ;DIRECTORY FIND ERR ; SRTDIR: ; ; DIRECTORY FIND WAS SUCCESSFUL ; MOV F.FNB+N.DID(R0),SAVDID ;SAVE DIRECTORY ID MOV F.FNB+N.DID+2(R0),SAVDID+2 MOV F.FNB+N.DVNM(R0),SAVDVN ;---AND DEVICE NAME MOV F.FNB+N.UNIT(R0),SAVUNM ;ALSO UNIT NUMBER MOV N.DID(R1),N.FID(R1) ;COPY DIRECTORY I.D. CLR N.DID(R1) ;REMOVE DIRECTORY ID MOV N.DID+2(R1),N.FID+2(R1) ;TO FILE ID SPACE MOV N.DID+4(R1),N.FID+4(R1) ;JUST FOR "GRINS", THIS TOO! MOVB #FO.RD!FA.SHR,F.FACC(R0) ;ASSUME ONLY READ ACCESS TSTB SWMSK$ ;DOES HE WANT IT WRITTEN BACK? BPL 5$ ;BR IF NO MOVB #FO.MFY,F.FACC(R0) ;REQUEST ACCESS OF FILE FOR MODIFY 5$: MOV #SAVDID,READHD+Q.IOPL ;SET DIRECTORY ID FOR HEADER READ ALUN$S #HDRLUN,SAVDVN,SAVUNM DIR$ #READHD ;REQUEST THE READ BCC 20$ ;BR IF AOK CALL $ALERR ;DIAGNOS ERR BR 5$ ;RETRY IF THAT IS POSIBLE 20$: WTSE$S #EFN1 ;WAIT FOR THAT TO STOP MOVB HDBUF$+1,R1 ;GET OFFSET TO IDENT AREA ADD #I.FNAM,R1 ;POINT AT FILE NAME ADD #HDBUF$,R1 ;ADD IN OFFSET FOR BUFFER MOV (R1)+,F.FNAM(R0) ;SET TOP 1/2 OF DIRECTORY NAME MOV (R1),F.FNAM+2(R0) ;-AND BOTTOM 1/2 RETURN INIEX: MOV F.FNB+N.DVNM(R0),SAVDVN ; SAVE DEVICE NAME MOV F.FNB+N.UNIT(R0),SAVUNM ;ALSO UNIT NUMBER ALUN$S #HDRLUN,SAVDVN,SAVUNM RETURN ; ;GETUIC---LOCAL SUBROUTINE TO CONVERT A 1 TO 3 BYTE NUMERIC STRING ; INTO 3 RADIX 50 CHAR FORMAT CONSISTANT WITH DIRECTORY NAMES GETUIC: MOV #UICS$,R0 ;POINT AT 4 BYTE STRING BUFFER MOV #"00,(R0)+ ;ASSUME LEADING ZEROS NEEDED CLRB (R0)+ ;ADVANCE PONTER 10$: CMPB -(R1),R2 ;IS THIS TERMINAL CHAR? BEQ 20$ ;BR IF YES MOVB (R1),-(R0) ;NO-SET DATA INTO STRING BR 10$ ;TRY AGAIN 20$: MOV #UICS$,R0 ;RESET POINTER CALL $CAT5 ;CONVERT TO RAD50 RETURN .END