.TITLE SRDINI .IDENT /V2.1/ ;15-JUN-76 ;**NEW** ;**-1 ;+ ; ;**SRD--SORT DIRECTORY ; ; TASK INITIALIZATION PHASE ; ; ; THIS TASK WILL SORT A RSX11M 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$,GTIM$S,WTSE$S,CSI$SW,CSI$SV,CSI$ND,NMBLK$ .MCALL GTSK$ FHDOF$ DEF$L ;DEFINE FILE HEADER ; .IF DF IAS GETTSK: GTSK$ TSKBF$ ;IAS GET TASK DIRECTIVE FOR SIZE ;+++001 .IFF GETPAR: GPRT$ ,PARBF$ ;RSX11M GET PARTITION DIR. " " ;+++001 .ENDC STRING: .ASCII /SY:/ .EVEN TERMRS: .ASCII \.;\ ;FILE-NAME FIELD TERMINATORS SWTABL: CSI$SW NA,NASW,SWMSK$,SET,NEG CSI$SW HV,HVSW,SWMSK$,SET,NEG,HVVAL CSI$SW NE,NESW,SWMSK$,SET,NEG CSI$SW BE,BESW!DASW,SWMSK$,SET,NEG,DAVAL CSI$SW AF,AFSW!DASW,SWMSK$,SET,NEG,DAVAL CSI$SW SE,SESW,SWMSK$,SET,,SEVAL CSI$SW SD,SESW!SDSW,SWMSK$,SET,NEG,SEVAL CSI$SW WB,WBSW,SWMSK$,SET,NEG CSI$SW SV,SVSW,SWMSK$,SET,NEG 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$ND CSI$SV ASCII,SEBUF$,16.,SEVAL CSI$SV DECIMAL,LINSZ$,2,FUVAL CSI$SV ASCII,DABUF$,9.,DAVAL CSI$SV OCTAL,LVNUM$,2,HVVAL CSI$ND DFNB: NMBLK$ 200200,DIR,1,SY,0 SRDINI:: .IF DF IAS DIR$ #GETTSK ;GET TASK PARAMETERS MOV TSKBF$+<2*15>,DIRBE$ ;AND SAVE TOP OF TASK .IFF DIR$ #GETPAR ;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 MOV R0,DIRBE$ ;SAVE END OF DIRECTORY BUFFER .ENDC LOOP: MOV #LISW,SWMSK$ ;INIT SWITCHES CLR LINSZ$ ;ZERO LINE SIZE SW VALUE CLR NXUIC$ ;ASSUME NO WILD CARD UIC'S CLR DABUF$ ;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 CMDERR: FERR GCME 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 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 #,C.STAT(R0) ;LOOK FOR BAD THINGS BNE CMDERR ;BR IF THERE SETUP: 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 10$: MOVB #40,(R0)+ ;SEPARATE DATEAND TIME BIT #1,R0 ;SET ON EVEN WORD BOUNDRY BNE 10$ ;BR IF NO-MAKE IT EVEN MOV #2,R2 ;SET TO CONVERT HR,MIN 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 TST (R1) ;ANY DATE SUPPLIED? BNE 20$ ;BR IF YES-USE USER SUPPLIED DATE MOV #DATIM$,R1 ;IF NON SUPPLIED-USE TODAY! 20$: CALL CNVDAT ;CHANGE TO INTEGER FORMAT MOV R2,DABUF$ ;SAVE TARGET DATE MATCH 30$: BITB #CS.WLD,C.STAT+CSIBLK ;ANY WILD CARDS AROUND HERE? BEQ OPN1 ;BR IF NO! 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 ;**-1 MOV #,R1 ;FILE NAME BLOCK MOV #,R2 ;DATA SET DESCRIPTOR MOV #DFNB,R3 ;DEFAULT NAME BLOCK TST NXUIC$ ;DOING WILD CARD OPERATION? ;**NEW** BEQ 10$ ;BR IF NO ;**NEW** CALL .PRSDV ;PARSE DEVICE ONLY ;**NEW** BCC INIEX ;EXIT INIT IF OK ;**NEW** FERR PRSE ;INDICATE ERROR ;**NEW** 10$: ;**NEW** CALL .PARSE ; BCC SRTDIR ;BR IF OK ; FERR DIRF ;DIRECRORY 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,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 ; ; THE FOLLOWING IS AN EXAMPLE OF SHOTGUN DEBUGGING ; "IT WAS ZERO THE FIRST TIME AND IT WORKED, ; SO ZERO IT AGAIN, SAM!" ; SORRY BUT JUST TERMINATE THE ATTRIBUTE LIST!! ; ; CLR HDBUF$ ;?ZERO THIS WORD SO READ WILL HAPPEN?;+++001 ; 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 OFFSER FOR BUFFER MOV (R1)+,F.FNAM(R0) ;SET TOP 1/2 OF DIRECTORY NAME MOV (R1),F.FNAM+2(R0) ;-AND BOTTOM 1/2 INIEX: ;INITIALIZER EXIT POINT ;**NEW** 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