.TITLE SRDINI .IDENT /V5.1/ ; UPDATE AUDIT CONTROL-14 NOV 1979 10:45:28 ;**V5.1 ; EDIT # 0041 5 Dec 1979 9:40:54 DR1:[300,3]SRDINI.MAC;63 ; PREVIOUS EDIT 5 Dec 1979 9:33:56 DR1:[300,3]SRDINI.MAC;62 ;****** MODIFIED BY RAY VAN TASSLE 6 DEC 1978 ;**-3 ; BEECAUSE IT WAS CALCULATING TOP WRONG IN D ;**V5.0 ;+ ; ;**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$ ;**V5.0 .MCALL ALUN$S,GLUN$S,GTSK$S ;**V5.0 ;**V5.0 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 ;**V5.0 CSI$SW AF,AFSW,SWMSK$,SET,NEG,AFDVAL ;**V5.0 CSI$SW SE,SESW,SWMSK$,SET,,SEVAL ;**V5.0 CSI$SW SD,SESW!SDSW,SWMSK$,SET,NEG,SEVAL ;**V5.0 CSI$SW MI,MISW,SWMSK$,SET,NEG ;**V5.0 CSI$SW WB,WBSW,SWMSK$,SET,NEG ;**V5.0 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 ;**V5.0 CSI$SW SR,SRSW,SWMS1$,SET,NEG ;**V5.0 CSI$SW SY,SYSW,SWMS1$,SET,NEG ;**V5.0 CSI$ND ;**V5.0 ;**V5.0 CSI$SV ASCII,SEBUF$,16.,SEVAL ;**V5.0 CSI$SV DECIMAL,LINSZ$,2,FUVAL ;**V5.0 CSI$SV ASCII,DABUF$,9.,DAVAL ;**V5.0 CSI$SV ASCII,BEBUF$,11.,BEDVAL ;**V5.0 CSI$SV ASCII,AFBUF$,11.,AFDVAL ;**V5.0 CSI$SV OCTAL,SVNUM$,2,SVVAL ;**V5.0 CSI$ND ;**V5.0 DFNB: NMBLK$ 200200,DIR,1,SY,0 ;**V5.0 ;**V5.0 ;**V5.0 PARBF$: .BLKW 16. ;**V5.0 .PAGE ;**V5.0 SRDINI:: ;**V5.0 MOV $XX1,DIRBF$ ; FIGURE OUT LOWEST AVAIL LOCATION ;**V5.0 CMP DIRBF$,$XX2 ;**V5.0 BHI 44$ ;**V5.0 MOV $XX2,DIRBF$ ;**V5.0 44$: CMP DIRBF$,$XX3 ;**V5.0 BHI 45$ ;**V5.0 MOV $XX3,DIRBF$ ;**V5.0 45$: ADD #3,DIRBF$ ; ROUND UP TO NEXT 4-BYTE BOUNDARY ;**V5.0 BIC #3,DIRBF$ ;**V5.0 GTSK$S #PARBF$ ;++001 GET TOP OF TASK ;**V5.0 MOV PARBF$+G.TSTS,R0 ;++001 CALC. LENGTH ;**V5.0 CMP PARBF$+G.TSSY,#1 ; 1 = M ;**V5.0 BNE 50$ ; SKIP OVER NEXT SECTION IF D OR IAS ;**V5.0 ;**V5.0 ;;; THIS SECTION IS FOR 11M ONLY ;**V5.0 GPRT$S ,#PARBF$ ;FIND SIZE OF PARTITION ;**V5.0 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 ;**V5.0 ;**V5.0 ;**V5.0 50$: MOV R0,DIRBE$ ;SAVE END OF DIRECTORY BUFFER ;**V5.0 LOOP: ;**V5.0 CLR NUMFS ; TO COUNT # OF FILES ;**V5.0 CLR NUMFT ;**V5.0 CLR TBLKU ; CLEAR BLOCK COUNTS ;**V5.0 CLR TBLKU+2 ;**V5.0 CLR TBLKA ;**V5.0 CLR TBLKA+2 ;**V5.0 MOV #LISW!NASW,SWMSK$ ;INIT SWITCHES ;**V5.0 MOV #RDSW!SRSW,SWMS1$ ;**V5.0 CLR LINSZ$ ;ZERO LINE SIZE SW VALUE ;**V5.0 CLR NXUIC$ ; ;**V5.0 MOV #-1,BEVAL$ ;ZERO RESIDUAL DATE ;**V5.0 CLR AFVAL$ ;ZERO RESIDUAL DATE ;**V5.0 ;**V5.0 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 ;**V5.0 BIT #CS.EQU*400,(R0) ;WAS AN "=" GIVEN? ;**V5.0 BEQ 30$ ;BR IF NO-ASSUMPTIONS WERE CORRECT ;**V5.0 ;**V5.0 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 ;**V5.0 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 ;**V5.0 CALL .CSI2 ;GET COMMAND FOR UFD TO SORT ;**V5.0 BCS CS2IER ;INPUT SPEC ERROR ;**V5.0 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 ;**V5.0 BNE 2$ ;**V5.0 MOV #"*;,(R0) ;**V5.0 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 ;**V5.0 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 ;**V5.0 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 ;**V5.0 MOV R2,AFVAL$ ;SAVE TARGET DATE MATCH ;**V5.0 BNE 40$ ;**V5.0 22$: FERR BADD ; BAD DATE FORMAT ;**V5.0 ; ;**V5.0 ; CHECK FOR BEFORE & AFTER DATES ;**V5.0 30$: BIT #BESW,SWMSK$ ;**V5.0 BEQ 35$ ; NO BEFORE DATE ;**V5.0 ;**V5.0 BIS #DASW,SWMSK$ ; SET DATE SELECT SWITCH ;**V5.0 MOV #BEBUF$,R1 ; CONVERT THE GIVEN DATE ;**V5.0 CALL CNVDAT ;**V5.0 MOV R2,BEVAL$ ;**V5.0 BEQ 22$ ;**V5.0 SUB R0,BEVAL$ ;**V5.0 ;**V5.0 35$: BIT #AFSW,SWMSK$ ;**V5.0 BEQ 40$ ; NO AFTER DATE ;**V5.0 ;**V5.0 BIS #DASW,SWMSK$ ; SET DATE SELECT SWITCH ;**V5.0 MOV #AFBUF$,R1 ; CONVERT THE GIVEN DATE ;**V5.0 CALL CNVDAT ;**V5.0 MOV R2,AFVAL$ ;**V5.0 BEQ 22$ ;**V5.0 ADD R0,AFVAL$ ;**V5.0 ;**V5.0 40$: MOV SWMSK$,R1 ; WE DON'T NEED TO SORT IF THESE ARE OFF ;**V5.0 BIC #^C,R1 ;**V5.0 BNE 42$ ;**V5.0 BIC #SRSW,SWMS1$ ;**V5.0 ;**V5.0 42$: BITB #CS.WLD,C.STAT+CSIBLK ;ANY WILD CARDS AROUND HERE? ;**V5.0 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 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 ;**V5.0 10$: CALL .PARSE ; ;**V5.0 BCC SRTDIR ;BR IF OK ;**V5.0 FERR DIRF ;DIRECTORY FIND ERR ;**V5.0 ; 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 ;**V5.0 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 ;**V5.0 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 ;**V5.0 MOV (R1)+,F.FNAM(R0) ;SET TOP 1/2 OF DIRECTORY NAME ;**V5.0 MOV (R1),F.FNAM+2(R0) ;-AND BOTTOM 1/2 ;**V5.0 RETURN ;**V5.0 ;**V5.0 ;**V5.0 ;**V5.0 INIEX: MOV F.FNB+N.DVNM(R0),SAVDVN ; SAVE DEVICE NAME ;**V5.0 MOV F.FNB+N.UNIT(R0),SAVUNM ;ALSO UNIT NUMBER ;**V5.0 ALUN$S #HDRLUN,SAVDVN,SAVUNM ;**V5.0 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